Перейти к основному содержимому
Версия: 7.0

Time

Timeсистемный модуль, собирающий свойства, действия и классы для работы со временем: получение текущей даты-времени, преобразования между классами времени, извлечение компонентов даты, арифметика над датами и временем, интервалы, календарные классы (месяцы, дни недели). Подключается через REQUIRE Time (System тянется автоматически).

В сигнатурах ниже используются встроенные классы времени DATE, TIME, DATETIME (без часового пояса) и ZDATETIME (с часовым поясом), а также INTEGER / LONG для счёта дней, секунд, миллисекунд и т. п. Большинство свойств — тонкие обёртки над соответствующими функциями даты-времени PostgreSQL; в строках, где свойство напрямую соответствует одной такой функции, приведено исходное выражение PostgreSQL ($1, $2, … — аргументы в перечисленном порядке). Остальные свойства — композиции других свойств Time, и тогда вместо выражения названа сама композиция.

Текущее значение

СвойствоЧто возвращает
currentDateTime[]текущие DATETIME серверных часов (без часового пояса), округлённые до целых секунд; PG date_trunc('second', LOCALTIMESTAMP)
currentDateTime[INTEGER]то же с сохранением указанного числа долей секунды (аргумент — эта точность); PG LOCALTIMESTAMP($1)
currentDateTimeMillis[]текущие DATETIME, округлённые до миллисекунды; PG date_trunc('milliseconds', LOCALTIMESTAMP)
currentZDateTime[]текущие ZDATETIME (с часовым поясом), округлённые до целых секунд; PG date_trunc('second', CURRENT_TIMESTAMP)
currentZDateTime[INTEGER]то же с сохранением указанного числа долей секунды; PG CURRENT_TIMESTAMP($1)
currentDate[]текущая DATE; хранимый снимок, который платформа обновляет не чаще раза в сутки, а не прямое чтение часов
currentTime[]текущее TIME серверных часов — временная часть currentDateTime[]
currentTime[INTEGER]текущее TIME с сохранением указанного числа долей секунды; PG LOCALTIME($1)
currentDay[] / currentMonth[] / currentYear[]день месяца / номер месяца / год от currentDate[] как INTEGER (extractDay[DATE] / extractMonthNumber[DATE] / extractYear[DATE] от currentDate[])
currentHour[] / currentMinute[] / currentSecond[]час / минута / секунда от currentTime[] как INTEGER (extractHour[TIME] / extractMinute[TIME] / extractSecond[TIME] от currentTime[])
currentDateTimeSnapshot[] / currentZDateTimeSnapshot[]хранимый снимок текущего момента DATETIME / ZDATETIME, записываемый платформой и читаемый как обычное хранимое значение
currentTimeText[]текущая дата-время как TEXT в формате YYYYMMDDHH24MISSMS; PG to_char(now(), 'YYYYMMDDHH24MISSMS')
dateDiffersCurrent[DATE]принимает DATE; возвращает TRUE, когда это непустая дата, отличная от currentDate[], иначе NULL

Преобразование

СвойствоЧто делает
toDate[DATETIME] / toTime[DATETIME]принимают DATETIME, возвращают его дату как DATE / его время как TIME; встроенные приведения класса DATE(...) / TIME(...)
toDateTime[DATE] / toZDateTime[DATE]принимают DATE, возвращают DATETIME / ZDATETIME на полночь этой даты; встроенные приведения класса DATETIME(...) / ZDATETIME(...)
toDateTime[DATE, TIME]собирает DATETIME из DATE и TIME; PG $1 + $2 (дата плюс время)
toSeconds[TIME]принимает TIME, возвращает число секунд от полуночи как INTEGER; PG extract(epoch from $1)
toTime[INTEGER]принимает счёт секунд, возвращает TIME через столько секунд после полуночи; PG TIME '00:00' + INTERVAL '1 second' * $1 (счёт от 86400 и больше, а также отрицательный, заворачивается по 24-часовому циферблату)
toDateTime[LONG] / toZDateTime[LONG]принимают Unix-время в секундах (несмотря на имя параметра millis в исходнике), возвращают DATETIME / ZDATETIME; PG to_timestamp(CAST($1 AS NUMERIC), 'UTC')::timestamp / to_timestamp(CAST($1 AS NUMERIC))
toDateFormat[STRING, STRING]разбирает DATE из первой строки по шаблону формата во второй; PG to_date($1, $2)
toDateTimeFormat[STRING, STRING]разбирает DATETIME из первой строки по шаблону формата во второй; PG to_timestamp($1, $2)
toDateISO[DATE]форматирует DATE как строку 'YYYY-MM-DD'; PG to_char($1, 'YYYY-MM-DD')
toDateDDMMYY[DATE] / toDateDDMMYYYY[DATE]форматируют DATE как 'DD.MM.YY' / 'DD.MM.YYYY'; PG to_char($1, 'DD.MM.YY') / to_char($1, 'DD.MM.YYYY')
toMilliseconds[DATETIME]resultMilliseconds[]встроенное java-действие: принимает DATETIME и записывает его Unix-время в миллисекундах (LONG) в локальное свойство resultMilliseconds[], которое читается затем
getMilliSeconds[ZDATETIME] / getSeconds[ZDATETIME]принимают ZDATETIME, возвращают Unix-время в миллисекундах / секундах как LONG; PG extract(epoch from $1) * 1000, причём getSeconds делит это на 1000

