Date and time values
"Punctuality is not just limited to arriving at a place at the right time; it is also about taking actions at the right time." - Amit Kalantri
The API stores date/time values in Microsoft SQL Server using the DATETIMEOFFSET data type, and in PostgreSQL using the timestamp with time zone data type.
Why is explicit time zone information is so important?
Consider the following date/time value for example:
2025-11-02 01:30 AM
The exact meaning of this value is ambiguous. In Canada and the United States, Daylight Savings Time (DST) ends on November 2, 2025 at 2:00 AM. At that moment, clocks are set back one hour. Therefore, the hour from 1:00 AM to 2:00 AM occurs twice:
First, under Eastern Daylight Time (EDT, UTC-4)
Then again, under Eastern Standard Time (EST, UTC-5)
Furthermore, without a time zone or UTC offset specified, the value might also represent:
November 2, 2025 at 5:30 AM UTC in Europe/London
November 1, 2025 at 10:30 PM Mountain Standard Time in Canada/Calgary
November 1, 2025 at 11:30 PM Mountain Daylight Time in America/Phoenix (no DST)
November 1, 2025 at 10:30 PM Pacific Daylight Time in America/Los Angeles
In contrast, consider the following date/time offset value:
2025-11-01T22:30:00-07:00
In contrast to the previous example, the exact meaning of this value is not ambiguous. It can be interpreted one way only:
November 1, 2025 at 10:30 PM Mountain Standard Time, as observed in Canada/Calgary and in America/Denver
It cannot be interpreted to mean any other day, or time, or time zone.
Explicitly including time zone awareness — i.e., embedding it in a single atomic value with the date and time — ensures every date/time value includes the calendar date, the time of day (based on a 24-hour clock), and the time zone offset (based on Coordinated Universal Time).
In turn, this guarantees the precise meaning of a value is never ambiguous with regard to time zone or (where applicable) rules about daylight savings time.
Other benefits of using date/time offset values with time zone awareness
Converting between time zones is predictable and accurate, enabling clear transformations and comparisons across systems with different time zones and/or daylight saving time rules.
Representing specific moments in time globally can be done quickly and easily. Two different values with two different offsets can still be compared meaningfully and reliably by internally converting both to UTC.
Logging, auditing, and monitoring in distributed systems where clients and servers operate in different time zones require unambiguous timestamps.
Aligning with formal standards and industry best practices found in other modern APIs is especially important for data serialization. This is critical for reliable communication between systems that need to exchange time-based data across platform boundaries.
ISO 8601
The API uses the ISO 8601 format for all date/time values.
This format is often referred to as the round-trip format in data serialization contexts because it guarantees a date/time value can be:
Serialized (converted to a string), and then
Deserialized (parsed back to the original object)
with zero loss of information.
Key characteristics enabling round-trip accuracy
This round-trip format has several important characteristics:
Full date-time precision
Includes year, month, day, hour, minute, second, fractional seconds (optional).
Time zone offset
Encodes the UTC offset (e.g., -07:00
, +00:00
, or Z
for UTC), preserving global context.
Unambiguous format
Uses fixed patterns like YYYY-MM-DDTHH:mm:ssK
, where K
includes the offset.
Invariant across cultures
Not affected by locale settings (e.g., no "AM/PM", no localized month names).
The round-trip format
In .NET, the ISO 8601 format corresponds to the "O" (round-trip) or "o" format specifier for function calls to DateTimeOffset.ToString()
.
.NET follows the ISO 8601 standard with this pattern:
yyyy-MM-ddTHH:mm:ss.fffffffK
where:
yyyy-MM-dd
is the dateT
is the literal separator between date and timeHH:mm:ss
is the time in 24-hour format.fffffff
is the fractional seconds (if present)K
is the offset from UTC
To recap, this format is culture-invariant and unambiguous, making it ideal for data exchange, serialization, and storage scenarios where it is necessary to preserve the exact calendar date, time of day, and time zone for a specific moment in time.
Data examples
Here are a few examples that show ISO 8601 values and their corresponding local times:
2025-10-31T23:00:00-07:00
October 31, 2025 11:00 PM MST
2025-07-01T12:00:00-07:00
July 1, 2025 12:00 PM PDT
2025-12-25T10:00:00-05:00
December 25, 2025 10:00 AM EST
2025-03-10T01:30:00-07:00
March 10, 2025 1:30 AM MST
2025-09-15T16:15:00-07:00
September 15, 2025 4:15 PM PDT
Code examples
In .NET, the "o"
or "O"
format specifier produces a string like this:
DateTimeOffset original = DateTimeOffset.Parse("2025-11-01T22:30:00-07:00");
string serialized = original.ToString("o"); // "2025-11-01T22:30:00.0000000-07:00"
DateTimeOffset parsed = DateTimeOffset.Parse(serialized);
✅
parsed == original
— the round-trip is lossless
Practice makes perfect
Check out this service in the API:

You can practice with your own input values to see exactly how they are parsed and interpreted by the server. For example:
Example Input
platform/formats/time?value=2025-11-11T22:30:00-07:00
Example Output
{
"Original": "2025-11-11T22:30:00-07:00",
"Formats": {
"Value": "Tuesday - November 11, 2025 - 10:30:00 PM Mountain Standard Time",
"RoundTrip": "2025-11-11T22:30:00.0000000-07:00",
"Offset": "-07:00:00",
"TimeZone": "Mountain Standard Time",
"ISO8601": "2025-11-11T22:30:00.0000000-07:00",
"RFC3339": "2025-11-11T22:30:00.000-07:00",
"ShortDate": "2025-11-11",
"LongDate": "November 11, 2025",
"ShortTime": "10:30 PM",
"LongTime": "10:30:00 PM",
"FullDateTime": "November 11, 2025 10:30:00 PM",
"SortableDateTime": "2025-11-11T22:30:00",
"UniversalSortable": "2025-11-12 05:30:00Z",
"UnixTimestamp": "1762925400",
"UTC": "2025-11-12 05:30:00 UTC",
"UTC_ISO8601": "2025-11-12T05:30:00.0000000Z",
"Quarter": "4",
"Week": "46",
"Day": "315",
"IsWeekend": "False"
},
"Conversions": {
"Eastern": {
"DateTime": "Nov 12, 2025 12:30:00 AM EST",
"Offset": "-05:00"
},
"Mountain": {
"DateTime": "Nov 11, 2025 10:30:00 PM MST",
"Offset": "-07:00"
},
"Pacific": {
"DateTime": "Nov 11, 2025 9:30:00 PM PST",
"Offset": "-08:00"
}
}
}
The Original format is format your code should use whenever it sends any date/time value to the API.
Last updated
Was this helpful?