How do I convert an ISO 8601 datetime into a unix timestamp - at compile-time?

Steven Schveighoffer schveiguy at gmail.com
Fri Aug 28 12:35:26 UTC 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


More information about the Digitalmars-d-learn mailing list