Skip to content

Commit 0d1d97c

Browse files
committed
Fix SysTime conversion
1 parent 95f50e5 commit 0d1d97c

1 file changed

Lines changed: 25 additions & 3 deletions

File tree

source/mir/timestamp.d

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)