Извлечение компонентов

СвойствоЧто возвращает
extractYear[DATE]год от DATE как INTEGER; PG extract(year from $1)
extractMonthNumber[DATE]номер месяца 1–12 от DATE как INTEGER; PG extract(month from $1)
extractDay[DATE]день месяца 1–31 от DATE как INTEGER; PG extract(day from $1)
extractDOY[DATE]день года 1–366 от DATE как INTEGER; PG extract(doy from $1)
extractHour[TIME] / extractMinute[TIME] / extractSecond[TIME]час / минута / секунда от TIME как INTEGER; PG extract(hour from $1) / extract(minute from $1) / extract(second from $1)
extractWeek[DATE]номер недели по ISO 8601 от DATE (неделя 1 — та, что содержит 4 января); PG extract(week from $1)
extractWeekZeroBased[DATE]то же, что extractWeek[DATE], но возвращает 0 для первых дней января, которые ISO 8601 относит ещё к последней неделе предыдущего года (когда extractWeek[DATE] > 50 и месяц — январь)
extractDOWNumber[DATE]номер дня недели от DATE в стиле PostgreSQL 0–6, где 0 = воскресенье; PG extract(dow from $1)
extractDOW[DATE] / extractDOWName[DATE]день недели от DATE как объект DOW (DOW[INTEGER] от extractDOWNumber[DATE]) / его название как текст (name[DOW] этого объекта)
extractMonth[DATE] / extractMonthName[DATE]месяц от DATE как объект Month (month[INTEGER] от extractMonthNumber[DATE]) / его название как текст (name[Month] этого объекта)

Арифметика

