Работа с датами и временем
В приложении можно определить три типа данных, связанных с датой и временем:
Тип данных ABL |
Описание |
DATE | Значение, представляющее дату по григорианскому календарю. |
DATETIME | Значение, состоящее из типа DATE и времени в миллисекундах, начиная с полуночи этой даты. |
DATETIME-TZ | Значение, состоящее из типа DATETIME и смещения часового пояса от универсального скоординированного времени (UTC) в минутах. Формат смещения часового пояса – часы и минуты. |
Начальным значением по умолчанию для этих типов является Неопределённое значение ( ?). Если вы попытаетесь записать или отобразить дату, которой не присвоено значение, она записывается или отображается как пустая.
Если вы совместно используете значение DATE или DATETIME с другим процессом, вы должны учитывать информацию о часовом поясе и способ расчёта системного времени на разных платформах.
Примеры форматов даты и времени
Тип данных ABL |
Спецификация формата |
Пример вывода |
DATE | 99/99/99 (по умолчанию)
99/99/9999
99-99-99 |
05/30/20
05/30/2020
05-30-20 |
DATETIME | 99/99/9999 HH:MM:SS.SSS (по умолчанию)
99/99/9999 HH:MM
99-99-99 HH:MM:SS am |
05/30/2020 15:30:44.234
05/30/2020 15:30
30-05-2020 15:30:44 |
DATETIME-TZ | 99/99/9999 HH:MM:SS.SSS+HH:MM (по умолчанию)
99/99/9999HH:MM+HH:MM |
05/30/2020 16:30:44.234-03:00
05/30/2020 16:30-03:00 |
Определение и инициализация переменных даты и времени
Чтобы инициализировать переменную DATE, DATETIME или DATETIME-TZ, необходимо указать значение, соответствующее типу данных, которые вы хотите инициализировать. Спецификация начального значения DATETIME или DATETIME-TZ, которое содержит пробелы, требует заключения его в кавычки. Вам не нужно использовать кавычки для начального значения типа DATE или при указании DATETIME в формате даты/времени ISO.
В следующем примере кода определяется переменная каждого из типов даты и времени ABL.
VAR DATE dtShipDate = 02-14-2020. VAR DATETIME dtShipTime = "02-14-2020 14:45". VAR DATETIME-TZ dtOrderTime = "12-17-2020 10:15-5:00".
Примечание. Дата и часть времени DATETIME-TZ хранится в поле базы данных/временной таблицы или в переменной относительно UTC. Это происходит для того, чтобы его можно было индексировать в абсолютном выражении. При отображении значения AVM преобразует значение в местное время относительно часового пояса.
Операторы и функции даты и времени
ABL предоставляет операторы и встроенные функции для работы с датами и временем.
В следующем примере кода используются некоторые из этих операторов и функций:
SESSION:DATE-FORMAT = "mdy". MESSAGE "Today's date is" TODAY SKIP "Today's datetime is" NOW SKIP "Tomorrow's date is" TODAY + 1 SKIP "Yesterday's date was" TODAY - 1 SKIP "The current month is" MONTH(TODAY) SKIP "Last month was" MONTH(TODAY) - 1 SKIP "Next year is" YEAR(TODAY) + 1 SKIP "The current datetime is" NOW SKIP "The current datetime in ISO-Date format is" ISO-DATE(NOW) VIEW-AS ALERT-BOX.
Выполнение кода примера приводит к следующему выводу:
Today's date is 03/25/20 Today's datetime is 03/25/2020 16:56:10.826+00:00 Tomorrow's date is 03/26/20 Yesterday's date was 03/24/20 The current month is 3 Last month was 2 Next year is 2021 The current datetime is 03/25/2020 16:56:10.826+00:00 The current datetime in ISO-Date format is 2020-03-25T16:56:10.826+00:00
Настройка порядка отображения дат
По умолчанию информация о дате отображается в следующем порядке: месяц, затем день и год (mdy). Вы можете изменить порядок по умолчанию, указав параметр старта Date Format (-d) ( -d dmy или -d ydm). Кроме того, вы можете временно изменить порядок отображения для текущего сеанса, установив атрибут DATE-FORMAT для системного дескриптора SESSION.
В следующем примере кода отображается текущая дата с помощью функции TODAY, а также дата и время с помощью функции NOW. Затем порядок отображения даты меняется на dmy в текущем сеансе ABL. Текущие дата и время затем снова отображаются.
MESSAGE "Today's date is" TODAY SKIP "Today's date and time is" NOW VIEW-AS ALERT-BOX. SESSION:DATE-FORMAT = "dmy". MESSAGE "Date format changed." SKIP "Today's date is" TODAY SKIP "Today's date and time is" NOW VIEW-AS ALERT-BOX.
Выполнение кода приводит к следующему выводу:
Today's date is 02/10/22 Today's date and time is 02/10/2022 08:13:57.140+00:00 Date format changed. Today's date is 10/02/22 Today's date and time is 10/02/2022 08:13:57.140+00:00
Расчёт интервалов с датами и временем
Вы можете рассчитать интервалы между двумя датами и временем с помощью функции INTERVAL. При использовании этой функции типы двух переменных могут не совпадать. Вы предоставляете два значения DATE, DATETIME или DATETIME-TZ, и функция вычитает миллисекунды во втором значении из миллисекунд в первом значении. Возвращаемое значение находится в единицах запрошенного типа интервала.
Синтаксис функции INTERVAL
INTERVAL(dtVal1, dtVal2, interval-type)
dtVal1
Первое значение DATE, DATETIME или DATETIME-TZ.
dtVal2
Второе значение DATE, DATETIME или DATETIME-TZ.
interval-type
Может быть любой из строк: “years”, “months”, “weeks”, “days”, “hours”, “minutes”, “seconds”, “milliseconds”.
В следующем примере кода функция INTERVAL рассчитывает количество дней между dtShipDate и dtOrderTime.
VAR DATE dtShipDate = 02-14-2020. VAR DATETIME-TZ dtOrderTime = "02-01-2020 10:15-5:00". MESSAGE "Order time:" dtOrderTime SKIP "Ship date:" dtShipDate SKIP "Days to process order:" INTERVAL(dtShipDate,dtOrderTime,"days") VIEW-AS ALERT-BOX.
Выполнение кода приводит к следующему выводу:
Order time is: 02/01/2020 10:15:00.000-05:00 Ship date is: 02/14/20 Days to process order: 12