Skip to main content

date_time

Macro date_time 

Source
macro_rules! date_time {
    ($Y:literal-$M:literal-$D:literal T $h:literal:$m:literal:$s:literal) => { ... };
    ($Y:literal-$M:literal-$D:literal T $h:literal:$m:literal:$s:literal $x:literal:$y:literal) => { ... };
}
Expand description

A macro to help constructing a DateTime struct.

Given that there are a lot of fields to the DateTime struct, for convenience this macro is provided, so a date can be constructed more easily. The syntax is intended to mimic RFC3339. For example:

assert_eq!(
    date_time!(2025-07-30 T 22:44:38.718 -05:00),
    DateTime {
        date_fullyear: 2025,
        date_month: 7,
        date_mday: 30,
        time_hour: 22,
        time_minute: 44,
        time_second: 38.718,
        timezone_offset: DateTimeTimezoneOffset {
            time_hour: -5,
            time_minute: 0,
        },
    }
)

§Input validation

The macro is also able to validate input looks correct (with the exception of the $D parameter which depends on which month is used, so it just validates that the value passed is less than 31).

Each of the following will fail compilation (thus providing some compile-time safety to usage):

let bad_date = date_time!(10000-01-01 T 00:00:00.000);       // Year greater than 4 digits
let bad_date = date_time!(1970-00-01 T 00:00:00.000);        // Month not greater than 0
let bad_date = date_time!(1970-13-01 T 00:00:00.000);        // Month greater than 12
let bad_date = date_time!(1970-01-00 T 00:00:00.000);        // Day not greater than 0
let bad_date = date_time!(1970-01-32 T 00:00:00.000);        // Day greater than 31
let bad_date = date_time!(1970-01-01 T 24:00:00.000);        // Hour greater than 23
let bad_date = date_time!(1970-01-01 T 00:60:00.000);        // Minute greater than 59
let bad_date = date_time!(1970-01-01 T 00:00:-1.000);        // Seconds negative
let bad_date = date_time!(1970-01-01 T 00:00:60.000);        // Seconds greater than 59
let bad_date = date_time!(1970-01-01 T 00:00:00.000 -24:00); // Hour offset less than -23
let bad_date = date_time!(1970-01-01 T 00:00:00.000 24:00);  // Hour offset more than 23
let bad_date = date_time!(1970-01-01 T 00:00:00.000 00:60);  // Minute offset more than 59