Thread overview
How do I convert an ISO 8601 datetime into a unix timestamp - at compile-time?
Aug 28, 2020
Andrej Mitrovic
Aug 28, 2020
Andrej Mitrovic
Aug 31, 2020
Andrej Mitrovic
August 28, 2020
-----
import std.datetime;

void main ()
{
    static time =
        SysTime(DateTime.fromISOString("20220101T000000")).toUnixTime;
}
-----

-----
/Library/D/dmd/src/phobos/std/concurrency.d(2574): Error: static variable lock cannot be read at compile time
/Library/D/dmd/src/phobos/std/concurrency.d(2574):        called from here: atomicLoad(lock)
/Library/D/dmd/src/phobos/std/concurrency.d(2600):        called from here: initOnceLock()
/Library/D/dmd/src/phobos/std/concurrency.d(2600):        called from here: initOnce(delegate shared(bool)() pure @nogc @safe => init(), initOnceLock())
/Library/D/dmd/src/phobos/std/datetime/timezone.d(1106):        called from here: initOnce(delegate shared(bool)() pure nothrow @nogc @safe => (*function () nothrow @nogc @safe => true)())
/Library/D/dmd/src/phobos/std/datetime/timezone.d(546):        called from here: (*& singleton)()
/Library/D/dmd/src/phobos/std/datetime/systime.d(524):        called from here: opCall()
/Library/D/dmd/src/phobos/std/datetime/systime.d(472):        called from here: this.this(dateTime, zero(), tz)
test.d(6):        called from here: SysTime(0L, Rebindable(null, )).this(fromISOString("20220101T000000"), null)
-----

I'm sure there must be a better way to do this. But I couldn't find it in the documentation.
August 28, 2020
On Friday, 28 August 2020 at 01:54:02 UTC, Andrej Mitrovic wrote:
> -----
> import std.datetime;
>
> void main ()
> {
>     static time =
>         SysTime(DateTime.fromISOString("20220101T000000")).toUnixTime;
> }
> -----

I think I'm supposed to use MonoTime here, right?

August 28, 2020
On 8/27/20 9:54 PM, Andrej Mitrovic wrote:
> -----
> import std.datetime;
> 
> void main ()
> {
>      static time =
> SysTime(DateTime.fromISOString("20220101T000000")).toUnixTime;
> }
> -----
> 
> -----
> /Library/D/dmd/src/phobos/std/concurrency.d(2574): Error: static variable lock cannot be read at compile time
> /Library/D/dmd/src/phobos/std/concurrency.d(2574):        called from here: atomicLoad(lock)
> /Library/D/dmd/src/phobos/std/concurrency.d(2600):        called from here: initOnceLock()
> /Library/D/dmd/src/phobos/std/concurrency.d(2600):        called from here: initOnce(delegate shared(bool)() pure @nogc @safe => init(), initOnceLock())
> /Library/D/dmd/src/phobos/std/datetime/timezone.d(1106): called from here: initOnce(delegate shared(bool)() pure nothrow @nogc @safe => (*function () nothrow @nogc @safe => true)())
> /Library/D/dmd/src/phobos/std/datetime/timezone.d(546): called from here: (*& singleton)()
> /Library/D/dmd/src/phobos/std/datetime/systime.d(524): called from here: opCall()
> /Library/D/dmd/src/phobos/std/datetime/systime.d(472): called from here: this.this(dateTime, zero(), tz)
> test.d(6):        called from here: SysTime(0L, Rebindable(null, )).this(fromISOString("20220101T000000"), null)
> -----
> 
> I'm sure there must be a better way to do this. But I couldn't find it in the documentation.

It's trying to look up the local timezone at compile time.

You need to specify a time zone:

    static time =
        SysTime(DateTime.fromISOString("20220101T000000"), UTC()).toUnixTime;

-Steve
August 31, 2020
On Friday, 28 August 2020 at 12:35:26 UTC, Steven Schveighoffer wrote:
> It's trying to look up the local timezone at compile time.
>
> You need to specify a time zone:
>
>     static time =
>         SysTime(DateTime.fromISOString("20220101T000000"), UTC()).toUnixTime;
>
> -Steve

Aw, thanks Steve!