std.datetime: Getting unix time from 1970

Jonathan M Davis jmdavisProg at gmx.com
Mon Apr 25 11:45:48 PDT 2011


> I am trying to get the number of seconds from 1970 using the
> std.datetime module.
> 
> long val = SysTime(Date(1996, 1, 1)).toUnixTime()
> 
> Shouldnt the above statement give me a Timezone independent result i.e.
> 'toUnixTime'.

unix time is _always_ in UTC by definition.

You're creating a SysTime with the Date of 1996-1-1 at midnight in your local 
time zone. That gets translated to whatever the appropriate time is in UTC and 
is kept internally as hecto-nanoseconds (100 ns) from midnight, January 1st 1 
A.D. in UTC. You're then asking it to give you the unix time as a time_t, so 
it translates the hnsecs from midnight, January 1st 1 A.D. to seconds from 
midnight, January 1st 1970 A.D. The only part of all of that that relates to a 
time zone other than UTC is when you created the SysTime, since it needs a 
time zone to translate from a generic date to hnsecs in UTC, and it defaults 
to using LocalTime.

> Also, is there a method to get seconds directly from Date and DateTime
> instead of creating SysTime.

Date doesn't have seconds. It only has the year, month, and day.

DateTime _does_ have seconds, since it holds both a Date and a TimeOfDay. It 
has the seconds property. This is exactly the same as with SysTime except that 
DateTime holds the seconds internally, so it doesn't have to do any 
calculations to get the seconds, and it doesn't do anything with time zones, 
so it doesn't have to worry about adjusting for that either.

auto dt1 = DateTime(1996, 1, 1, 12, 0, 30);
auto sec1 = dt1.seconds;
assert(sec1 == 30);

auto st = SysTime(dt1);
auto sec2 = st.seconds;
assert(sec1 == sec2);

auto dt2 = cast(DateTime)st;
assert(dt1 == dt2);

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list