diff --git a/std/datetime/date.d b/std/datetime/date.d index 45f7ad049cc..7498844795c 100644 --- a/std/datetime/date.d +++ b/std/datetime/date.d @@ -7,13 +7,14 @@ +/ module std.datetime.date; -import core.time; +// Note: reconsider using specific imports below after +// https://issues.dlang.org/show_bug.cgi?id=17630 has been fixed +import core.time;// : TimeException; import std.traits : isSomeString, Unqual; import std.typecons : Flag; version(unittest) import std.exception : assertThrown; - @safe unittest { initializeTests(); @@ -2064,6 +2065,7 @@ public: } + import core.time : Duration; /++ Gives the result of adding or subtracting a $(REF Duration, core,time) from this $(LREF DateTime). @@ -2108,6 +2110,8 @@ public: @safe unittest { + import core.time : dur; + auto dt = DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)); assert(dt + dur!"weeks"(7) == DateTime(Date(1999, 8, 24), TimeOfDay(12, 30, 33))); @@ -2155,6 +2159,7 @@ public: assert(idt - duration == DateTime(1999, 7, 6, 12, 30, 21)); } + import core.time : TickDuration; // Explicitly undocumented. It will be removed in January 2018. @@@DEPRECATED_2018-01@@@ deprecated("Use Duration instead of TickDuration.") DateTime opBinary(string op)(in TickDuration td) const @safe pure nothrow @nogc @@ -2213,11 +2218,13 @@ public: else static if (is(Unqual!D == TickDuration)) immutable hnsecs = duration.hnsecs; + import core.time : convert; mixin(format(`return _addSeconds(convert!("hnsecs", "seconds")(%shnsecs));`, op)); } @safe unittest { + import core.time : dur; assert(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)) + dur!"weeks"(7) == DateTime(Date(1999, 8, 24), TimeOfDay(12, 30, 33))); assert(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)) + dur!"weeks"(-7) == @@ -2357,6 +2364,7 @@ public: immutable dateResult = _date - rhs.date; immutable todResult = _tod - rhs._tod; + import core.time : dur; return dur!"hnsecs"(dateResult.total!"hnsecs" + todResult.total!"hnsecs"); } @@ -2364,6 +2372,7 @@ public: { auto dt = DateTime(1999, 7, 6, 12, 30, 33); + import core.time : dur; assert(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)) - DateTime(Date(1998, 7, 6), TimeOfDay(12, 30, 33)) == dur!"seconds"(31_536_000)); assert(DateTime(Date(1998, 7, 6), TimeOfDay(12, 30, 33)) - DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)) == @@ -3458,6 +3467,7 @@ private: +/ ref DateTime _addSeconds(long seconds) return @safe pure nothrow @nogc { + import core.time : convert; long hnsecs = convert!("seconds", "hnsecs")(seconds); hnsecs += convert!("hours", "hnsecs")(_tod._hour); hnsecs += convert!("minutes", "hnsecs")(_tod._minute); @@ -6040,7 +6050,7 @@ public: static assert(!__traits(compiles, idate.roll!"days"(12))); } - + import core.time : Duration; /++ Gives the result of adding or subtracting a $(REF Duration, core,time) from @@ -6080,6 +6090,7 @@ public: { auto date = Date(1999, 7, 6); + import core.time : dur; assert(date + dur!"weeks"(7) == Date(1999, 8, 24)); assert(date + dur!"weeks"(-7) == Date(1999, 5, 18)); assert(date + dur!"days"(7) == Date(1999, 7, 13)); @@ -6128,12 +6139,14 @@ public: assert(idate - duration == Date(1999, 6, 24)); } + import core.time : TickDuration; // Explicitly undocumented. It will be removed in January 2018. @@@DEPRECATED_2018-01@@@ deprecated("Use Duration instead of TickDuration.") Date opBinary(string op)(TickDuration td) const @safe pure nothrow @nogc if (op == "+" || op == "-") { Date retval = this; + import core.time : convert; immutable days = convert!("hnsecs", "days")(td.hnsecs); mixin("return retval._addDays(" ~ op ~ "days);"); } @@ -6180,6 +6193,7 @@ public: @safe unittest { + import core.time : dur; assert(Date(1999, 7, 6) + dur!"weeks"(7) == Date(1999, 8, 24)); assert(Date(1999, 7, 6) + dur!"weeks"(-7) == Date(1999, 5, 18)); assert(Date(1999, 7, 6) + dur!"days"(7) == Date(1999, 7, 13)); @@ -6240,6 +6254,7 @@ public: ref Date opOpAssign(string op)(TickDuration td) @safe pure nothrow @nogc if (op == "+" || op == "-") { + import core.time : convert; immutable days = convert!("seconds", "days")(td.seconds); mixin("return _addDays(" ~ op ~ "days);"); } @@ -6276,7 +6291,6 @@ public: } } - /++ Gives the difference between two $(LREF Date)s. @@ -6289,6 +6303,7 @@ public: Duration opBinary(string op)(in Date rhs) const @safe pure nothrow @nogc if (op == "-") { + import core.time : dur; return dur!"days"(this.dayOfGregorianCal - rhs.dayOfGregorianCal); } @@ -6296,6 +6311,7 @@ public: { auto date = Date(1999, 7, 6); + import core.time : dur; assert(Date(1999, 7, 6) - Date(1998, 7, 6) == dur!"days"(365)); assert(Date(1998, 7, 6) - Date(1999, 7, 6) == dur!"days"(-365)); assert(Date(1999, 6, 6) - Date(1999, 5, 6) == dur!"days"(31)); @@ -8353,6 +8369,7 @@ public: ref TimeOfDay roll(string units)(long value) @safe pure nothrow @nogc if (units == "hours") { + import core.time : dur; return this += dur!"hours"(value); } @@ -8577,6 +8594,7 @@ public: } + import core.time : Duration; /++ Gives the result of adding or subtracting a $(REF Duration, core,time) from this $(LREF TimeOfDay). @@ -8621,6 +8639,7 @@ public: { auto tod = TimeOfDay(12, 30, 33); + import core.time : dur; assert(tod + dur!"hours"(7) == TimeOfDay(19, 30, 33)); assert(tod + dur!"hours"(-7) == TimeOfDay(5, 30, 33)); assert(tod + dur!"minutes"(7) == TimeOfDay(12, 37, 33)); @@ -8661,6 +8680,7 @@ public: assert(itod - duration == TimeOfDay(1, 30, 33)); } + import core.time : TickDuration; // Explicitly undocumented. It will be removed in January 2018. @@@DEPRECATED_2018-01@@@ deprecated("Use Duration instead of TickDuration.") TimeOfDay opBinary(string op)(TickDuration td) const @safe pure nothrow @nogc @@ -8714,6 +8734,7 @@ public: @safe unittest { + import core.time : dur; auto duration = dur!"hours"(12); assert(TimeOfDay(12, 30, 33) + dur!"hours"(7) == TimeOfDay(19, 30, 33)); @@ -8817,6 +8838,7 @@ public: immutable lhsSec = _hour * 3600 + _minute * 60 + _second; immutable rhsSec = rhs._hour * 3600 + rhs._minute * 60 + rhs._second; + import core.time : dur; return dur!"seconds"(lhsSec - rhsSec); } @@ -8824,6 +8846,7 @@ public: { auto tod = TimeOfDay(12, 30, 33); + import core.time : dur; assert(TimeOfDay(7, 12, 52) - TimeOfDay(12, 30, 33) == dur!"seconds"(-19_061)); assert(TimeOfDay(12, 30, 33) - TimeOfDay(7, 12, 52) == dur!"seconds"(19_061)); assert(TimeOfDay(12, 30, 33) - TimeOfDay(14, 30, 33) == dur!"seconds"(-7200)); @@ -9253,6 +9276,7 @@ private: +/ ref TimeOfDay _addSeconds(long seconds) return @safe pure nothrow @nogc { + import core.time : convert; long hnsecs = convert!("seconds", "hnsecs")(seconds); hnsecs += convert!("hours", "hnsecs")(_hour); hnsecs += convert!("minutes", "hnsecs")(_minute); diff --git a/std/datetime/systime.d b/std/datetime/systime.d index 0c7ccebc159..bd3e837adfd 100644 --- a/std/datetime/systime.d +++ b/std/datetime/systime.d @@ -7,9 +7,13 @@ +/ module std.datetime.systime; -import core.time; -import std.datetime.date; -import std.datetime.timezone; +// Note: reconsider using specific imports below after +// https://issues.dlang.org/show_bug.cgi?id=17630 has been fixed +import core.time;// : ClockType, convert, dur, Duration, seconds, TickDuration, TimeException; +import std.datetime.date;// : _monthNames, AllowDayOverflow, CmpTimeUnits, Date, + //DateTime, DateTimeException, DayOfWeek, enforceValid, getDayOfWeek, maxDay, + //Month, splitUnitsFromHNSecs, TimeOfDay, validTimeUnits, yearIsLeapYear; +import std.datetime.timezone;// : LocalTime, SimpleTimeZone, TimeZone, UTC; import std.exception : enforce; import std.format : format; import std.range.primitives; @@ -70,6 +74,7 @@ public: { import std.format : format; import std.stdio : writefln; + import core.time; assert(currTime().timezone is LocalTime()); assert(currTime(UTC()).timezone is UTC()); @@ -426,6 +431,7 @@ public: @safe unittest { + import core.time; static void test(DateTime dt, Duration fracSecs, immutable TimeZone tz, long expected) { auto sysTime = SysTime(dt, fracSecs, tz); @@ -1729,6 +1735,7 @@ public: @safe unittest { import std.range : chain; + import core.time; assert(SysTime(0, UTC()).fracSecs == Duration.zero); assert(SysTime(1, UTC()).fracSecs == hnsecs(1)); @@ -1822,6 +1829,7 @@ public: @safe unittest { import std.range : chain; + import core.time; foreach (fracSec; testFracSecs) { @@ -1856,6 +1864,7 @@ public: @safe unittest { + import core.time; assert(SysTime(0).stdTime == 0); assert(SysTime(1).stdTime == 1); assert(SysTime(-1).stdTime == -1); @@ -1883,6 +1892,7 @@ public: @safe unittest { + import core.time; static void test(long stdTime, in SysTime expected, size_t line = __LINE__) { auto st = SysTime(0, UTC()); @@ -1967,6 +1977,7 @@ public: @safe unittest { + import core.time; { auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), hnsecs(27)); assert(sysTime == sysTime.toLocalTime()); @@ -1999,6 +2010,7 @@ public: @safe unittest { + import core.time; auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), hnsecs(27)); assert(sysTime == sysTime.toUTC()); assert(sysTime._stdTime == sysTime.toUTC()._stdTime); @@ -2022,6 +2034,7 @@ public: @safe unittest { + import core.time; auto stz = new immutable SimpleTimeZone(dur!"minutes"(11 * 60)); auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), hnsecs(27)); assert(sysTime == sysTime.toOtherTZ(stz)); @@ -2089,6 +2102,7 @@ public: @safe unittest { import std.meta : AliasSeq; + import core.time; assert(SysTime(DateTime(1970, 1, 1), UTC()).toUnixTime() == 0); foreach (units; AliasSeq!("hnsecs", "usecs", "msecs")) assert(SysTime(DateTime(1970, 1, 1, 0, 0, 0), dur!units(1), UTC()).toUnixTime() == 0); @@ -2146,6 +2160,7 @@ public: @safe unittest { + import core.time; assert(SysTime.fromUnixTime(0) == SysTime(DateTime(1970, 1, 1), UTC())); assert(SysTime.fromUnixTime(1) == SysTime(DateTime(1970, 1, 1, 0, 0, 1), UTC())); assert(SysTime.fromUnixTime(-1) == SysTime(DateTime(1969, 12, 31, 23, 59, 59), UTC())); @@ -2181,6 +2196,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(1970, 1, 1), UTC()).toTimeVal() == timeval(0, 0)); assert(SysTime(DateTime(1970, 1, 1), hnsecs(9), UTC()).toTimeVal() == timeval(0, 0)); assert(SysTime(DateTime(1970, 1, 1), hnsecs(10), UTC()).toTimeVal() == timeval(0, 1)); @@ -2224,6 +2240,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(1970, 1, 1), UTC()).toTimeSpec() == timespec(0, 0)); assert(SysTime(DateTime(1970, 1, 1), hnsecs(9), UTC()).toTimeSpec() == timespec(0, 900)); assert(SysTime(DateTime(1970, 1, 1), hnsecs(10), UTC()).toTimeSpec() == timespec(0, 1000)); @@ -2284,11 +2301,13 @@ public: @system unittest { import std.conv : to; + import core.time; version(Posix) { - scope(exit) clearTZEnvVar(); + import std.datetime.timezone : clearTZEnvVar, setTZEnvVar; setTZEnvVar("America/Los_Angeles"); + scope(exit) clearTZEnvVar(); } { @@ -2411,6 +2430,7 @@ public: // Test add!"years"() with AllowDayOverflow.yes @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -2613,6 +2633,7 @@ public: // Test add!"years"() with AllowDayOverflow.no @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -2818,6 +2839,7 @@ public: // Test add!"months"() with AllowDayOverflow.yes @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -3164,6 +3186,7 @@ public: // Test add!"months"() with AllowDayOverflow.no @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -3600,6 +3623,7 @@ public: // Test roll!"months"() with AllowDayOverflow.yes @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -3978,6 +4002,7 @@ public: // Test roll!"months"() with AllowDayOverflow.no @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 7, 6)); @@ -4455,6 +4480,7 @@ public: @safe unittest { + import core.time; // Test A.D. { auto sysTime = SysTime(Date(1999, 2, 28)); @@ -4773,6 +4799,7 @@ public: // Test roll!"hours"(). @safe unittest { + import core.time; static void testST(SysTime orig, int hours, in SysTime expected, size_t line = __LINE__) { orig.roll!"hours"(hours); @@ -4990,6 +5017,7 @@ public: // Test roll!"minutes"(). @safe unittest { + import core.time; static void testST(SysTime orig, int minutes, in SysTime expected, size_t line = __LINE__) { orig.roll!"minutes"(minutes); @@ -5200,6 +5228,7 @@ public: // Test roll!"seconds"(). @safe unittest { + import core.time; static void testST(SysTime orig, int seconds, in SysTime expected, size_t line = __LINE__) { orig.roll!"seconds"(seconds); @@ -5417,6 +5446,7 @@ public: // Test roll!"msecs"(). @safe unittest { + import core.time; static void testST(SysTime orig, int milliseconds, in SysTime expected, size_t line = __LINE__) { orig.roll!"msecs"(milliseconds); @@ -5522,6 +5552,7 @@ public: // Test roll!"usecs"(). @safe unittest { + import core.time; static void testST(SysTime orig, long microseconds, in SysTime expected, size_t line = __LINE__) { orig.roll!"usecs"(microseconds); @@ -5651,6 +5682,7 @@ public: // Test roll!"hnsecs"(). @safe unittest { + import core.time; static void testST(SysTime orig, long hnsecs, in SysTime expected, size_t line = __LINE__) { orig.roll!"hnsecs"(hnsecs); @@ -5836,6 +5868,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33), hnsecs(2_345_678)); assert(st + dur!"weeks"(7) == SysTime(DateTime(1999, 8, 24, 12, 30, 33), hnsecs(2_345_678))); @@ -6016,6 +6049,7 @@ public: deprecated @safe unittest { + import core.time; // This probably only runs in cases where gettimeofday() is used, but it's // hard to do this test correctly with variable ticksPerSec. if (TickDuration.ticksPerSec == 1_000_000) @@ -6057,6 +6091,7 @@ public: @safe unittest { + import core.time; auto before = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); assert(before + dur!"weeks"(7) == SysTime(DateTime(1999, 8, 24, 12, 30, 33))); assert(before + dur!"weeks"(-7) == SysTime(DateTime(1999, 5, 18, 12, 30, 33))); @@ -6245,6 +6280,7 @@ public: deprecated @safe unittest { + import core.time; // This probably only runs in cases where gettimeofday() is used, but it's // hard to do this test correctly with variable ticksPerSec. if (TickDuration.ticksPerSec == 1_000_000) @@ -6292,6 +6328,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1998, 7, 6, 12, 30, 33)) == dur!"seconds"(31_536_000)); assert(SysTime(DateTime(1998, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)) == @@ -6345,9 +6382,15 @@ public: dur!"hnsecs"(-1)); version(Posix) + { + import std.datetime.timezone : PosixTimeZone; immutable tz = PosixTimeZone.getTimeZone("America/Los_Angeles"); + } else version(Windows) + { + import std.datetime.timezone : WindowsTimeZone; immutable tz = WindowsTimeZone.getTimeZone("Pacific Standard Time"); + } { auto dt = DateTime(2011, 1, 13, 8, 17, 2); @@ -6403,6 +6446,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : Date; assert(SysTime(Date(1999, 2, 1)).diffMonths( @@ -6420,6 +6464,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -6447,6 +6492,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -6466,6 +6512,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -6486,6 +6533,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : DateTime; assert(SysTime(DateTime(1999, 1, 1, 12, 22, 7)).dayOfYear == 1); @@ -6495,6 +6543,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -6527,6 +6576,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -6559,6 +6609,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : DateTime; assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).dayOfGregorianCal == 1); @@ -6575,6 +6626,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).dayOfGregorianCal == 1); assert(SysTime(DateTime(1, 1, 1, 0, 0, 0), hnsecs(1)).dayOfGregorianCal == 1); @@ -6746,6 +6798,7 @@ public: // between Date and SysTime. @safe unittest { + import core.time; void test(Date date, SysTime st, size_t line = __LINE__) { if (date.dayOfGregorianCal != st.dayOfGregorianCal) @@ -6933,6 +6986,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : DateTime; auto st = SysTime(DateTime(0, 1, 1, 12, 0, 0)); @@ -6963,6 +7017,7 @@ public: @safe unittest { + import core.time; void testST(SysTime orig, int day, in SysTime expected, size_t line = __LINE__) { orig.dayOfGregorianCal = day; @@ -7175,6 +7230,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : Date; auto st = SysTime(Date(1999, 7, 6)); @@ -7237,6 +7293,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(Date(1999, 1, 1)).endOfMonth == SysTime(DateTime(1999, 1, 31, 23, 59, 59), hnsecs(9_999_999))); assert(SysTime(Date(1999, 2, 1)).endOfMonth == SysTime(DateTime(1999, 2, 28, 23, 59, 59), hnsecs(9_999_999))); @@ -7288,6 +7345,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : DateTime; assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).daysInMonth == 31); @@ -7298,6 +7356,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(DateTime(1999, 1, 1, 12, 1, 13)).daysInMonth == 31); assert(SysTime(DateTime(1999, 2, 1, 17, 13, 12)).daysInMonth == 28); @@ -7346,6 +7405,7 @@ public: /// @safe unittest { + import core.time; import std.datetime.date : DateTime; assert(SysTime(DateTime(1, 1, 1, 12, 7, 0)).isAD); @@ -7356,6 +7416,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(2010, 7, 4, 12, 0, 9)).isAD); assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).isAD); assert(!SysTime(DateTime(0, 12, 31, 23, 59, 59)).isAD); @@ -7385,6 +7446,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(-4713, 11, 24, 0, 0, 0)).julianDay == -1); assert(SysTime(DateTime(-4713, 11, 24, 12, 0, 0)).julianDay == 0); @@ -7428,6 +7490,7 @@ public: @safe unittest { + import core.time; assert(SysTime(DateTime(1858, 11, 17, 0, 0, 0)).modJulianDay == 0); assert(SysTime(DateTime(1858, 11, 17, 12, 0, 0)).modJulianDay == 0); @@ -7452,6 +7515,7 @@ public: @safe unittest { + import core.time; assert(cast(Date) SysTime(Date(1999, 7, 6)) == Date(1999, 7, 6)); assert(cast(Date) SysTime(Date(2000, 12, 31)) == Date(2000, 12, 31)); assert(cast(Date) SysTime(Date(2001, 1, 1)) == Date(2001, 1, 1)); @@ -7505,6 +7569,7 @@ public: @safe unittest { + import core.time; assert(cast(DateTime) SysTime(DateTime(1, 1, 6, 7, 12, 22)) == DateTime(1, 1, 6, 7, 12, 22)); assert(cast(DateTime) SysTime(DateTime(1, 1, 6, 7, 12, 22), msecs(22)) == DateTime(1, 1, 6, 7, 12, 22)); assert(cast(DateTime) SysTime(Date(1999, 7, 6)) == DateTime(1999, 7, 6, 0, 0, 0)); @@ -7562,6 +7627,7 @@ public: @safe unittest { + import core.time; assert(cast(TimeOfDay) SysTime(Date(1999, 7, 6)) == TimeOfDay(0, 0, 0)); assert(cast(TimeOfDay) SysTime(Date(2000, 12, 31)) == TimeOfDay(0, 0, 0)); assert(cast(TimeOfDay) SysTime(Date(2001, 1, 1)) == TimeOfDay(0, 0, 0)); @@ -7689,6 +7755,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(DateTime.init, UTC()).toISOString() == "00010101T000000Z"); assert(SysTime(DateTime(1, 1, 1, 0, 0, 0), hnsecs(1), UTC()).toISOString() == "00010101T000000.0000001Z"); @@ -7821,6 +7888,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(DateTime.init, UTC()).toISOExtString() == "0001-01-01T00:00:00Z"); assert(SysTime(DateTime(1, 1, 1, 0, 0, 0), hnsecs(1), UTC()).toISOExtString() == @@ -7957,6 +8025,7 @@ public: @safe unittest { + import core.time; // Test A.D. assert(SysTime(DateTime.init, UTC()).toString() == "0001-Jan-01 00:00:00Z"); assert(SysTime(DateTime(1, 1, 1, 0, 0, 0), hnsecs(1), UTC()).toString() == "0001-Jan-01 00:00:00.0000001Z"); @@ -8045,6 +8114,7 @@ public: @safe unittest { + import core.time; auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); @@ -8204,6 +8274,7 @@ public: @safe unittest { + import core.time; foreach (str; ["", "20100704000000", "20100704 000000", "20100704t000000", "20100704T000000.", "20100704T000000.A", "20100704T000000.Z", "20100704T000000.0000000A", "20100704T000000.00000000A", @@ -8467,6 +8538,7 @@ public: @safe unittest { + import core.time; foreach (str; ["", "20100704000000", "20100704 000000", "20100704t000000", "20100704T000000.", "20100704T000000.0", "2010-07:0400:00:00", "2010-07-04 00:00:00", @@ -8560,6 +8632,7 @@ public: // bug# 17801 @safe unittest { + import core.time; import std.conv : to; import std.meta : AliasSeq; foreach (C; AliasSeq!(char, wchar, dchar)) @@ -8709,6 +8782,7 @@ public: @safe unittest { + import core.time; foreach (str; ["", "20100704000000", "20100704 000000", "20100704t000000", "20100704T000000.", "20100704T000000.0", "2010-07-0400:00:00", "2010-07-04 00:00:00", "2010-07-04t00:00:00", @@ -8804,6 +8878,7 @@ public: // bug# 17801 @safe unittest { + import core.time; import std.conv : to; import std.meta : AliasSeq; foreach (C; AliasSeq!(char, wchar, dchar)) @@ -9228,6 +9303,7 @@ else version(Windows) auto dt = DateTime(st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond); + import core.time : msecs; return SysTime(dt, msecs(st.wMilliseconds), tz); } @@ -9237,7 +9313,7 @@ else version(Windows) SYSTEMTIME st = void; GetSystemTime(&st); auto converted = SYSTEMTIMEToSysTime(&st, UTC()); - + import core.time : abs; assert(abs((converted - sysTime)) <= dur!"seconds"(2)); } @@ -9314,6 +9390,7 @@ else version(Windows) auto converted = FILETIMEToSysTime(&ft); + import core.time : abs; assert(abs((converted - sysTime)) <= dur!"seconds"(2)); } @@ -9723,6 +9800,7 @@ version(unittest) void testBadParse822(alias cr)(string str, size_t line = __LIN @system unittest { + import core.time; import std.algorithm.iteration : filter, map; import std.algorithm.searching : canFind; import std.array : array; @@ -10275,6 +10353,7 @@ if (isSomeString!S) import std.ascii : isDigit; import std.conv : to; import std.string : representation; + import core.time; if (isoString.empty) return Duration.zero; @@ -10300,6 +10379,7 @@ if (isSomeString!S) @safe unittest { + import core.time; static void testFSInvalid(string isoString) { fracSecsFromISOString(isoString); @@ -10914,6 +10994,7 @@ version(unittest) void initializeTests() @safe { + import core.time; import std.algorithm.sorting : sort; import std.typecons : Rebindable; immutable lt = LocalTime().utcToTZ(0); @@ -10921,11 +11002,13 @@ version(unittest) version(Posix) { + import std.datetime.timezone : PosixTimeZone; immutable otherTZ = lt < 0 ? PosixTimeZone.getTimeZone("Australia/Sydney") : PosixTimeZone.getTimeZone("America/Denver"); } else version(Windows) { + import std.datetime.timezone : WindowsTimeZone; immutable otherTZ = lt < 0 ? WindowsTimeZone.getTimeZone("AUS Eastern Standard Time") : WindowsTimeZone.getTimeZone("Mountain Standard Time"); } diff --git a/std/datetime/timezone.d b/std/datetime/timezone.d index 4743292c9c5..4b5c6e8a5cf 100644 --- a/std/datetime/timezone.d +++ b/std/datetime/timezone.d @@ -7,11 +7,11 @@ +/ module std.datetime.timezone; -import core.time; -import std.datetime.date; -import std.datetime.systime; -import std.exception : enforce; -import std.range.primitives; +// Note: reconsider using specific imports below after +// https://issues.dlang.org/show_bug.cgi?id=17630 has been fixed +import core.time;// : abs, convert, dur, Duration, hours, minutes; +import std.datetime.systime;// : Clock, stdTimeToUnixTime, SysTime; +import std.range.primitives;// : back, front, empty, popFront; import std.traits : isIntegral, isSomeString, Unqual; version(Windows) @@ -150,6 +150,7 @@ public: return PosixTimeZone.getTimeZone(name); else version(Windows) { + import std.datetime.date : DateTimeException; import std.format : format; auto windowsTZName = tzDatabaseNameToWindowsTZName(name); if (windowsTZName != null) @@ -237,6 +238,7 @@ public: //assert(tz.dstName == dstName); //Locale-dependent assert(tz.hasDST == hasDST); + import std.datetime.date : DateTime; immutable stdDate = DateTime(2010, north ? 1 : 7, 1, 6, 0, 0); immutable dstDate = DateTime(2010, north ? 7 : 1, 1, 6, 0, 0); auto std = SysTime(stdDate, tz); @@ -316,6 +318,7 @@ public: return tz; } + import std.datetime.date : DateTime; auto dstSwitches = [/+America/Los_Angeles+/ tuple(DateTime(2012, 3, 11), DateTime(2012, 11, 4), 2, 2), /+America/New_York+/ tuple(DateTime(2012, 3, 11), DateTime(2012, 11, 4), 2, 2), ///+America/Santiago+/ tuple(DateTime(2011, 8, 21), DateTime(2011, 5, 8), 0, 0), @@ -323,6 +326,7 @@ public: /+Europe/Paris+/ tuple(DateTime(2012, 3, 25), DateTime(2012, 10, 28), 2, 3), /+Australia/Adelaide+/ tuple(DateTime(2012, 10, 7), DateTime(2012, 4, 1), 2, 3)]; + import std.datetime.date : DateTimeException; version(Posix) { version(FreeBSD) enum utcZone = "Etc/UTC"; @@ -382,6 +386,7 @@ public: // a DST switch. foreach (hour; -12 .. 13) { + import std.exception : enforce; auto st = SysTime(dstSwitches[i][0] + dur!"hours"(hour), tz); immutable targetHour = hour < 0 ? hour + 24 : hour; @@ -457,6 +462,7 @@ public: __FILE__, line); } + import std.exception : enforce; enforce((utc + offset).hour == local.hour, msg("1")); enforce((utc + offset + dur!"minutes"(1)).hour == local.hour, msg("2")); } @@ -530,6 +536,7 @@ public: // leaving it commented out until I can sort it out. //assert(equal(tzNames, tzNames.uniq())); + import std.datetime.date : DateTimeException; foreach (tzName; tzNames) assertNotThrown!DateTimeException(testPZSuccess(tzName)); } @@ -792,6 +799,7 @@ public: { try { + import std.datetime.date : Date; auto currYear = (cast(Date) Clock.currTime()).year; auto janOffset = SysTime(Date(currYear, 1, 4), cast(immutable) this).stdTime - SysTime(Date(currYear, 1, 4), UTC()).stdTime; @@ -980,6 +988,7 @@ public: { scope(exit) clearTZEnvVar(); + import std.datetime.date : DateTime; auto tzInfos = [tuple("America/Los_Angeles", DateTime(2012, 3, 11), DateTime(2012, 11, 4), 2, 2), tuple("America/New_York", DateTime(2012, 3, 11), DateTime(2012, 11, 4), 2, 2), //tuple("America/Santiago", DateTime(2011, 8, 21), DateTime(2011, 5, 8), 0, 0), @@ -990,6 +999,7 @@ public: foreach (i; 0 .. tzInfos.length) { + import std.exception : enforce; auto tzName = tzInfos[i][0]; setTZEnvVar(tzName); immutable spring = tzInfos[i][3]; @@ -1209,6 +1219,7 @@ public: scope(exit) clearTZEnvVar(); setTZEnvVar("UTC"); + import std.datetime.date : Date; auto std = SysTime(Date(2010, 1, 1)); auto dst = SysTime(Date(2010, 7, 1)); assert(UTC().utcToTZ(std.stdTime) == std.stdTime); @@ -1241,6 +1252,7 @@ public: scope(exit) clearTZEnvVar(); setTZEnvVar("UTC"); + import std.datetime.date : Date; auto std = SysTime(Date(2010, 1, 1)); auto dst = SysTime(Date(2010, 7, 1)); assert(UTC().tzToUTC(std.stdTime) == std.stdTime); @@ -1385,6 +1397,8 @@ public: this(Duration utcOffset, string stdName = "") @safe immutable pure { // FIXME This probably needs to be changed to something like (-12 - 13). + import std.datetime.date : DateTimeException; + import std.exception : enforce; enforce!DateTimeException(abs(utcOffset) < dur!"minutes"(1440), "Offset from UTC must be within range (-24:00 - 24:00)."); super("", stdName, ""); @@ -1424,6 +1438,8 @@ package: +/ static string toISOString(Duration utcOffset) @safe pure { + import std.datetime.date : DateTimeException; + import std.exception : enforce; import std.format : format; immutable absOffset = abs(utcOffset); enforce!DateTimeException(absOffset < dur!"minutes"(1440), @@ -1441,6 +1457,7 @@ package: return SimpleTimeZone.toISOString(offset); } + import std.datetime.date : DateTimeException; assertThrown!DateTimeException(testSTZInvalid(dur!"minutes"(1440))); assertThrown!DateTimeException(testSTZInvalid(dur!"minutes"(-1440))); @@ -1476,7 +1493,9 @@ package: +/ static string toISOExtString(Duration utcOffset) @safe pure { + import std.datetime.date : DateTimeException; import std.format : format; + import std.exception : enforce; immutable absOffset = abs(utcOffset); enforce!DateTimeException(absOffset < dur!"minutes"(1440), @@ -1494,6 +1513,7 @@ package: return SimpleTimeZone.toISOExtString(offset); } + import std.datetime.date : DateTimeException; assertThrown!DateTimeException(testSTZInvalid(dur!"minutes"(1440))); assertThrown!DateTimeException(testSTZInvalid(dur!"minutes"(-1440))); @@ -1534,6 +1554,8 @@ package: import std.algorithm.searching : startsWith, countUntil, all; import std.ascii : isDigit; import std.conv : to; + import std.datetime.date : DateTimeException; + import std.exception : enforce; import std.format : format; auto dstr = to!dstring(isoString); @@ -1582,6 +1604,7 @@ package: "-ab:cd", "+abcd", "-0Z:00", "-Z", "-00Z", "01:00", "12:00", "23:59"]) { + import std.datetime.date : DateTimeException; assertThrown!DateTimeException(SimpleTimeZone.fromISOString(str), format("[%s]", str)); } @@ -1678,10 +1701,12 @@ package: import std.algorithm.searching : startsWith, countUntil, all; import std.ascii : isDigit; import std.conv : to; + import std.exception : enforce; import std.format : format; auto dstr = to!dstring(isoExtString); + import std.datetime.date : DateTimeException; enforce!DateTimeException(dstr.startsWith('-', '+'), "Invalid ISO String"); auto sign = dstr.startsWith('-') ? -1 : 1; @@ -1733,6 +1758,7 @@ package: "-ab:cd", "abcd", "-0Z:00", "-Z", "-00Z", "0100", "1200", "2359"]) { + import std.datetime.date : DateTimeException; assertThrown!DateTimeException(SimpleTimeZone.fromISOExtString(str), format("[%s]", str)); } @@ -2018,6 +2044,8 @@ public: { import std.algorithm.sorting : sort; import std.conv : to; + import std.datetime.date : DateTimeException; + import std.exception : enforce; import std.format : format; import std.path : asNormalizedPath, chainPath; import std.range : retro; @@ -2044,6 +2072,7 @@ public: version(Android) tzFile.seek(*tzfileOffset); immutable gmtZone = name.representation().canFind("GMT"); + import std.datetime.date : DateTimeException; try { _enforceValidTZFile(readVal!(char[])(tzFile, 4) == "TZif"); @@ -2366,6 +2395,7 @@ public: { import std.algorithm.sorting : sort; import std.array : appender; + import std.exception : enforce; import std.format : format; version(Posix) @@ -2377,6 +2407,7 @@ public: subName = replace(strip(subName), "/", dirSeparator); } + import std.datetime.date : DateTimeException; enforce(tzDatabaseDir.exists(), new DateTimeException(format("Directory %s does not exist.", tzDatabaseDir))); enforce(tzDatabaseDir.isDir, new DateTimeException(format("%s is not a directory.", tzDatabaseDir))); @@ -2434,6 +2465,7 @@ public: auto tzNames = getInstalledTZNames(); + import std.datetime.date : DateTimeException; foreach (tzName; tzNames) assertNotThrown!DateTimeException(testPTZSuccess(tzName)); @@ -2618,6 +2650,7 @@ private: +/ static void _enforceValidTZFile(bool result, size_t line = __LINE__) @safe pure { + import std.datetime.date : DateTimeException; if (!result) throw new DateTimeException("Not a valid tzdata file.", __FILE__, line); } @@ -2966,6 +2999,7 @@ else version(Windows) return new immutable WindowsTimeZone(name, tzInfo); } + import std.datetime.date : DateTimeException; throw new DateTimeException(format("Failed to find time zone: %s", name)); } @@ -2995,6 +3029,7 @@ else version(Windows) auto tzNames = getInstalledTZNames(); + import std.datetime.date : DateTimeException; foreach (tzName; tzNames) assertNotThrown!DateTimeException(testWTZSuccess(tzName)); } @@ -3009,11 +3044,13 @@ else version(Windows) if (tzInfo.DaylightDate.wMonth == 0) return false; + import std.datetime.date : DateTime, Month; auto utcDateTime = cast(DateTime) SysTime(stdTime, UTC()); //The limits of what SystemTimeToTzSpecificLocalTime will accept. if (utcDateTime.year < 1601) { + import std.datetime.date : Month; if (utcDateTime.month == Month.feb && utcDateTime.day == 29) utcDateTime.day = 28; utcDateTime.year = 1601; @@ -3078,6 +3115,7 @@ else version(Windows) TIME_ZONE_INFORMATION tzInfo; GetTimeZoneInformation(&tzInfo); + import std.datetime.date : DateTime; foreach (year; [1600, 1601, 30_827, 30_828]) WindowsTimeZone._dstInEffect(&tzInfo, SysTime(DateTime(year, 1, 1)).stdTime); } @@ -3098,6 +3136,7 @@ else version(Windows) { try { + import std.datetime.date : DateTime, Month; bool dstInEffectForLocalDateTime(DateTime localDateTime) { // The limits of what SystemTimeToTzSpecificLocalTime will accept. @@ -3162,6 +3201,7 @@ else version(Windows) return false; } + import std.datetime.date : DateTime; auto localDateTime = cast(DateTime) SysTime(adjTime, UTC()); auto localDateTimeBefore = localDateTime - dur!"hours"(1); auto localDateTimeAfter = localDateTime + dur!"hours"(1); @@ -3337,6 +3377,7 @@ TZConversions parseTZConversions(string windowsZonesXMLText) @safe pure foreach (line; windowsZonesXMLText.lineSplitter()) { + import std.exception : enforce; // Sample line: //