логотип сайта MyLittleServices.ru

fate.js

Библиотека JavaScript

Вообще-то я просто делал очередной сервис, и уже в процессе решил, что функции, мною написанные, не только полезны, но и посвящены одной определенной теме: работе с датой. Решил соорудить библиотеку. Далекую от идеала, конечно, но на мой вкус вполне рабочую. Есть тут многое, см. ниже.

Массив с русскими названиями месяцев в именительном падеже:
fate.months_nominative_ru[0] // январь

Массив с русскими названиями месяцев в родительном падеже:
fate.months_genitive_ru[7] // августа

Массив с русскими названиями дней недели в именительном падеже:
fate.dotw_ru[0] // воскресенье
JavaScript начинает счет от 0, как и многие другие языки. Месяцы следуют по-человечески, с января по декабрь (их номера с 0 по 11). Дни недели начинаются с воскресенья, ибо грех было не воспользоваться возможностью получить нормальный порядок, где понедельник - это 1.

Функция, преобразующая дату в формате ДД.ММ.??ГГ в машиночитаемый вид (YYYY-MM-DD):
fate.get_mr_date("01.12.84") // 1984-12-01
Если в годе две цифры - функция дополнит текущим веком (если цифры соответствуют текущему году или более раннему) либо прошлым (если число больше, чем текущий год).

Функция для вывода полной записи времени на русском языке с правильными окончаниями:
fate.get_ru_time(11, "hours") + " " + fate.get_ru_time(54, "minutes") + " " + fate.get_ru_time(23, "seconds") + " " + fate.get_ru_time(777, "milliseconds"); // 11 часов 54 минуты 23 секунды 777 миллисекунд Можно передать true третьим аргументом, и получить только лишь единицы измерения, без значений.

Функция эта возвращет текущую полную дату в машиночитаемом (YYYY-MM-DDThh:mm:ss.sss) виде:
fate.get_mr_now() // 2019-06-29T18:03:19.913

Функция, возвращающая полную запись для компонентов даты с нулями, если нужно:
fate.get_full_date_component(11, true) // 011
Второй аргумент нужен для работы с миллисекундами (только в этом случае нужно возможно трехзначное число), иначе указывать не нужно.

Функция, возвращающая разницу в днях между двумя датами:
fate.get_date_diff(new Date(2018, 0, 1), new Date(2018, 11, 31)) // 364
fate.get_date_diff(new Date(1981, 0, 31), new Date(2020, 0, 32), "years") // 39
Нужно иметь в виду, что тут дата ожидается обычная для JavaScript (то есть количество миллисекунд, прошедших с 1 января 1970 год). Третьим аргументом можно передать тип возвращаемых данных: дни или годы ("days" или "years"; "days" - умолчальное значение, так что если нужны дни - его можно опустить).

Простая функция, возвращающая true, если год високосный, и false, если год обычный:
fate.is_leap(1988) // true

Функция, превращающая отрезок времени в часы, минуты, секунды и (опционально) миллисекунды:
fate.date2time(new Date(2019, 0, 1, 11, 22, 2, 55) - new Date(2018, 0, 1, 1, 44, 77)) // 8769 часов 36 минут 45 секунд 55 миллисекунд
fate.date2time(31570605055, true, true) // 8769:36:45
Ожидаются миллисекунды, так что можно просто передать дату JavaScript. Интереснее, конечно, посчитать время в отрезке длиннее суток. По умолчанию возвращается человеколюбивая строка на русском языке. Если хочется время в формате hh:mm:ss.sss - можно передать true вторым параметром. Если не нужны миллисекунды - можно передать true третьим параметром.

Очень простая функция, возвращающая дату JavaScript, соответствующую началу года:
fate.get_year_beginning(2019) // Tue Jan 01 2019 00:00:00 GMT+0300 (Москва, стандартное время)

Аналогичная предыдущей функция, возвращающая дату JavaScript, соответствующую концу года:
fate.get_year_ending(2018) // Tue Jan 01 2019 00:00:00 GMT+0300 (Москва, стандартное время)

Непростая функция, возвращающая количество полных недель в году:
fate.get_full_weeks(2020) // 51
Если год начинается со вторника - неделя не учитывается. Если год кончается субботой - неделя не учитывается. Считаюстя только недели, полностью входящие в год.

