@@ -373,7 +373,7 @@ struct Timestamp
373373 {
374374 import std.datetime.timezone : LocalTime;
375375 auto isLocal = systime.timezone is LocalTime();
376- auto thisTimes = isLocal ? systime : systime.toUTC;
376+ auto thisTimes = isLocal ? systime + systime.utcOffset : systime.toUTC;
377377 this = fromUnixTime(thisTimes.toUnixTime);
378378 this .fractionExponent = - 7 ;
379379 this .fractionCoefficient = thisTimes.fracSecs.total! " hnsecs" ;
@@ -593,8 +593,18 @@ struct Timestamp
593593 import std.datetime.date : DateTime ;
594594 import std.datetime.systime : SysTime;
595595 import std.datetime.timezone : UTC , LocalTime, SimpleTimeZone;
596- auto timezone = isLocalTime ? LocalTime() : ! offset ? UTC () : new immutable SimpleTimeZone(offset.minutes);
597- return SysTime.fromUnixTime(toUnixTime, timezone) + getFraction! 7. hnsecs;
596+ auto ret = SysTime.fromUnixTime(toUnixTime, UTC ()) + getFraction! 7. hnsecs;
597+ if (isLocalTime)
598+ {
599+ ret = ret.toLocalTime;
600+ ret -= ret.utcOffset;
601+ }
602+ else
603+ if (offset)
604+ {
605+ ret.timezone = new immutable SimpleTimeZone(offset.minutes);
606+ }
607+ return ret;
598608 }
599609 else
600610 static if (T.stringof == " Duration" )
@@ -1560,3 +1570,15 @@ unittest
15601570 auto ts2 = " 1900-01-01T00:00:00.000000000" .Timestamp;
15611571 assert (ts == ts2);
15621572}
1573+
1574+ version (mir_test)
1575+ @safe unittest
1576+ {
1577+ import std.datetime.systime : SysTime;
1578+ import mir.test;
1579+ auto ts = " 2001-12-15T2:59:43.1234567" .Timestamp;
1580+ ts.toString.should == " 2001-12-15T02:59:43.1234567-00:00" ;
1581+ auto st = cast (SysTime)ts;
1582+ st.toISOExtString.should == " 2001-12-15T02:59:43.1234567" ;
1583+ st.Timestamp.should == ts;
1584+ }
0 commit comments