СвойствоЧто делает
sum[DATE, INTEGER]прибавляет к DATE указанное число дней, возвращает DATE; PG $1 + $2
subtract[DATE, LONG]вычитает из DATE указанное число дней, возвращает DATE; PG $1 - $2
sumMonth[DATE, INTEGER] / sumYear[DATE, INTEGER]прибавляют к DATE указанное число месяцев / лет, возвращают DATE; PG ($1 + $2 * interval '1 month')::date / ($1 + $2 * interval '1 year')::date
firstDayOfMonth[DATE] / lastDayOfMonth[DATE]первый / последний день месяца от DATE, возвращают DATE; PG date_trunc('month', $1)::date / (date_trunc('month', $1) + interval '1 month - 1 day')::date
sumWeekFrom[DATE, INTEGER] / sumWeekTo[DATE, INTEGER]сдвигают DATE на указанное число полных недель, попадая на начало (sum[DATE, INTEGER] на n*7 дней) / конец (n*7 + 6 дней) этой недели
sumDay[DATETIME, LONG] / subtractDay[DATETIME, LONG]прибавляют / вычитают целые дни к DATETIME или ZDATETIME (перегружены для обоих), возвращают тот же класс; PG $1 + $2 * interval '1 day' / $1 - $2 * interval '1 day'
sumMinutes[…]прибавляет указанное число минут; перегружено для TIME, DATETIME, ZDATETIME, возвращает тот же класс; PG $1 + $2 * interval '1 minute'. Для TIME результат ведётся по 24-часовому циферблату и заворачивается через полночь (например, 23:30 + 60 → 00:30, а отрицательный счёт уводит назад за 00:00); для DATETIME / ZDATETIME переходит в соседние сутки, сдвигая дату
sumSeconds[…]прибавляет указанное число секунд; те же перегрузки и тот же заворот по 24 часам для TIME, что и у sumMinutes[…]; PG $1 + $2 * interval '1 second'
subtractSeconds[DATETIME, LONG] / subtractSeconds[ZDATETIME, LONG]вычитают указанное число секунд из DATETIME / ZDATETIME, возвращают тот же класс; PG $1 - $2 * interval '1 second'
subtractSeconds[TIME, TIME] / subtractSeconds[DATETIME, DATETIME] / subtractSeconds[ZDATETIME, ZDATETIME]разность двух значений одного класса в секундах как INTEGER, считается как второй аргумент минус первый (subtractSeconds(a, b) = b - a, положительно, когда b — более поздняя величина); PG extract(epoch from (b - a))
daysBetweenDates[DATE, DATE]разность двух дат в днях как INTEGER, считается как первый аргумент минус второй (daysBetweenDates(a, b) = a - b, положительно, когда a — более поздняя дата); PG $1 - $2. Порядок операндов обратен subtractSeconds
daysInclBetweenDates[DATE, DATE]число дней между двумя датами с учётом обоих концов: второй аргумент минус первый, плюс 1 (daysInclBetweenDates(a, b) = b - a + 1) — порядок операндов обратен daysBetweenDates[DATE, DATE], так как оно вызывается с переставленными аргументами
secondsBetweenDates[DATETIME, DATETIME]разность двух моментов в секундах как INTEGER, считается как первый аргумент минус второй (secondsBetweenDates(a, b) = a - b, положительно, когда a — более поздний момент); PG extract(epoch from $1) - extract(epoch from $2)
dateTimeToDateTime[DATE, TIME]собирает DATETIME из DATE и TIME через приведение текста; PG to_timestamp(<дата> || <время>, 'YYYY-MM-DDHH24:MI:SS.MS')::timestamp
dateFromYearWeekDay[INTEGER, INTEGER, INTEGER]собирает DATE по году, номеру недели ISO 8601 и дню недели ISO (1 = понедельник … 7 = воскресенье); PG to_date($1 || ' ' || $2 || ' ' || $3, 'IYYY IW ID')
distanceDOWDOW[DOW, DOW]расстояние вперёд в днях от первого дня недели до второго, с заворотом по неделе 0–6: number[DOW] второго минус number[DOW] первого, плюс 7, когда результат был бы отрицательным

Итерация и интервалы

СвойствоЧто делает
iterate[DATE, DATE, DATE]рекурсивная развёртка диапазона дат: первый параметр пробегает все DATE от второго (from) до третьего (to) включительно, шагая по одному дню через sum[DATE, INTEGER]
iterate[DATE, INTERVAL[DATE]]та же развёртка по интервалу дат, по его границам from[INTERVAL[DATE]] и to[INTERVAL[DATE]]
interval[DATE, DATE]собирает INTERVAL[DATE] из начальной и конечной даты, упаковывая обе границы как Unix-эпохи в миллисекундах в одно числовое значение
from[INTERVAL[DATE]] / to[INTERVAL[DATE]]начальная / конечная DATE, распакованная из INTERVAL[DATE]; PG to_timestamp(...) над хранимой эпохой
interval[…] / from[…] / to[…] для TIME, DATETIME, ZDATETIMEта же упаковка и распаковка для соответствующих классов INTERVAL[TIME], INTERVAL[DATETIME], INTERVAL[ZDATETIME]

Календарные классы и формы

Month и DOW — встроенные классы, описывающие месяцы (12 объектов) и дни недели (7 объектов). Содержат свойства number[Month], name[Month], number[DOW], numberM[DOW] (нумерация с понедельника), name[DOW]. Поиск по номеру: month[INTEGER], DOW[INTEGER]. Формы months и DOWs показывают эти классы как справочники.

DateTimePickerRanges и DateTimeIntervalPickerRanges — статические классы с готовыми наборами шорткатов (rangeToday, rangeYesterday, rangeLast7Days и т. п.) для выбора в UI-пикерах одиночной даты и интервала.

Связано

  • System modules — общий список модулей платформы.
  • Built-in classes — описание классов DATE, TIME, DATETIME, ZDATETIME, INTERVAL[…].
  • Scheduler — запуск действий по расписанию.