Простенькая функция, возвращающая время года на русском языке:
fate.get_ru_season(3, true) // весны
Ожидает месяц в обычном для JavaScript виде - то есть число с 0 по 11. Если нужен родительный падеж - можно передать true вторым параметром.

Функция, возвращающая квартал:
fate.get_quarter(8) // 3
Ожидает месяц в обычном для JavaScript виде - то есть число с 0 по 11.

Простая функция, возвращающая дату JavaScript, соответствующую началу квартала:
fate.get_quarter_beginning(2019, 5) // Mon Apr 01 2019 00:00:00 GMT+0300 (Москва, стандартное время)
Ожидается год и месяц.

Простая функция, возвращающая дату JavaScript, соответствующую концу квартала:
fate.get_quarter_ending(2019, 5) // Mon Jul 01 2019 00:00:00 GMT+0300 (Москва, стандартное время)
Ожидается год и месяц.

Простая функция, возвращающая дату JavaScript, соответствующую началу времени года:
fate.get_season_beginning(1988, 2) // Tue Mar 01 1988 00:00:00 GMT+0300 (Москва, стандартное время)
fate.get_season_beginning(1988, 1) // {winter_beginning_1: Fri Jan 01 1988 00:00:00 GMT+0300 (Москва, стандартное время), winter_beginning_2: Thu Dec 01 1988 00:00:00 GMT+0300 (Москва, стандартное время)}
Ожидается год и месяц. В связи с несовершенством нашего календаря, с зимой все не так просто: она в рамках года начинается дважды, поэтому для зимы возвращается объект с двумя начальными датами.

Простая функция, возвращающая дату JavaScript, соответствующую концу времени года:
fate.get_season_ending(1988, 2) // Wed Jun 01 1988 00:00:00 GMT+0400 (Москва, летнее время)
fate.get_season_ending(1988, 1) // {winter_ending_1: Tue Mar 01 1988 00:00:00 GMT+0300 (Москва, стандартное время), winter_ending_2: Sun Jan 01 1989 00:00:00 GMT+0300 (Москва, стандартное время)}
Ожидается год и месяц. Зима в рамках года заканчивается дважды, поэтому для зимы возвращается объект с двумя конечными датами.

Функция, возращающая объект с количеством рабочих и выходных дней:
fate.get_days_by_types(new Date(2018, 2, 1), new Date(2019, 8, 11)) // {labor_days: 400, rest_days: 160}
fate.get_days_by_types(2019) // {labor_days: 261, rest_days: 104}
Подсчет ведется без учета праздников - просто субботы/воскресенья в одну кучу, остальное - в другую. Ожидается начальная дата и (опционально) дата прерывания (входит в подсчет, если ее нет - считаются все дни до конца года). Можно просто передать полный год - тогда будут считаться дни в течение всего года.

Функция, превращающая время в миллисекунды:
fate.time2milliseconds("18:31:27.380") // 66687380
fate.time2milliseconds("18:31") // 66660000
Время ожидается в формате hh:mm:ss.sss. Секунды и миллисекунды можно опустить.

Функция, производящая расчет времен разными способами:
fate.get_time_statistics(["01:01:01","02:02:02","03:03:03"], "sum") // 06:06:06
fate.get_time_statistics(["01:01:01","02:02:02","03:03:03"], "maximum") // 03:03:03
fate.get_time_statistics(["01:01:01","02:02:02","03:03:03"], "minimum") // 01:01:01
fate.get_time_statistics(["01:01:01","02:02:02","03:03:03"], "average") // 02:02:02
Первым аргументом ожидается массив с временами в формате hh:mm:ss.sss. Секунды и миллисекунды можно опустить. Второй аргумент определяет тип действий: "sum" позволяет получить сумму всех времен, "maximum" - максимальное время, "minimum" - минимальное время, "average" - среднее время.

