Skip to content

Date and time functions

These functions operate on the temporal types (TIME, LTIME, DATE, LDATE, TOD, LTOD, DT, LDT). They cover three areas: arithmetic on durations and date/time values, composing/decomposing date/time values, and reading the runtime device clock. To convert between temporal types (e.g. TIME_TO_LTIME), use the conversion functions.

FunctionParametersReturns
ADD_TIMEIN1 : TIME, IN2 : TIMETIME
ADD_LTIMEIN1 : LTIME, IN2 : LTIMELTIME
ADD_TOD_TIMEIN1 : TOD, IN2 : TIMETOD
ADD_LTOD_LTIMEIN1 : LTOD, IN2 : LTIMELTOD
ADD_DT_TIMEIN1 : DT, IN2 : TIMEDT
ADD_LDT_LTIMEIN1 : LDT, IN2 : LTIMELDT
SUB_TIMEIN1 : TIME, IN2 : TIMETIME
SUB_LTIMEIN1 : LTIME, IN2 : LTIMELTIME
SUB_DATE_DATEIN1 : DATE, IN2 : DATETIME
SUB_LDATE_LDATEIN1 : LDATE, IN2 : LDATELTIME
SUB_TOD_TIMEIN1 : TOD, IN2 : TIMETOD
SUB_LTOD_LTIMEIN1 : LTOD, IN2 : LTIMELTOD
SUB_TOD_TODIN1 : TOD, IN2 : TODTIME
SUB_LTOD_LTODIN1 : LTOD, IN2 : LTODLTIME
SUB_DT_TIMEIN1 : DT, IN2 : TIMEDT
SUB_LDT_LTIMEIN1 : LDT, IN2 : LTIMELDT
SUB_DT_DTIN1 : DT, IN2 : DTTIME
SUB_LDT_LDTIN1 : LDT, IN2 : LDTLTIME
MUL_TIMEIN1 : TIME, IN2 : ANY_NUMTIME
MUL_LTIMEIN1 : LTIME, IN2 : ANY_NUMLTIME
DIV_TIMEIN1 : TIME, IN2 : ANY_NUMTIME
DIV_LTIMEIN1 : LTIME, IN2 : ANY_NUMLTIME

The naming encodes the operand types: ADD_DT_TIME adds a TIME duration to a DT; SUB_DT_DT subtracts two DT values to yield the TIME between them.

deadline := ADD_DT_TIME(start, T#2h); // DT + duration -> DT
elapsed := SUB_DT_DT(finish, start); // DT - DT -> TIME
total := ADD_TIME(setup, run); // TIME + TIME -> TIME
doubled := MUL_TIME(base, 2); // TIME * number -> TIME
slice := DIV_TIME(period, 4); // TIME / number -> TIME
FunctionParametersReturns / outputs
CONCAT_DATE_TODIN1 : DATE, IN2 : TODDT
CONCAT_DATE_LTODIN1 : DATE, IN2 : LTODLDT
CONCAT_DATEYEAR, MONTH, DAY : ANY_INTDATE
CONCAT_TODHOUR, MINUTE, SECOND, MILLISECOND : ANY_INTTOD
CONCAT_LTODHOUR, MINUTE, SECOND, MILLISECOND : ANY_INTLTOD
CONCAT_DTYEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND : ANY_INTDT
CONCAT_LDTYEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND : ANY_INTLDT
SPLIT_DATEin IN : DATEout YEAR, MONTH, DAY : ANY_INT
SPLIT_TODin IN : TODout HOUR, MINUTE, SECOND, MILLISECOND : ANY_INT
SPLIT_LTODin IN : LTODout HOUR, MINUTE, SECOND, MILLISECOND : ANY_INT
SPLIT_DTin IN : DTout YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND : ANY_INT
SPLIT_LDTin IN : LDTout YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND : ANY_INT
DAY_OF_WEEKIN : DATEINT
CONCAT_DATE(YEAR : ANY_INT, MONTH : ANY_INT, DAY : ANY_INT) : DATE
CONCAT_DT(YEAR, MONTH, DAY, HOUR, MINUTE, SECOND, MILLISECOND : ANY_INT) : DT
today := CONCAT_DATE(2026, 6, 8); // DATE#2026-06-08
stamp := CONCAT_DT(2026, 6, 8, 14, 30, 0, 0); // DT#2026-06-08-14:30:00
joined := CONCAT_DATE_TOD(today, TOD#08:00:00);

DAY_OF_WEEK (a logiccloud extension) returns the weekday of a DATE as an INT where Sunday = 0, Monday = 1, …, Saturday = 6.

DAY_OF_WEEK(IN : DATE) : INT
weekday := DAY_OF_WEEK(D#2026-06-08); // 1 (Monday)

These are logiccloud extensions that read the runtime device clock. All three return a DT (DATE_AND_TIME).

FunctionParametersReturnsDescription
SYS_UTC_DATE_TIME(none)DTCurrent date/time in UTC.
SYS_LOCAL_DATE_TIME(none)DTCurrent date/time in the runtime’s local time zone.
SYS_DATE_TIMETZ : STRINGDTCurrent date/time in the named time zone.

SYS_DATE_TIME takes an IANA time-zone name (e.g. 'Europe/Berlin', 'America/New_York', 'UTC').

SYS_UTC_DATE_TIME() : DT
SYS_LOCAL_DATE_TIME() : DT
SYS_DATE_TIME(TZ : STRING) : DT
nowUtc := SYS_UTC_DATE_TIME();
nowLocal := SYS_LOCAL_DATE_TIME();
nowBerlin := SYS_DATE_TIME('Europe/Berlin');