This function validates date-times or converts date-times between one format and another.
A date-time is a date and time of day represented by a timestamp, a time number or a military time-zone character.
- A timestamp is a date-time expressed as a multiple element numeric vector, of which there are several different sorts (principally ⎕TS format).
- A time number is a date-time expressed as a scalar numeric value, of which there are several different sorts.
- A military time zone character is a scalar character that represents the current date-time ("now") in a particular time zone. For example, 'A' represents the current date-time (UTC) + 1 hour.
Y is an array of any shape whose elements contain a timestamp, time number or military time zone character, in any combination.
X may be a single integer value or a 2-element integer vector.
When X is a single integer value, it must be either 0 or a date-time code listed in the tables below. 0 specifies that the elements of Y are to be validated. A non-zero value specifies the date-time representation to which the elements of Y are to be converted. In this case, the numeric elements of Y are interpreted as follows:
- scalars are assumed to be time numbers of type Dyalog Date Number (code 1)
- vectors are assumed to be ⎕TS timestamps (code ¯1)
When X is a 2-element integer vector, X[1] is a date-time code that explicitly specifies the date-time representation of the numeric elements in Y. X[2] is either 0 or a date-time code listed in the tables below. 0 specifies that the elements of Y are to be validated. A non-zero value specifies the date-time representation to which the elements of Y are to be converted.
Character scalars in Y are always interpreted as meaning "now".
R is an array of the same shape as Y, where each element is either a timestamp, time number or Boolean value as determined by the second or only element in X.
Note: time numbers in R may be of type DECF even if ⎕FR is 645 if their magnitude can be too great to store precisely in a double. See the table below for the type numbers where this is so.
Time Numbers
If a value in X is positive it indicates that a time number type is expected in Y or generated in R, as follows. Note that the last column indicated whether (Yes) or not (No) negative numbers are allowed.
Group | Code | Description | Category | Date and time1represented by 0 (Epoch) | Negative values allowed?8 |
---|---|---|---|---|---|
Dyalog APL | 1 | Dyalog Date Number | Day count with fractional part | 1899-12-31 00:00 | Yes |
2 | Dyalog component file time | Tick count 1÷60s ticks2 |
1970-01-01 00:00 | Yes | |
Other languages | 10 | J (J nanosecond time) | Tick count3 1ns ticks2 |
2000-01-01 00:00 | Yes |
11 | Shakti K7 | Tick count 1ms ticks2 |
2024-01-01 00:00 | Yes | |
12 | JavaScript / D / Q | Tick count 1ms ticks2 |
1970-01-01 00:00 | Yes | |
13 | R (R chron format) | Day count with fractional part | 1970-01-01 00:00 | Yes | |
14 | Shakti K9 | Tick count 1ms ticks2 |
2001-01-01 00:00 | Yes | |
UNIX | 20 | Unix time | Tick count 1s ticks2 |
1970-01-01 00:00 | Yes |
Microsoft | 30 | Microsoft DOS date/time | Encoded broken-down time 2s resolution |
N/A | No |
31 | Microsoft Win32 FILETIME | Tick count3 100ns ticks |
1601-01-01 00:00 | No | |
32 | Microsoft CLR DateTime (.NET)(Ticks property thereof) | Tick count3 100ns ticks |
0001-01-01 00:00 | No | |
33 | Microsoft OLE Automation Date(also known as Variant Time) | Day count with fractional part | 1899-12-30 00:00 | Yes8 | |
Application | 40 | Excel (1900 Date System)4/ Lotus 1-2-3 | Day count with fractional part5 | 1899-12-31 00:006 | No |
41 | Excel (1904 Date System)4 | Day count with fractional part | 1904-01-01 00:00 | No | |
42 | Stata statistics package | Tick count 1ms ticks2 |
1960-01-01 00:00 | Yes | |
43 | SPSS statistics package | Tick count 1s ticks2 |
1582-10-14 00:00 | No | |
44 | SAS | Tick count 1s ticks2 |
1960-01-01 00:00 | Yes | |
Julian Date and variants | 50 | Julian Date | Day count with fractional part | ¯4717-11-24 12:00 | No |
51 | J (J dayno) | Day count with fractional part | 1800-01-01 00:00 | No | |
52 | Reduced Julian Date | Day count with fractional part | 1858-11-16 12:00 | Yes | |
53 | Modified Julian Date | Day count with fractional part | 1858-11-17 00:00 | Yes | |
54 | Dublin Julian Date | Day count with fractional part | 1899-12-31 12:00 | Yes | |
55 | CNES Julian Date | Day count with fractional part | 1950-01-01 00:00 | Yes | |
56 | CCSDS Julian Date | Day count with fractional part | 1958-01-01 00:00 | Yes | |
Decimal encoded9 | 60 | Floating-point decimal encoded format Digits take the form yyyymmdd.hhmmss |
Encoded broken-down time 1s resolution |
N/A | No |
61 | Integer decimal encoded format Digits take the form yyyymmddhhmmss(J digit time) |
Encoded broken-down time 1s resolution |
N/A | No |
Time Stamps
If a value in X is negative it indicates that a timestamp type is expected in Y or generated in R, as follows:
Group | Code | Description | Max elements | Element contents11 | Elided element implicit values (in Y)33 |
---|---|---|---|---|---|
APL 7-element vector | ¯1 | Millisecond precision (⎕TS) | 7 | Year, month, day-of-month, hour, minute, second, millisecond | 1 1 1 0 0 0 0 |
¯2 | Microsecond precision | 7 | Year, month, day-of-month, hour, minute, second, microsecond | 1 1 1 0 0 0 0 | |
¯3 | Nanosecond precision (J expanded digit time) | 7 | Year, month, day-of-month, hour, minute, second, nanosecond | 1 1 1 0 0 0 0 | |
ISO components | ¯10 | ISO day-of-year components | 6 | Year, day-of-year, hour, minute, second, microsecond | 1 1 0 0 0 0 |
¯11 | ISO day-of-week components | 7 | Year, week, day-of-week, hour, minute, second, microsecond | 1 1 1 0 0 0 0 | |
Decimal encoded2 | ¯20 | Decimal encoded date and time2 | 2 | Decimal encoded date, decimal encoded time | 10101 0 |
DateTimePicker | ¯30 | DateTime format | 7 | International Day Number (IDN), hour, minute second | 1 1 1 0 0 0 |
Military time zone characters
Any element in Y may be specified as a military time zone character and is implicitly replaced by the current time in the time zone they represent. The time zones are as follows:
Character | Time zone name | Time zone |
---|---|---|
A | Alpha | UTC +1 |
B | Bravo | UTC +2 |
C | Charlie | UTC +3 |
D | Delta | UTC +4 |
E | Echo | UTC +5 |
F | Foxtrot | UTC +6 |
G | Golf | UTC +7 |
H | Hotel | UTC +8 |
I | India | UTC +9 |
J | Juliet | Local time |
K | Kilo | UTC +10 |
L | Lima | UTC +11 |
M | Mike | UTC +12 |
N | November | UTC -1 |
O | Oscar | UTC -2 |
P | Papa | UTC -3 |
Q | Quebec | UTC -4 |
R | Romeo | UTC -5 |
S | Sierra | UTC -6 |
T | Tango | UTC -7 |
U | Uniform | UTC -8 |
V | Victor | UTC -9 |
W | Whisky | UTC -10 |
X | X-ray | UTC -11 |
Y | Yankee | UTC -12 |
Z | Zulu | UTC +0 |
Note that the resolutions of system clocks vary by platform.
Examples: Timestamp to time number conversion
¯1 1 ⎕DT ⊂⎕TS 43886.48039 1 ⎕DT ⊂⎕TS 43886.48039 1 ⎕DT ⎕TS 'J' 43886.48039 43886.48039 1 ⎕DT ⊂⍬ ⍝ cf Elided element implicit values ¯693594 1 ⎕DT ⊂1 1 1 0 0 0 0 ¯693594 ¯30 1 ⎕DT⊂(44217 15 13 54) 44217.63465
Examples: Time number to timestamp conversion
1 ¯1 ⎕DT 0 43508.42843 ┌──────────────────┬──────────────────────┐ │1899 12 31 0 0 0 0│2019 2 13 10 16 56 352│ └──────────────────┴──────────────────────┘ ¯1 ⎕DT 0 43508.42843 ┌──────────────────┬──────────────────────┐ │1899 12 31 0 0 0 0│2019 2 13 10 16 56 352│ └──────────────────┴──────────────────────┘ 2 ¯1 ⎕DT 3⊃⎕FRDCI 1 1 ┌──────────────────────┐ │2020 2 26 11 33 54 466│ └──────────────────────┘ 1 ¯30 ⎕DT 44217.63465 ┌──────────────┐ │44217 15 13 53│ └──────────────┘
Examples: Time number to time number conversion
2 1 ⎕DT 3⊃⎕FRDCI 1 1 43886.48188 1 ⎕DT 'J' 43886.48371 ⍝ Local time is UTC-05:00 3600÷⍨-/20 ⎕DT 'JZ' ¯5
Examples: Timestamp to timestamp conversions
¯30 ⎕DT ⊂⎕TS ┌─────────────┐ │44216 16 5 46│ └─────────────┘
¯30 ¯1 ⎕DT⊂32000 15 10 0 ┌───────────────────┐ │1987 8 12 15 10 0 0│ └───────────────────┘
Examples: Validation
0 ⎕DT ⎕TS (2020 13 1) 'J' 'DT' # 1 0 1 0 0 ¯30 0 ⎕DT⊂32000 15 10 0 1