Функция, превращающая Unix-время в человекочитаемую запись (ДД.ММ.ГГГГ чч:мм:сс):
fate.get_human_datetime(2615842807401) // 22.11.2052 02:00:07
fate.get_human_datetime(2615842807401, "date") // 22.11.2052
fate.get_human_datetime(2615842807401, "time") // 02:00:07
fate.get_human_datetime() // 22.02.2022 19:12:02
fate.get_human_datetime(2615842807401, "all", true) // 22.11.2052 02:00:07.401
Аргументами "date" или "time" можно получать лишь дату или время соответственно. Аргументы можно не указывать вовсе, тогда вернется текущая дата в полном человеческом виде (дата и время). Миллисекунды по умолчанию не возвращаются, человекам они не нужны, но если очень хочется - можно передать true третьим аргументом, и получить также миллисекунды.

Функция, превращающая Unix-время в машиночитаемую запись (YYYY-MM-DDThh:mm:ss):
fate.get_mr_datetime(2615842807401) // 2052-11-22T02:00:07
fate.get_mr_datetime(2615842807401, "date") // 2052-11-22
fate.get_mr_datetime(2615842807401, "time") // 02:00:07
fate.get_mr_datetime() // 2022-02-22T19:21:04
fate.get_mr_datetime("", "all", true) // 2022-02-22T19:35:34.173
Аргументами "date" или "time" можно получать лишь дату или время соответственно. Аргументы можно не указывать вовсе, тогда вернется текущая дата в полном машиночитаемом виде (дата и время). Миллисекунды по умолчанию не возвращаются, хотя роботам они и нужны изредка (впрочем, чаще всего не), но если очень хочется - можно передать true третьим аргументом, и получить также миллисекунды.



Журнал версий

Версия 3.3

  • Функция get_ru_time отныне умеет принимать третий булевой параметр для получения лишь одних корректных единиц измерения, без собственно значений (нужно передать true).

Версия 3.2

  • Поразительный факт: в библиотеке сей до сих пор не было функции, которая превращает в нечто удобочитаемое дату, зафиксированную в стандартом уже формате времени Unix - то бишь представленную миллисекундами, прошедшими с 1 января 1970 года. Штош, отныне есть возможность получить привычную человеческую дату и / или время из миллисекунд при помощи функции get_human_datetime.
  • Порою нечто похожее нужно и для получения даты в машиночитаемом виде. Функция get_mr_datetime позволяет преобразовать запись в миллисекундах в полную в машиночитаемую дату и / или время.

Версия 3.1

  • Функция get_date_diff научилась возвращать разницу между датами не только лишь в днях (осталось по умолчанию), но и в годах. Тип возвращаемого значения указывается в третьим аргументом. Пока есть лишь два: "days" и "years", первый можно не указывать.

Версия 3.0

  • Функция date2time переработана, ранее в некоторых случаях она не совсем корректно работала с миллисекундами. Также она научилась возвращать не полную текстовую строку на русском языке, а просто время в формате hh:mm:ss.sss (нужно передать true вторым аргументом), при этом можно дать указание миллисекунды не возвращать (нужно передать true третьим аргументом).
  • Добавлена функция time2milliseconds, которая превращает переданное время (ожидается формат hh:mm:ss.sss) в миллисекунды. Наличие секунд и миллисекунд в передаваемом времени опционально.
  • Добавлена функция get_time_statistics, которая принимает массив с временами (ожидается формат hh:mm:ss.sss) и вторым аргументом строку с типом статистической информации, которую нужно выдать в результате. Типов 4: "sum" (сумма времен в массиве), "maximum" (максимальное время из массива времен), "minimum" (минимальное время из массива времен) и "average" (вреднее время из массива времен). Время возвращается в том же формате, в котором записаны входящие данные. Наличие секунд и миллисекунд в передаваемом времени опционально. Смешанные форматы времени возможны: если хоть в одном элементе массива будут найдены секунды или миллисекунды - ответ будет их включать.

Версия 2.0

  • Добавлены функции get_days_by_types, get_season_beginning, get_season_ending, get_quarter, get_quarter_beginning, get_quarter_ending.
  • Обновлена функция get_ru_season.

Версия 1.0

  • Есть вышеуказанные массивы months_nominative_ru, months_genitive_ru, dotw_ru.
  • Есть вышеописанные функции get_mr_date, get_ru_time, get_mr_now, get_full_date_component, get_date_diff, is_leap, date2time, get_year_beginning, get_year_ending, get_full_weeks, get_ru_season.