Changeset 2361

Show
Ignore:
Timestamp:
01/22/11 04:48:29 (1 year ago)
Author:
jmdavis
Message:

Various adjustments to the documentation in std.datetime and std.file.

This should fix the current ddoc build errors or Windows.

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/docsrc/std.ddoc

    r2257 r2361  
    166166    $(LI <a href="std_ctype.html" title="Simple character classification">std.ctype</a>) 
    167167    $(LI <a href="std_date.html" title="Date and time functions">std.date</a>) 
     168    $(LI <a href="std_datetime.html" title="Date and time functions">std.datetime</a>) 
    168169    $(LI <a href="std_demangle.html" title="Demangle D names">std.demangle</a>) 
    169170    $(LI <a href="std_encoding.html" title="Character and string encoding">std.encoding</a>) 
  • trunk/phobos/std/datetime.d

    r2353 r2361  
    66    This module provides: 
    77    $(UL 
    8         $(LI Types to represent points in time: SysTime, Date, TimeOfDay, and DateTime.) 
     8        $(LI Types to represent points in time: $(D_PARAM SysTime), $(D_PARAM Date), 
     9             $(D_PARAM TimeOfDay), and $(D_PARAM DateTime).) 
    910        $(LI Types to represent durations of time.) 
    1011        $(LI Types to represent intervals of time.) 
    1112        $(LI Types to represent ranges over intervals of time.) 
    12         $(LI Types to represent time zones (used by SysTime).) 
    13         $(LI A platform-independent, high precision stop watch type: StopWatch
     13        $(LI Types to represent time zones (used by $(D_PARAM SysTime)).) 
     14        $(LI A platform-independent, high precision stop watch type: $(D_PARAM StopWatch)
    1415        $(LI Benchmarking functions.) 
    1516        $(LI Various helper functions.) 
     
    3637    series of time points. 
    3738 
    38     The types that the typical user is most likely to be interested in are Date 
    39     (if they want dates but don't care about time), DateTime (if they want dates 
    40     and times but don't care about time zones), SysTime (if they want the date 
     39    The types that the typical user is most likely to be interested in are $(D_PARAM Date) 
     40    (if they want dates but don't care about time), $(D_PARAM DateTime) (if they want dates 
     41    and times but don't care about time zones), $(D_PARAM SysTime) (if they want the date 
    4142    and time from the OS and/or do care about time zones), and StopWatch (a 
    42     platform-independent, high precision stop watch). Date and DateTime are 
    43     optimized for calendar-based operations, while SysTime is designed for dealing 
    44     with time from the OS. Check out their specific documentation for more details. 
    45  
    46     To get the current time, use $(D Clock.currTime()). It will return the current 
    47     time as a SysTime. If you want to print it, simple $(D toString()) will do, 
    48     but if you use one of $(D toISOString()), $(D toISOExtendedString()), or 
    49     $(D toSimpleString()), you can use the corresponding $(D fromISOString()), 
    50     $(D fromISOExtendedString()), or $(D fromISOExtendedString()) to create a 
    51     $(D SysTime) from the string. 
     43    platform-independent, high precision stop watch). $(D_PARAM Date) and $(D_PARAM DateTime) 
     44    are optimized for calendar-based operations, while $(D_PARAM SysTime) is designed 
     45    for dealing with time from the OS. Check out their specific documentation for 
     46    more details. 
     47 
     48    To get the current time, use $(D_PARAM Clock.currTime(. It will return the current 
     49    time as a $(D_PARAM SysTime). If you want to print it, simple $(D_PARAM toString) will do, 
     50    but if you use one of $(D_PARAM toISOString), $(D_PARAM toISOExtendedString), or 
     51    $(D_PARAM toSimpleString), you can use the corresponding $(D_PARAM fromISOString), 
     52    $(D_PARAM fromISOExtendedString), or $(D_PARAM fromISOExtendedString) to create a 
     53    $(D_PARAM SysTime) from the string. 
    5254 
    5355    Examples: 
     
    6971    Note: 
    7072        core.time is publicly imported by std.datetime, so if you're using 
    71         std.datetime, you don't need to import core.time. Also, DateTimeException 
     73        std.datetime, you don't need to import core.time. Also, $(D_PARAM DateTimeException) 
    7274        is an alias for core.time's TimeException, so you don't need to worry 
    7375        about core.time functions and std.datetime functions throwing a different 
    7476        type of exception (except in the rare case that they throw something other 
    75         than TimeException or DateTimeException). 
     77        than $(D_PARAM TimeException) or $(D_PARAM DateTimeException)). 
    7678 
    7779    See_Also: 
    78         <a href="http://en.wikipedia.org/wiki/ISO_8601">ISO 8601</a> 
    79         <a href="http://en.wikipedia.org/wiki/Tz_database">Wikipedia entry on TZ Database</a> 
    80         <a href="http://en.wikipedia.org/wiki/List_of_tz_database_time_zones">List of Time Zones</a> 
     80        $(WEB en.wikipedia.org/wiki/ISO_8601, ISO 8601) 
     81        $(WEB en.wikipedia.org/wiki/Tz_database, Wikipedia entry on TZ Database) 
     82        $(WEB en.wikipedia.org/wiki/List_of_tz_database_time_zones, List of Time Zones) 
    8183 
    8284    Copyright: Copyright 2010 
    83     License:   <a href="http://www.boost.org/LICENSE_1_0.txt">Boost License 1.0</a>
     85    License:   $(WEB www.boost.org/LICENSE_1_0.txt, Boost License 1.0)
    8486    Authors:   Jonathan M Davis and Kato Shoichi 
    8587+/ 
     
    306308 
    307309//============================================================================== 
     310// Section with other types. 
     311//============================================================================== 
     312 
     313/++ 
     314    Exception type used by std.datetime. 
     315  +/ 
     316alias TimeException DateTimeException; 
     317 
     318 
     319/++ 
     320    Effectively a namespace to make it clear where its methods are getting 
     321    their time from. It cannot be instantiated. 
     322 +/ 
     323final class Clock 
     324{ 
     325public: 
     326 
     327    /++ 
     328        Returns the current time in the local timezone. 
     329      +/ 
     330    static SysTime currTime(immutable TimeZone tz = LocalTime()) 
     331    { 
     332        return SysTime(currStdTime, tz); 
     333    } 
     334 
     335    unittest 
     336    { 
     337        version(enableWindowsTest) 
     338        { 
     339            assert(currTime(UTC()).timezone is UTC()); 
     340 
     341            immutable unixTimeD = currTime().toUnixTime(); 
     342            immutable unixTimeC = core.stdc.time.time(null); 
     343            immutable diff = unixTimeC - unixTimeD; 
     344 
     345            assertPred!">="(diff, -2); 
     346            assertPred!"<="(diff, 2); 
     347        } 
     348    } 
     349 
     350 
     351    /++ 
     352        Returns the number of hnsecs since midnight, January 1st, 1 A.D. for the 
     353        current time. 
     354 
     355        Throws: 
     356            ErrnoException (on Posix) or Exception (on Windows) if it fails to 
     357            get the time of day. 
     358      +/ 
     359    @trusted 
     360    static @property long currStdTime() 
     361    { 
     362        version(Windows) 
     363        { 
     364            //FILETIME represents hnsecs from midnight, January 1st, 1601. 
     365            enum hnsecsFrom1601 = 504_911_232_000_000_000L; 
     366 
     367            FILETIME fileTime; 
     368 
     369            GetSystemTimeAsFileTime(&fileTime); 
     370 
     371            ulong tempHNSecs = fileTime.dwHighDateTime; 
     372            tempHNSecs <<= 32; 
     373            tempHNSecs |= fileTime.dwLowDateTime; 
     374 
     375            return cast(long)tempHNSecs + hnsecsFrom1601; 
     376        } 
     377        else version(Posix) 
     378        { 
     379            enum hnsecsToUnixEpoch = 621_355_968_000_000_000L; 
     380 
     381            static if(is(typeof(clock_gettime))) 
     382            { 
     383                timespec ts; 
     384 
     385                if(clock_gettime(CLOCK_REALTIME, &ts) != 0) 
     386                    throw new TimeException("Failed in clock_gettime()."); 
     387 
     388                return convert!("seconds", "hnsecs")(ts.tv_sec) + 
     389                       ts.tv_nsec / 100 + 
     390                       hnsecsToUnixEpoch; 
     391            } 
     392            else 
     393            { 
     394                timeval tv; 
     395 
     396                if(gettimeofday(&tv, null) != 0) 
     397                    throw new TimeException("Failed in gettimeofday()."); 
     398 
     399                return convert!("seconds", "hnsecs")(tv.tv_sec) + 
     400                       convert!("usecs", "hnsecs")(tv.tv_usec) + 
     401                       hnsecsToUnixEpoch; 
     402            } 
     403        } 
     404    } 
     405 
     406 
     407    /++ 
     408        The current system tick. The number of ticks per second varies from 
     409        system to system. This uses a monotonic clock, so it's intended for 
     410        precision timing by comparing relative time values, not for getting 
     411        the current system time. 
     412 
     413        Warning: 
     414            On some systems, the monotonic clock may stop counting when 
     415            the computer goes to sleep or hibernates. So, the monotonic 
     416            clock could be off if that occurs. This is known to happen 
     417            on Mac OS X. It has not been tested whether it occurs on 
     418            either Windows or on Linux. 
     419 
     420        Throws: 
     421            TimeException if it fails to get the time. 
     422      +/ 
     423    @safe 
     424    static @property TickDuration currSystemTick() 
     425    { 
     426        return TickDuration.currSystemTick(); 
     427    } 
     428 
     429    unittest 
     430    { 
     431        version(testStdDateTime) 
     432        { 
     433            auto t = Clock.currSystemTick; 
     434            assert(t.length > 0); 
     435        } 
     436    } 
     437 
     438 
     439    /++ 
     440        The current number of system ticks since the application started. 
     441        The number of ticks per second varies from system to system. 
     442        This uses a monotonic clock. 
     443 
     444        Warning: 
     445            On some systems, the monotonic clock may stop counting when 
     446            the computer goes to sleep or hibernates. So, the monotonic 
     447            clock could be off if that occurs. This is known to happen 
     448            on Mac OS X. It has not been tested whether it occurs on 
     449            either Windows or on Linux. 
     450 
     451        Throws: 
     452            ErrnoException (on Posix) or Exception (on Windows) if it fails to 
     453            get the time of day. 
     454      +/ 
     455    @safe 
     456    static @property TickDuration currAppTick() 
     457    { 
     458        return currSystemTick - TickDuration.appOrigin; 
     459    } 
     460 
     461    unittest 
     462    { 
     463        version(testStdDateTime) 
     464        { 
     465            auto a = Clock.currSystemTick; 
     466            auto b = Clock.currAppTick; 
     467            assert(a.length); 
     468            assert(a != b); 
     469        } 
     470    } 
     471 
     472 
     473private: 
     474 
     475    @disable this() {} 
     476} 
     477 
     478 
     479//============================================================================== 
    308480// Section with time points. 
    309481//============================================================================== 
     482 
     483 
     484/++ 
     485    SysTime is the type used when you want to get the current time from the system 
     486    or if you're doing anything that involves time zones. Unlike DateTime, time 
     487    zone is an integral part of SysTime (though if all you care about is local 
     488    time, you can pretty much ignore time zones, and it will work, since it 
     489    defaults to using the local time zone). It holds its internal time in std time 
     490    (hnsecs since midnight, January 1st, 1 A.D. UTC), so it interfaces well with the 
     491    system time. However, that means that, unlike DateTime, it is not optimized 
     492    for calendar operations, and getting individual units from it such as years 
     493    or days is going to involve conversions and be less efficient. 
     494 
     495    Basically, if you care about calendar operations and don't necessarily care 
     496    about time zones, then DateTime would be the type to use. However, if what 
     497    you care about is the system time, then SysTime is the type to use. 
     498 
     499    $(D Clock.currTime()) will return the current time as a SysTime. If you want 
     500    to convert a SysTime to a Date or DateTime, simply cast it. And if you ever 
     501    want to convert a Date or DateTime to a SysTime, use SysTime's constructor, 
     502    and you can pass in the intended time zone with it (or don't pass in a 
     503    TimeZone, and the local time zone will be used). 
     504 
     505    If you care about using time zones other than local time or UTC, you can use 
     506    PosixTimeZone on Posix systems (or on Windows, if you provide the TZ Database 
     507    files), and you can use WindowsTimeZone on Windows systems. The time in SysTime 
     508    is kept internally in hnsecs from midnight, January 1st, 1 A.D. UTC. So, you 
     509    never get conversion errors when changing the time zone of a SysTime (since, 
     510    if the hnecs were kept in local time, DST would cause problems with conversions). 
     511    LocalTime is the TimeZone class which represents the local time, and UTC is the 
     512    TimeZone class which represents UTC. SysTime uses LocalTime if no TimeZone is 
     513    provided. For more details on time zones, look at the documentation for 
     514    TimeZone, PosixTimeZone, and WindowsTimeZone. 
     515 
     516    SysTime's range is from approximately 29,000 B.C. to 29,000 A.D. 
     517  +/ 
     518struct SysTime 
     519{ 
     520public: 
     521 
     522    /++ 
     523        Params: 
     524            dateTime = The DateTime to use to set this SysTime's internal std 
     525                       time. As DateTime has no concept of time zone, tz is used 
     526                       as its time zone. 
     527            tz       = The TimeZone to use for this SysTime. If null, LocalTime 
     528                       will be used. The given DateTime is assumed to be in the 
     529                       given time zone. 
     530      +/ 
     531    this(in DateTime dateTime, immutable TimeZone tz = null) nothrow 
     532    { 
     533        try 
     534            this(dateTime, FracSec.from!"hnsecs"(0), tz); 
     535        catch(Exception e) 
     536            assert(0, "FracSec's constructor threw when it shouldn't have."); 
     537    } 
     538 
     539    unittest 
     540    { 
     541        version(testStdDateTime) 
     542        { 
     543            assertPred!"=="(SysTime(DateTime.init, UTC())._stdTime, 0); 
     544            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 30, 33), UTC())._stdTime, 450_330_000_000L); 
     545            assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 30, 33), UTC())._stdTime, -413_670_000_000L); 
     546            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), UTC())._stdTime, 0); 
     547            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 1), UTC())._stdTime, 10_000_000L); 
     548            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), UTC())._stdTime, -10_000_000L); 
     549 
     550            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(-60)).stdTime, 36_000_000_000L); 
     551            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(0)).stdTime, 0); 
     552            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(60)).stdTime, -36_000_000_000L); 
     553        } 
     554    } 
     555 
     556 
     557    /++ 
     558        Params: 
     559            dateTime = The DateTime to use to set this SysTime's internal std time. 
     560                       As DateTime has no concept of time zone, tz is used as its 
     561                       time zone. 
     562            fsec     = The fractional seconds portion of the time. 
     563            tz       = The TimeZone to use for this SysTime. If null, LocalTime will 
     564                       be used. The given DateTime is assumed to be in the given 
     565                       time zone. 
     566      +/ 
     567    this(in DateTime dateTime, in FracSec fsec, immutable TimeZone tz = null) nothrow 
     568    { 
     569        if(tz is null) 
     570            _timezone = LocalTime(); 
     571        else 
     572            _timezone = tz; 
     573 
     574        try 
     575        { 
     576            immutable dateDiff = (dateTime.date - Date(1, 1, 1)).total!"hnsecs"; 
     577            immutable todDiff = (dateTime.timeOfDay - TimeOfDay(0, 0, 0)).total!"hnsecs"; 
     578 
     579            immutable adjustedTime = dateDiff + todDiff + fsec.hnsecs; 
     580            immutable standardTime = _timezone.tzToUTC(adjustedTime); 
     581 
     582            this(standardTime, _timezone.get); 
     583        } 
     584        catch(Exception e) 
     585            assert(0, "Date, TimeOfDay, or DateTime's constructor threw when it shouldn't have."); 
     586    } 
     587 
     588    unittest 
     589    { 
     590        version(testStdDateTime) 
     591        { 
     592            assertPred!"=="(SysTime(DateTime.init, FracSec.init, UTC())._stdTime, 0); 
     593            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 30, 33), FracSec.init, UTC())._stdTime, 450_330_000_000L); 
     594            assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 30, 33), FracSec.init, UTC())._stdTime, -413_670_000_000L); 
     595            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(1), UTC())._stdTime, 10_000L); 
     596            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC())._stdTime, -10_000L); 
     597 
     598            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).stdTime, -1); 
     599            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1), UTC()).stdTime, -9_999_999); 
     600            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0), UTC()).stdTime, -10_000_000); 
     601        } 
     602    } 
     603 
     604 
     605    /++ 
     606        Params: 
     607            date = The Date to use to set this SysTime's internal std time. 
     608                   As Date has no concept of time zone, tz is used as its 
     609                   time zone. 
     610            tz   = The TimeZone to use for this SysTime. If null, LocalTime will 
     611                   be used. The given Date is assumed to be in the given time zone. 
     612      +/ 
     613    this(in Date date, immutable TimeZone tz = null) nothrow 
     614    { 
     615        if(tz is null) 
     616            _timezone = LocalTime(); 
     617        else 
     618            _timezone = tz; 
     619 
     620        try 
     621        { 
     622            immutable adjustedTime = (date - Date(1, 1, 1)).total!"hnsecs"; 
     623            immutable standardTime = _timezone.tzToUTC(adjustedTime); 
     624 
     625            this(standardTime, _timezone.get); 
     626        } 
     627        catch(Exception e) 
     628            assert(0, "Date's constructor through when it shouldn't have"); 
     629    } 
     630 
     631    unittest 
     632    { 
     633        version(testStdDateTime) 
     634        { 
     635            assertPred!"=="(SysTime(Date.init, UTC())._stdTime, 0); 
     636            assertPred!"=="(SysTime(Date(1, 1, 1), UTC())._stdTime, 0); 
     637            assertPred!"=="(SysTime(Date(1, 1, 2), UTC())._stdTime, 864000000000); 
     638            assertPred!"=="(SysTime(Date(0, 12, 31), UTC())._stdTime, -864000000000); 
     639        } 
     640    } 
     641 
     642 
     643    /++ 
     644        Note: 
     645            Whereas the other constructors take in the given date/time, assume 
     646            that it's in the given time zone, and convert it to hnsecs in UTC 
     647            since midnight, January 1st, 1 A.D. UTC - i.e. std time - this constructor 
     648            takes a std time, which is specifically already in UTC, so no conversion 
     649            takes place. Of course, the various getter properties and functions 
     650            will use the given time zone's conversion function to convert the 
     651            results to that time zone, but no conversion of the arguments to 
     652            this constructor takes place. 
     653 
     654        Params: 
     655            stdTime = The number of hnsecs since midnight, January 1st, 1 A.D. UTC. 
     656            tz    = The TimeZone to use for this SysTime. If null, LocalTime will be used. 
     657      +/ 
     658    this(long stdTime, immutable TimeZone tz = null) pure nothrow 
     659    { 
     660        _stdTime = stdTime; 
     661 
     662        if(tz is null) 
     663            _timezone = LocalTime(); 
     664        else 
     665            _timezone = tz; 
     666    } 
     667 
     668    unittest 
     669    { 
     670        version(testStdDateTime) 
     671        { 
     672            assertPred!"=="(SysTime(0)._stdTime, 0); 
     673        } 
     674    } 
     675 
     676 
     677    /++ 
     678        Params: 
     679            rhs = The SysTime to assign to this one. 
     680      +/ 
     681    ref SysTime opAssign(const ref SysTime rhs) pure nothrow 
     682    { 
     683        _stdTime = rhs._stdTime; 
     684        _timezone = rhs._timezone.get; 
     685 
     686        return this; 
     687    } 
     688 
     689 
     690    /++ 
     691        Params: 
     692            rhs = The SysTime to assign to this one. 
     693      +/ 
     694    ref SysTime opAssign(SysTime rhs) pure nothrow 
     695    { 
     696        _stdTime = rhs._stdTime; 
     697        _timezone = rhs._timezone.get; 
     698 
     699        return this; 
     700    } 
     701 
     702 
     703    /++ 
     704        Checks for equality between this SysTime and the given 
     705        SysTime. 
     706 
     707        Note that the time zone is ignored. Only the internal 
     708        std times (which are in UTC) are compared. 
     709     +/ 
     710    bool opEquals(const ref SysTime rhs) const pure nothrow 
     711    { 
     712        return _stdTime == rhs._stdTime; 
     713    } 
     714 
     715    unittest 
     716    { 
     717        version(testStdDateTime) 
     718        { 
     719            auto a = SysTime(DateTime.init, UTC()); 
     720            auto b = SysTime(0, UTC()); 
     721            assert(a == b); 
     722            assertPred!"=="(a, b); 
     723            assertPred!"=="(SysTime(DateTime.init, UTC()), SysTime(0, UTC())); 
     724            assertPred!"=="(SysTime(Date.init, UTC()), SysTime(0, UTC())); 
     725            assertPred!"=="(SysTime(0), SysTime(0)); 
     726 
     727            assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
     728            assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
     729            assertPred!"=="(SysTime(Date(1, 7, 1)), SysTime(Date(1, 7, 1))); 
     730            assertPred!"=="(SysTime(Date(1, 1, 6)), SysTime(Date(1, 1, 6))); 
     731 
     732            assertPred!"=="(SysTime(Date(1999, 7, 1)), SysTime(Date(1999, 7, 1))); 
     733            assertPred!"=="(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 6))); 
     734 
     735            assertPred!"=="(SysTime(Date(1, 7, 6)), SysTime(Date(1, 7, 6))); 
     736 
     737            assertPred!"=="(SysTime(DateTime(1999, 1, 1, 0, 0, 0)), SysTime(Date(1999, 1, 1))); 
     738            assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 0, 0, 0))); 
     739 
     740            assertPred!"!="(SysTime(DateTime(1999, 1, 1, 11, 30, 20)), SysTime(Date(1999, 1, 1))); 
     741            assertPred!"!="(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 11, 30, 20))); 
     742 
     743            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))), 
     744                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)))); 
     745            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0))), 
     746                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0)))); 
     747            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0))), 
     748                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0)))); 
     749            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
     750                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
     751 
     752            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0))), 
     753                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0)))); 
     754            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     755                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     756 
     757            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33))), 
     758                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33)))); 
     759            assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
     760                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
     761 
     762            { 
     763                auto sysUTC = SysTime(Date(1999, 1, 1)); 
     764                sysUTC.timezone = UTC(); 
     765 
     766                auto sysLocal = SysTime(Date(1999, 1, 1)); 
     767                sysUTC.timezone = LocalTime(); 
     768 
     769                assertPred!"=="(sysUTC, sysLocal); 
     770                assertPred!"=="(sysLocal, sysUTC); 
     771 
     772                if(!localTimeIsUTC) 
     773                { 
     774                    assertPred!"!="(SysTime(Date(1999, 1, 1), UTC()), SysTime(Date(1999, 1, 1), LocalTime())); 
     775                    assertPred!"!="(SysTime(Date(1999, 7, 1), LocalTime()), SysTime(Date(1999, 7, 1), UTC())); 
     776                } 
     777            } 
     778 
     779            { 
     780                auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
     781                sysUTC.timezone = UTC(); 
     782 
     783                auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
     784                sysSimple.timezone = new SimpleTimeZone(-360); 
     785 
     786                assertPred!"=="(sysUTC, sysSimple); 
     787                assertPred!"=="(sysSimple, sysUTC); 
     788 
     789                assertPred!"!="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()), 
     790                               SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone)); 
     791                assertPred!"!="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone), 
     792                               SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC())); 
     793            } 
     794 
     795            { 
     796                auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()); 
     797                auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), new SimpleTimeZone(240)); 
     798 
     799                assertPred!"!="(sysUTC, sysSimple); 
     800                assertPred!"!="(sysSimple, sysUTC); 
     801 
     802                sysUTC = SysTime(DateTime(Date(1999, 7, 5), TimeOfDay(20, 0, 0)), UTC()); 
     803 
     804                assertPred!"=="(sysUTC, sysSimple); 
     805                assertPred!"=="(sysSimple, sysUTC); 
     806            } 
     807 
     808            auto st = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     809            const cst = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     810            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     811            static assert(__traits(compiles, st == st)); 
     812            static assert(__traits(compiles, st == cst)); 
     813            //static assert(__traits(compiles, st == ist)); 
     814            static assert(__traits(compiles, cst == st)); 
     815            static assert(__traits(compiles, cst == cst)); 
     816            //static assert(__traits(compiles, cst == ist)); 
     817            //static assert(__traits(compiles, ist == st)); 
     818            //static assert(__traits(compiles, ist == cst)); 
     819            //static assert(__traits(compiles, ist == ist)); 
     820        } 
     821    } 
     822 
     823 
     824    /++ 
     825        Compares this SysTime with the given SysTime. 
     826 
     827        Time zone is irrelevant to comparing SysTimes. 
     828 
     829        Returns: 
     830            $(TABLE 
     831            $(TR $(TD this &lt; rhs) $(TD &lt; 0)) 
     832            $(TR $(TD this == rhs) $(TD 0)) 
     833            $(TR $(TD this &gt; rhs) $(TD &gt; 0)) 
     834            ) 
     835     +/ 
     836    int opCmp(in SysTime rhs) const pure nothrow 
     837    { 
     838        if(_stdTime < rhs._stdTime) 
     839            return -1; 
     840        if(_stdTime > rhs._stdTime) 
     841            return 1; 
     842 
     843        return 0; 
     844    } 
     845 
     846    unittest 
     847    { 
     848        version(testStdDateTime) 
     849        { 
     850            //Test A.D. 
     851            assertPred!("opCmp", "==")(SysTime(DateTime.init, UTC()), SysTime(0)); 
     852            assertPred!("opCmp", "==")(SysTime(Date.init, UTC()), SysTime(0)); 
     853 
     854            assertPred!("opCmp", "==")(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
     855            assertPred!("opCmp", "==")(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
     856            assertPred!("opCmp", "==")(SysTime(Date(1, 7, 1)), SysTime(Date(1, 7, 1))); 
     857            assertPred!("opCmp", "==")(SysTime(Date(1, 1, 6)), SysTime(Date(1, 1, 6))); 
     858 
     859            assertPred!("opCmp", "==")(SysTime(Date(1999, 7, 1)), SysTime(Date(1999, 7, 1))); 
     860            assertPred!("opCmp", "==")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 6))); 
     861 
     862            assertPred!("opCmp", "==")(SysTime(Date(1, 7, 6)), SysTime(Date(1, 7, 6))); 
     863 
     864            assertPred!("opCmp", ">")(SysTime(DateTime(1999, 1, 1, 11, 30, 20)), SysTime(Date(1999, 1, 1))); 
     865            assertPred!("opCmp", "<")(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 11, 30, 20))); 
     866 
     867            assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(2000, 7, 6))); 
     868            assertPred!("opCmp", ">")(SysTime(Date(2000, 7, 6)), SysTime(Date(1999, 7, 6))); 
     869            assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 8, 6))); 
     870            assertPred!("opCmp", ">")(SysTime(Date(1999, 8, 6)), SysTime(Date(1999, 7, 6))); 
     871            assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 7))); 
     872            assertPred!("opCmp", ">")(SysTime(Date(1999, 7, 7)), SysTime(Date(1999, 7, 6))); 
     873 
     874            assertPred!("opCmp", "<")(SysTime(Date(1999, 8, 7)), SysTime(Date(2000, 7, 6))); 
     875            assertPred!("opCmp", ">")(SysTime(Date(2000, 8, 6)), SysTime(Date(1999, 7, 7))); 
     876            assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 7)), SysTime(Date(2000, 7, 6))); 
     877            assertPred!("opCmp", ">")(SysTime(Date(2000, 7, 6)), SysTime(Date(1999, 7, 7))); 
     878            assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 7)), SysTime(Date(1999, 8, 6))); 
     879            assertPred!("opCmp", ">")(SysTime(Date(1999, 8, 6)), SysTime(Date(1999, 7, 7))); 
     880 
     881            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))), 
     882                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)))); 
     883            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0))), 
     884                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0)))); 
     885            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0))), 
     886                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0)))), 
     887            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
     888                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
     889 
     890            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0))), 
     891                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0)))); 
     892            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     893                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     894 
     895            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33))), 
     896                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33)))); 
     897            assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
     898                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
     899 
     900            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     901                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     902            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     903                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     904            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     905                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
     906            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     907                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     908            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     909                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     910            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     911                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     912 
     913            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     914                                     SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     915            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     916                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     917            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     918                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
     919            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     920                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     921 
     922            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     923                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     924            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     925                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
     926 
     927            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     928                                      SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     929            assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
     930                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     931            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     932                                      SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     933            assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
     934                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
     935            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     936                                      SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     937            assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
     938                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     939 
     940            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     941                                      SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     942            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
     943                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     944            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     945                                      SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     946            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
     947                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
     948            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     949                                      SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     950            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
     951                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     952 
     953            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
     954                                      SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     955            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
     956                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
     957            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
     958                                      SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 31, 33)))); 
     959            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
     960                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     961            assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
     962                                      SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     963            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
     964                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
     965 
     966            //Test B.C. 
     967            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 1, 1), TimeOfDay(12, 30, 33))), 
     968                                       SysTime(DateTime(Date(-1, 1, 1), TimeOfDay(12, 30, 33)))); 
     969            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 7, 1), TimeOfDay(12, 30, 33))), 
     970                                       SysTime(DateTime(Date(-1, 7, 1), TimeOfDay(12, 30, 33)))); 
     971            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 1, 6), TimeOfDay(12, 30, 33))), 
     972                                       SysTime(DateTime(Date(-1, 1, 6), TimeOfDay(12, 30, 33)))); 
     973 
     974            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1999, 7, 1), TimeOfDay(12, 30, 33))), 
     975                                       SysTime(DateTime(Date(-1999, 7, 1), TimeOfDay(12, 30, 33)))); 
     976            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
     977                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     978 
     979            assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 7, 6), TimeOfDay(12, 30, 33))), 
     980                                       SysTime(DateTime(Date(-1, 7, 6), TimeOfDay(12, 30, 33)))); 
     981 
     982            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33))), 
     983                                      SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     984            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
     985                                      SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     986            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
     987                                      SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     988            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
     989                                      SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     990            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
     991                                      SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     992            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
     993                                      SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     994 
     995            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 8, 6), TimeOfDay(12, 30, 33))), 
     996                                      SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     997            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33))), 
     998                                      SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     999            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33))), 
     1000                                      SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     1001            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
     1002                                      SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
     1003            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
     1004                                      SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     1005            assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
     1006                                      SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     1007 
     1008            //Test Both 
     1009            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
     1010                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1011            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     1012                                      SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1013 
     1014            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
     1015                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1016            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     1017                                      SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
     1018 
     1019            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
     1020                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1021            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     1022                                      SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
     1023 
     1024            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33))), 
     1025                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1026            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
     1027                                      SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33)))); 
     1028 
     1029            assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
     1030                                      SysTime(DateTime(Date(1999, 6, 6), TimeOfDay(12, 30, 33)))); 
     1031            assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 6, 8), TimeOfDay(12, 30, 33))), 
     1032                                      SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
     1033 
     1034            { 
     1035                auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
     1036                sysUTC.timezone = UTC(); 
     1037 
     1038                auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
     1039                sysSimple.timezone = new SimpleTimeZone(-360); 
     1040 
     1041                assertPred!("opCmp", "==")(sysUTC, sysSimple); 
     1042                assertPred!("opCmp", "==")(sysSimple, sysUTC); 
     1043 
     1044                assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()), 
     1045                                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone)); 
     1046                assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone), 
     1047                                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC())); 
     1048            } 
     1049 
     1050            { 
     1051                auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()); 
     1052                auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), new SimpleTimeZone(240)); 
     1053 
     1054                assertPred!("opCmp", ">")(sysUTC, sysSimple); 
     1055                assertPred!("opCmp", "<")(sysSimple, sysUTC); 
     1056 
     1057                sysUTC = SysTime(DateTime(Date(1999, 7, 5), TimeOfDay(20, 0, 0)), UTC()); 
     1058 
     1059                assertPred!("opCmp", "==")(sysUTC, sysSimple); 
     1060                assertPred!("opCmp", "==")(sysSimple, sysUTC); 
     1061            } 
     1062 
     1063            auto st = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     1064            const cst = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     1065            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
     1066            static assert(__traits(compiles, st.opCmp(st))); 
     1067            static assert(__traits(compiles, st.opCmp(cst))); 
     1068            //static assert(__traits(compiles, st.opCmp(ist))); 
     1069            static assert(__traits(compiles, cst.opCmp(st))); 
     1070            static assert(__traits(compiles, cst.opCmp(cst))); 
     1071            //static assert(__traits(compiles, cst.opCmp(ist))); 
     1072            //static assert(__traits(compiles, ist.opCmp(st))); 
     1073            //static assert(__traits(compiles, ist.opCmp(cst))); 
     1074            //static assert(__traits(compiles, ist.opCmp(ist))); 
     1075        } 
     1076    } 
     1077 
     1078 
     1079    /++ 
     1080        Year of the Gregorian Calendar. Positive numbers are A.D. Non-positive 
     1081        are B.C. 
     1082     +/ 
     1083    @property short year() const nothrow 
     1084    { 
     1085        return (cast(Date)this).year; 
     1086    } 
     1087 
     1088    unittest 
     1089    { 
     1090        version(testStdDateTime) 
     1091        { 
     1092            assertPred!"=="(SysTime(0, UTC()).year, 1); 
     1093            assertPred!"=="(SysTime(1, UTC()).year, 1); 
     1094            assertPred!"=="(SysTime(-1, UTC()).year, 0); 
     1095            assertPred!"=="(SysTime(DateTime(12, 1, 1, 0, 0, 0)).year, 12); 
     1096            assertPred!"=="(SysTime(DateTime(-12, 1, 1, 0, 0, 0)).year, -12); 
     1097            assertPred!"=="(SysTime(Date(1999, 7, 6)).year, 1999); 
     1098            assertPred!"=="(SysTime(Date(-1999, 7, 6)).year, -1999); 
     1099 
     1100            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1101            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1102            static assert(__traits(compiles, cst.year)); 
     1103            //static assert(__traits(compiles, ist.year)); 
     1104        } 
     1105    } 
     1106 
     1107 
     1108    /++ 
     1109        Year of the Gregorian Calendar. Positive numbers are A.D. Non-positive 
     1110        are B.C. 
     1111 
     1112        Params: 
     1113            year = The year to set this SysTime's year to. 
     1114 
     1115        Throws: 
     1116            DateTimeException if the new year is not a leap year and the resulting 
     1117            date would be on February 29th. 
     1118 
     1119        Examples: 
     1120-------------------- 
     1121assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).year == 1999); 
     1122assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).year == 2010); 
     1123assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).year == -7); 
     1124-------------------- 
     1125     +/ 
     1126    @property void year(int year) 
     1127    { 
     1128        auto hnsecs = adjTime; 
     1129        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1130 
     1131        if(hnsecs < 0) 
     1132        { 
     1133            hnsecs += convert!("hours", "hnsecs")(24); 
     1134            --days; 
     1135        } 
     1136 
     1137        auto date = Date(cast(int)days); 
     1138        date.year = year; 
     1139 
     1140        immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
     1141 
     1142        adjTime = newDaysHNSecs + hnsecs; 
     1143    } 
     1144 
     1145    unittest 
     1146    { 
     1147        version(testStdDateTime) 
     1148        { 
     1149            static void testST(SysTime st, int year, in SysTime expected, size_t line = __LINE__) 
     1150            { 
     1151                st.year = year; 
     1152                assertPred!"=="(st, expected, "", __FILE__, line); 
     1153            } 
     1154 
     1155            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1999, SysTime(Date(1999, 1, 1))); 
     1156            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 0, SysTime(Date(0, 1, 1))); 
     1157            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), -1999, SysTime(Date(-1999, 1, 1))); 
     1158            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1159            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1160            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), -1999, SysTime(DateTime(-1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1161 
     1162            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 1999, SysTime(Date(1999, 1, 1))); 
     1163            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 0, SysTime(Date(0, 1, 1))); 
     1164            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), -1999, SysTime(Date(-1999, 1, 1))); 
     1165            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1166            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1167            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), -1999, SysTime(DateTime(-1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1168 
     1169            testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(12, 7, 2))); 
     1170            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(5, 7, 2))); 
     1171            testST(SysTime(Date(0, 7, 2)), 999, SysTime(Date(999, 7, 2))); 
     1172            testST(SysTime(Date(-1202, 7, 2)), 2300, SysTime(Date(2300, 7, 2))); 
     1173 
     1174            testST(SysTime(Date(1, 7, 2)), -12, SysTime(Date(-12, 7, 2))); 
     1175            testST(SysTime(Date(5007, 7, 2)), -5, SysTime(Date(-5, 7, 2))); 
     1176            testST(SysTime(Date(0, 7, 2)), -999, SysTime(Date(-999, 7, 2))); 
     1177            testST(SysTime(Date(-1202, 7, 2)), -2300, SysTime(Date(-2300, 7, 2))); 
     1178 
     1179            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1180            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1181            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1182            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -1, SysTime(DateTime(-1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1183            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1184            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(999, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1185            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(2010, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1186 
     1187            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1188            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1189            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1190            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -507, SysTime(DateTime(-507, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1191            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(2300, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1192            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1193 
     1194            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1195            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1196            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1197            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -1, SysTime(DateTime(-1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1198            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1199            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(999, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1200            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(2010, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1201 
     1202            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1203            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1204            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1205            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -507, SysTime(DateTime(-507, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1206            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(2300, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1207            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1208 
     1209            testST(SysTime(0, UTC()), 12, SysTime(DateTime(12, 1, 1, 0, 0, 0), UTC())); 
     1210 
     1211            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1212            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1213            static assert(!__traits(compiles, cst.year = 7)); 
     1214            //static assert(!__traits(compiles, ist.year = 7)); 
     1215 
     1216            //Verify Examples. 
     1217            assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).year == 1999); 
     1218            assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).year == 2010); 
     1219            assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).year == -7); 
     1220        } 
     1221    } 
     1222 
     1223 
     1224    /++ 
     1225        Year B.C. of the Gregorian Calendar counting year 0 as 1 B.C. 
     1226 
     1227        Throws: 
     1228            DateTimeException if $(D isAD) is true. 
     1229 
     1230        Examples: 
     1231-------------------- 
     1232assert(SysTime(DateTime(0, 1, 1, 12, 30, 33)).yearBC == 1); 
     1233assert(SysTime(DateTime(-1, 1, 1, 10, 7, 2)).yearBC == 2); 
     1234assert(SysTime(DateTime(-100, 1, 1, 4, 59, 0)).yearBC == 101); 
     1235-------------------- 
     1236     +/ 
     1237    @property ushort yearBC() const 
     1238    { 
     1239        return (cast(Date)this).yearBC; 
     1240    } 
     1241 
     1242    unittest 
     1243    { 
     1244        version(testStdDateTime) 
     1245        { 
     1246            assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(Date(1, 1, 1), UTC()))); 
     1247            assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(0, UTC()))); 
     1248            assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(1, UTC()))); 
     1249 
     1250            assertPred!"=="(SysTime(-1, UTC()).yearBC, 1); 
     1251            assertPred!"=="(SysTime(DateTime(-12, 1, 1, 0, 0, 0)).yearBC, 13); 
     1252 
     1253            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1254            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1255            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1256            static assert(__traits(compiles, st.year = 12)); 
     1257            static assert(!__traits(compiles, cst.year = 12)); 
     1258            //static assert(!__traits(compiles, ist.year = 12)); 
     1259 
     1260            //Verify Examples. 
     1261            assert(SysTime(DateTime(0, 1, 1, 12, 30, 33)).yearBC == 1); 
     1262            assert(SysTime(DateTime(-1, 1, 1, 10, 7, 2)).yearBC == 2); 
     1263            assert(SysTime(DateTime(-100, 1, 1, 4, 59, 0)).yearBC == 101); 
     1264        } 
     1265    } 
     1266 
     1267 
     1268    /++ 
     1269        Year B.C. of the Gregorian Calendar counting year 0 as 1 B.C. 
     1270 
     1271        Params: 
     1272            year = The year B.C. to set this SysTime's year to. 
     1273 
     1274        Throws: 
     1275            DateTimeException if a non-positive value is given. 
     1276 
     1277        Examples: 
     1278-------------------- 
     1279auto st = SysTime(DateTime(2010, 1, 1, 7, 30, 0)); 
     1280st.yearBC = 1; 
     1281assert(st == SysTime(DateTime(0, 1, 1, 7, 30, 0))); 
     1282 
     1283st.yearBC = 10; 
     1284assert(st == SysTime(DateTime(-9, 1, 1, 7, 30, 0))); 
     1285-------------------- 
     1286     +/ 
     1287    @property void yearBC(int year) 
     1288    { 
     1289        auto hnsecs = adjTime; 
     1290        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1291 
     1292        if(hnsecs < 0) 
     1293        { 
     1294            hnsecs += convert!("hours", "hnsecs")(24); 
     1295            --days; 
     1296        } 
     1297 
     1298        auto date = Date(cast(int)days); 
     1299        date.yearBC = year; 
     1300 
     1301        immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
     1302 
     1303        adjTime = newDaysHNSecs + hnsecs; 
     1304    } 
     1305 
     1306    unittest 
     1307    { 
     1308        version(testStdDateTime) 
     1309        { 
     1310            static void testSTInvalid(SysTime st, int year) 
     1311            { 
     1312                st.yearBC = year; 
     1313            } 
     1314 
     1315            static void testST(SysTime st, int year, in SysTime expected, size_t line = __LINE__) 
     1316            { 
     1317                st.yearBC = year; 
     1318                assertPred!"=="(st, expected, "", __FILE__, line); 
     1319            } 
     1320 
     1321            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 0)); 
     1322            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), -1)); 
     1323            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), -1202)); 
     1324 
     1325            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1999, SysTime(Date(-1998, 1, 1))); 
     1326            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1, SysTime(Date(0, 1, 1))); 
     1327            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(-1998, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1328            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1329 
     1330            testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(-11, 7, 2))); 
     1331            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(-4, 7, 2))); 
     1332            testST(SysTime(Date(0, 7, 2)), 999, SysTime(Date(-998, 7, 2))); 
     1333            testST(SysTime(Date(-1202, 7, 2)), 2300, SysTime(Date(-2299, 7, 2))); 
     1334 
     1335            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1336            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1337            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1338            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(-998, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1339            testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(-2009, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1340 
     1341            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1342            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1343            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(-2299, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1344            testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(-5006, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1345 
     1346            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1347            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1348            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1349            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(-998, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1350            testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(-2009, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1351 
     1352            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
     1353            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1354            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(-2299, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1355            testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(-5006, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
     1356 
     1357            testST(SysTime(0, UTC()), 12, SysTime(DateTime(-11, 1, 1, 0, 0, 0), UTC())); 
     1358 
     1359            { 
     1360                auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1361                const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1362                //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1363                static assert(__traits(compiles, st.yearBC = 12)); 
     1364                static assert(!__traits(compiles, cst.yearBC = 12)); 
     1365                //static assert(!__traits(compiles, ist.yearBC = 12)); 
     1366            } 
     1367 
     1368            //Verify Examples. 
     1369            { 
     1370                auto st = SysTime(DateTime(2010, 1, 1, 7, 30, 0)); 
     1371                st.yearBC = 1; 
     1372                assert(st == SysTime(DateTime(0, 1, 1, 7, 30, 0))); 
     1373 
     1374                st.yearBC = 10; 
     1375                assert(st == SysTime(DateTime(-9, 1, 1, 7, 30, 0))); 
     1376            } 
     1377        } 
     1378    } 
     1379 
     1380 
     1381    /++ 
     1382        Month of a Gregorian Year. 
     1383 
     1384        Examples: 
     1385-------------------- 
     1386assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).month == 7); 
     1387assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).month == 10); 
     1388assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).month == 4); 
     1389-------------------- 
     1390     +/ 
     1391    @property Month month() const nothrow 
     1392    { 
     1393        return (cast(Date)this).month; 
     1394    } 
     1395 
     1396    unittest 
     1397    { 
     1398        version(testStdDateTime) 
     1399        { 
     1400            assertPred!"=="(SysTime(0, UTC()).month, 1); 
     1401            assertPred!"=="(SysTime(1, UTC()).month, 1); 
     1402            assertPred!"=="(SysTime(-1, UTC()).month, 12); 
     1403            assertPred!"=="(SysTime(DateTime(1, 12, 1, 0, 0, 0)).month, 12); 
     1404            assertPred!"=="(SysTime(DateTime(0, 12, 1, 0, 0, 0)).month, 12); 
     1405            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)).month, 7); 
     1406            assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 12, 30, 33)).month, 7); 
     1407 
     1408            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1409            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1410            static assert(__traits(compiles, cst.month)); 
     1411            //static assert(__traits(compiles, ist.month)); 
     1412 
     1413            //Verify Examples. 
     1414            assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).month == 7); 
     1415            assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).month == 10); 
     1416            assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).month == 4); 
     1417        } 
     1418    } 
     1419 
     1420 
     1421    /++ 
     1422        Month of a Gregorian Year. 
     1423 
     1424        Params: 
     1425            month = The month to set this SysTime's month to. 
     1426 
     1427        Throws: 
     1428            DateTimeException if the given month is not a valid month. 
     1429     +/ 
     1430    @property void month(Month month) 
     1431    { 
     1432        auto hnsecs = adjTime; 
     1433        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1434 
     1435        if(hnsecs < 0) 
     1436        { 
     1437            hnsecs += convert!("hours", "hnsecs")(24); 
     1438            --days; 
     1439        } 
     1440 
     1441        auto date = Date(cast(int)days); 
     1442        date.month = month; 
     1443 
     1444        immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
     1445 
     1446        adjTime = newDaysHNSecs + hnsecs; 
     1447    } 
     1448 
     1449    unittest 
     1450    { 
     1451        version(testStdDateTime) 
     1452        { 
     1453            static void testSTInvalid(SysTime st, Month month) 
     1454            { 
     1455                st.month = month; 
     1456            } 
     1457 
     1458            static void testST(SysTime st, Month month, in SysTime expected, size_t line = __LINE__) 
     1459            { 
     1460                st.month = month; 
     1461                assertPred!"=="(st, expected, "", __FILE__, line); 
     1462            } 
     1463 
     1464            assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 1, 12, 30, 33)), cast(Month)0)); 
     1465            assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 1, 12, 30, 33)), cast(Month)13)); 
     1466            assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 29, 12, 30, 33)), cast(Month)2)); 
     1467            assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 7, 31, 12, 30, 33)), cast(Month)6)); 
     1468            assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(4, 7, 30, 12, 30, 33)), cast(Month)2)); 
     1469 
     1470            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)1, SysTime(Date(1, 1, 1))); 
     1471            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)7, SysTime(Date(1, 7, 1))); 
     1472            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)12, SysTime(Date(1, 12, 1))); 
     1473            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1474            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)7, SysTime(DateTime(1, 7, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1475            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1476 
     1477            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)1, SysTime(Date(0, 1, 1))); 
     1478            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)7, SysTime(Date(0, 7, 1))); 
     1479            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)12, SysTime(Date(0, 12, 1))); 
     1480            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1481            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)7, SysTime(DateTime(0, 7, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1482            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1483 
     1484            testST(SysTime(Date(1, 7, 2)), cast(Month)12, SysTime(Date(1, 12, 2))); 
     1485            testST(SysTime(Date(5007, 7, 2)), cast(Month)5, SysTime(Date(5007, 5, 2))); 
     1486            testST(SysTime(Date(0, 7, 2)), cast(Month)7, SysTime(Date(0, 7, 2))); 
     1487            testST(SysTime(Date(-1202, 7, 2)), cast(Month)1, SysTime(Date(-1202, 1, 2))); 
     1488 
     1489            testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0))); 
     1490            testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1))); 
     1491            testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(2)), cast(Month)7, SysTime(DateTime(1, 7, 29, 9, 13, 2), FracSec.from!"hnsecs"(2))); 
     1492            testST(SysTime(DateTime(1, 11, 28, 10, 13, 2), FracSec.from!"hnsecs"(3)), cast(Month)1, SysTime(DateTime(1, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(3))); 
     1493            testST(SysTime(DateTime(1, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(4)), cast(Month)2, SysTime(DateTime(1, 2, 28, 10, 13, 2), FracSec.from!"hnsecs"(4))); 
     1494            testST(SysTime(DateTime(1, 7, 28, 10, 13, 2), FracSec.from!"hnsecs"(5)),cast(Month) 6, SysTime(DateTime(1, 6, 28, 10, 13, 2), FracSec.from!"hnsecs"(5))); 
     1495            testST(SysTime(DateTime(4, 7, 29, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)2, SysTime(DateTime(4, 2, 29, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
     1496            testST(SysTime(DateTime(4, 7, 31, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)8, SysTime(DateTime(4, 8, 31, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
     1497 
     1498            testST(SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0))); 
     1499            testST(SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11)), cast(Month)12, SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11))); 
     1500            testST(SysTime(DateTime(1207, 12, 29, 9, 12, 3), FracSec.from!"hnsecs"(10)), cast(Month)7, SysTime(DateTime(1207, 7, 29, 9, 12, 3), FracSec.from!"hnsecs"(10))); 
     1501            testST(SysTime(DateTime(1207, 11, 28, 10, 12, 3), FracSec.from!"hnsecs"(9)), cast(Month)1, SysTime(DateTime(1207, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(9))); 
     1502            testST(SysTime(DateTime(1207, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(8)), cast(Month)2, SysTime(DateTime(1207, 2, 28, 10, 12, 3), FracSec.from!"hnsecs"(8))); 
     1503            testST(SysTime(DateTime(1207, 7, 28, 10, 12, 3), FracSec.from!"hnsecs"(7)), cast(Month)6, SysTime(DateTime(1207, 6, 28, 10, 12, 3), FracSec.from!"hnsecs"(7))); 
     1504 
     1505            testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0))); 
     1506            testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1))); 
     1507            testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(2)), cast(Month)7, SysTime(DateTime(0, 7, 29, 9, 13, 2), FracSec.from!"hnsecs"(2))); 
     1508            testST(SysTime(DateTime(0, 11, 28, 10, 13, 2), FracSec.from!"hnsecs"(3)), cast(Month)1, SysTime(DateTime(0, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(3))); 
     1509            testST(SysTime(DateTime(0, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(4)), cast(Month)2, SysTime(DateTime(0, 2, 28, 10, 13, 2), FracSec.from!"hnsecs"(4))); 
     1510            testST(SysTime(DateTime(0, 7, 28, 10, 13, 2), FracSec.from!"hnsecs"(5)), cast(Month)6, SysTime(DateTime(0, 6, 28, 10, 13, 2), FracSec.from!"hnsecs"(5))); 
     1511 
     1512            testST(SysTime(DateTime(0, 12, 30, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)11, SysTime(DateTime(0, 11, 30, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1513            testST(SysTime(DateTime(-1, 7, 28, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)2, SysTime(DateTime(-1, 2, 28, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1514            testST(SysTime(DateTime(0, 7, 29, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)2, SysTime(DateTime(0, 2, 29, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1515            testST(SysTime(DateTime(0, 7, 29, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)2, SysTime(DateTime(0, 2, 29, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
     1516            testST(SysTime(DateTime(0, 7, 31, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)8, SysTime(DateTime(0, 8, 31, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
     1517 
     1518            testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0))); 
     1519            testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11)), cast(Month)12, SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11))); 
     1520            testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 3), FracSec.from!"hnsecs"(10)), cast(Month)7, SysTime(DateTime(-9999, 7, 29, 9, 12, 3), FracSec.from!"hnsecs"(10))); 
     1521            testST(SysTime(DateTime(-9999, 11, 28, 10, 12, 3), FracSec.from!"hnsecs"(9)), cast(Month)1, SysTime(DateTime(-9999, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(9))); 
     1522            testST(SysTime(DateTime(-9999, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(8)), cast(Month)2, SysTime(DateTime(-9999, 2, 28, 10, 12, 3), FracSec.from!"hnsecs"(8))); 
     1523            testST(SysTime(DateTime(-9999, 7, 28, 10, 12, 3), FracSec.from!"hnsecs"(7)), cast(Month)6, SysTime(DateTime(-9999, 6, 28, 10, 12, 3), FracSec.from!"hnsecs"(7))); 
     1524 
     1525            testST(SysTime(0, UTC()), cast(Month)12, SysTime(DateTime(1, 12, 1, 0, 0, 0), UTC())); 
     1526 
     1527            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1528            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1529            static assert(!__traits(compiles, cst.month = 12)); 
     1530            //static assert(!__traits(compiles, ist.month = 12)); 
     1531        } 
     1532    } 
     1533 
     1534 
     1535    /++ 
     1536        Day of a Gregorian Month. 
     1537 
     1538        Examples: 
     1539-------------------- 
     1540assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).day == 6); 
     1541assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).day == 4); 
     1542assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).day == 5); 
     1543-------------------- 
     1544     +/ 
     1545    @property ubyte day() const nothrow 
     1546    { 
     1547        return (cast(Date)this).day; 
     1548    } 
     1549 
     1550    unittest 
     1551    { 
     1552        version(testStdDateTime) 
     1553        { 
     1554            assertPred!"=="(SysTime(0, UTC()).day, 1); 
     1555            assertPred!"=="(SysTime(1, UTC()).day, 1); 
     1556            assertPred!"=="(SysTime(-1, UTC()).day, 31); 
     1557            assertPred!"=="(SysTime(DateTime(50, 2, 4)).day, 4); 
     1558            assertPred!"=="(SysTime(DateTime(50, 2, 4, 0, 0, 1)).day, 4); 
     1559            assertPred!"=="(SysTime(DateTime(1999, 7, 6)).day, 6); 
     1560            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 0, 0, 0)).day, 6); 
     1561            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)).day, 6); 
     1562            assertPred!"=="(SysTime(DateTime(-50, 2, 4)).day, 4); 
     1563            assertPred!"=="(SysTime(DateTime(-50, 2, 4, 0, 0, 1)).day, 4); 
     1564            assertPred!"=="(SysTime(Date(-1999, 7, 6)).day, 6); 
     1565            assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 0, 0, 0)).day, 6); 
     1566            assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 12, 30, 33)).day, 6); 
     1567 
     1568            assertPred!"=="(SysTime(DateTime(1, 1, 12, 0, 0, 0)).day, 12); 
     1569            assertPred!"=="(SysTime(DateTime(0, 1, 12, 0, 0, 0)).day, 12); 
     1570 
     1571            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1572            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1573            static assert(__traits(compiles, cst.day)); 
     1574            //static assert(__traits(compiles, ist.day)); 
     1575 
     1576            //Verify Examples. 
     1577            assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).day == 6); 
     1578            assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).day == 4); 
     1579            assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).day == 5); 
     1580        } 
     1581    } 
     1582 
     1583 
     1584    /++ 
     1585        Day of a Gregorian Month. 
     1586 
     1587        Params: 
     1588            day = The day of the month to set this SysTime's day to. 
     1589 
     1590        Throws: 
     1591            DateTimeException if the given day is not a valid day of the current 
     1592            month. 
     1593     +/ 
     1594    @property void day(int day) 
     1595    { 
     1596        auto hnsecs = adjTime; 
     1597        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1598 
     1599        if(hnsecs < 0) 
     1600        { 
     1601            hnsecs += convert!("hours", "hnsecs")(24); 
     1602            --days; 
     1603        } 
     1604 
     1605        auto date = Date(cast(int)days); 
     1606        date.day = day; 
     1607 
     1608        immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
     1609 
     1610        adjTime = newDaysHNSecs + hnsecs; 
     1611    } 
     1612 
     1613    unittest 
     1614    { 
     1615        version(testStdDateTime) 
     1616        { 
     1617            static void testSTInvalid(SysTime st, int day) 
     1618            { 
     1619                st.day = day; 
     1620            } 
     1621 
     1622            static void testST(SysTime st, int day, in SysTime expected, size_t line = __LINE__) 
     1623            { 
     1624                st.day = day; 
     1625                assertPred!"=="(st, expected, "", __FILE__, line); 
     1626            } 
     1627 
     1628            //Test A.D. 
     1629            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 0)); 
     1630            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 32)); 
     1631            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 2, 1)), 29)); 
     1632            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(4, 2, 1)), 30)); 
     1633            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 3, 1)), 32)); 
     1634            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 4, 1)), 31)); 
     1635            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 5, 1)), 32)); 
     1636            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 6, 1)), 31)); 
     1637            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 7, 1)), 32)); 
     1638            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 8, 1)), 32)); 
     1639            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 9, 1)), 31)); 
     1640            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 10, 1)), 32)); 
     1641            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 11, 1)), 31)); 
     1642            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 12, 1)), 32)); 
     1643 
     1644            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 31)); 
     1645            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 2, 1)), 28)); 
     1646            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(4, 2, 1)), 29)); 
     1647            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 3, 1)), 31)); 
     1648            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 4, 1)), 30)); 
     1649            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 5, 1)), 31)); 
     1650            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 6, 1)), 30)); 
     1651            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 7, 1)), 31)); 
     1652            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 8, 1)), 31)); 
     1653            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 9, 1)), 30)); 
     1654            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 10, 1)), 31)); 
     1655            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 11, 1)), 30)); 
     1656            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 12, 1)), 31)); 
     1657 
     1658            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1, SysTime(Date(1, 1, 1))); 
     1659            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 7, SysTime(Date(1, 1, 7))); 
     1660            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 12, SysTime(Date(1, 1, 12))); 
     1661            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1662            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 7, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1663            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 12, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1664 
     1665            testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(1, 7, 12))); 
     1666            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(5007, 7, 5))); 
     1667 
     1668            testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(7))); 
     1669            testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70))); 
     1670            testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700))); 
     1671            testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(7000))); 
     1672            testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000))); 
     1673            testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 29, SysTime(DateTime(1, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(700_000))); 
     1674 
     1675            testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(9))); 
     1676            testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90))); 
     1677            testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900))); 
     1678            testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(9000))); 
     1679            testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000))); 
     1680            testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 29, SysTime(DateTime(999, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(900_000))); 
     1681 
     1682            //Test B.C. 
     1683            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 0)); 
     1684            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 32)); 
     1685            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 2, 1)), 29)); 
     1686            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(0, 2, 1)), 30)); 
     1687            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 3, 1)), 32)); 
     1688            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 4, 1)), 31)); 
     1689            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 5, 1)), 32)); 
     1690            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 6, 1)), 31)); 
     1691            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 7, 1)), 32)); 
     1692            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 8, 1)), 32)); 
     1693            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 9, 1)), 31)); 
     1694            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 10, 1)), 32)); 
     1695            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 11, 1)), 31)); 
     1696            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 12, 1)), 32)); 
     1697 
     1698            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 31)); 
     1699            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 2, 1)), 28)); 
     1700            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(0, 2, 1)), 29)); 
     1701            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 3, 1)), 31)); 
     1702            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 4, 1)), 30)); 
     1703            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 5, 1)), 31)); 
     1704            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 6, 1)), 30)); 
     1705            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 7, 1)), 31)); 
     1706            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 8, 1)), 31)); 
     1707            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 9, 1)), 30)); 
     1708            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 10, 1)), 31)); 
     1709            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 11, 1)), 30)); 
     1710            assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 12, 1)), 31)); 
     1711 
     1712            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 1, SysTime(Date(0, 1, 1))); 
     1713            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 7, SysTime(Date(0, 1, 7))); 
     1714            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 12, SysTime(Date(0, 1, 12))); 
     1715            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1716            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 7, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1717            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 12, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     1718 
     1719            testST(SysTime(Date(0, 7, 2)), 7, SysTime(Date(0, 7, 7))); 
     1720            testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(Date(-1202, 7, 1))); 
     1721 
     1722            testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(7))); 
     1723            testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70))); 
     1724            testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700))); 
     1725            testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(7000))); 
     1726            testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000))); 
     1727            testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 29, SysTime(DateTime(0, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(700_000))); 
     1728 
     1729            testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(9))); 
     1730            testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90))); 
     1731            testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900))); 
     1732            testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(9000))); 
     1733            testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000))); 
     1734            testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 29, SysTime(DateTime(-1, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(900_000))); 
     1735 
     1736            testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 12, 0, 0, 0), UTC())); 
     1737 
     1738            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1739            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1740            static assert(!__traits(compiles, cst.day = 27)); 
     1741            //static assert(!__traits(compiles, ist.day = 27)); 
     1742        } 
     1743    } 
     1744 
     1745 
     1746    /++ 
     1747        Hours past midnight. 
     1748     +/ 
     1749    @property ubyte hour() const nothrow 
     1750    { 
     1751        auto hnsecs = adjTime; 
     1752        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1753 
     1754        if(hnsecs < 0) 
     1755        { 
     1756            hnsecs += convert!("hours", "hnsecs")(24); 
     1757            --days; 
     1758        } 
     1759 
     1760        return cast(ubyte)getUnitsFromHNSecs!"hours"(hnsecs); 
     1761    } 
     1762 
     1763    unittest 
     1764    { 
     1765        version(testStdDateTime) 
     1766        { 
     1767            assertPred!"=="(SysTime(0, UTC()).hour, 0); 
     1768            assertPred!"=="(SysTime(1, UTC()).hour, 0); 
     1769            assertPred!"=="(SysTime(-1, UTC()).hour, 23); 
     1770            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 0, 0)).hour, 12); 
     1771            assertPred!"=="(SysTime(DateTime(0, 1, 1, 12, 0, 0)).hour, 12); 
     1772 
     1773            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1774            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1775            static assert(__traits(compiles, cst.hour)); 
     1776            //static assert(__traits(compiles, ist.hour)); 
     1777        } 
     1778    } 
     1779 
     1780 
     1781    /++ 
     1782        Hours past midnight. 
     1783 
     1784        Params: 
     1785            hour = The hours to set this SysTime's hour to. 
     1786 
     1787        Throws: 
     1788            DateTimeException if the given hour are not a valid hour of the day. 
     1789     +/ 
     1790    @property void hour(int hour) 
     1791    { 
     1792        enforceValid!"hours"(hour); 
     1793 
     1794        auto hnsecs = adjTime; 
     1795        auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
     1796        immutable daysHNSecs = convert!("days", "hnsecs")(days); 
     1797        immutable negative = hnsecs < 0; 
     1798 
     1799        if(negative) 
     1800            hnsecs += convert!("hours", "hnsecs")(24); 
     1801 
     1802        hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
     1803        hnsecs += convert!("hours", "hnsecs")(hour); 
     1804 
     1805        if(negative) 
     1806            hnsecs -= convert!("hours", "hnsecs")(24); 
     1807 
     1808        adjTime = daysHNSecs + hnsecs; 
     1809    } 
     1810 
     1811    unittest 
     1812    { 
     1813        version(testStdDateTime) 
     1814        { 
     1815            static void testSTInvalid(SysTime st, int hour) 
     1816            { 
     1817                st.hour = hour; 
     1818            } 
     1819 
     1820            static void testST(SysTime st, int hour, in SysTime expected, size_t line = __LINE__) 
     1821            { 
     1822                st.hour = hour; 
     1823                assertPred!"=="(st, expected, "", __FILE__, line); 
     1824            } 
     1825 
     1826            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 24)); 
     1827 
     1828            //Test A.D. 
     1829            testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 1, 0, 0))); 
     1830            testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 7, 0, 0))); 
     1831            testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0))); 
     1832            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 1, 0, 0), FracSec.from!"hnsecs"(1))); 
     1833            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 7, 0, 0), FracSec.from!"hnsecs"(1))); 
     1834            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0), FracSec.from!"hnsecs"(1))); 
     1835 
     1836            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 1, 59, 59))); 
     1837            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 7, 59, 59))); 
     1838            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 12, 59, 59))); 
     1839            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 1, 59, 59), FracSec.from!"hnsecs"(1))); 
     1840            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 7, 59, 59), FracSec.from!"hnsecs"(1))); 
     1841            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 12, 59, 59), FracSec.from!"hnsecs"(1))); 
     1842 
     1843            testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 12, 0, 0))); 
     1844            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 5, 0, 0))); 
     1845 
     1846            testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(7))); 
     1847            testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(70))); 
     1848            testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(700))); 
     1849            testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(7000))); 
     1850            testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(70_000))); 
     1851            testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(700_000))); 
     1852 
     1853            testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(9))); 
     1854            testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(90))); 
     1855            testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(900))); 
     1856            testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(9000))); 
     1857            testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(90_000))); 
     1858            testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(900_000))); 
     1859 
     1860            //Test B.C. 
     1861            testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 1, 0, 0))); 
     1862            testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 7, 0, 0))); 
     1863            testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 12, 0, 0))); 
     1864            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 1, 0, 0), FracSec.from!"hnsecs"(1))); 
     1865            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 7, 0, 0), FracSec.from!"hnsecs"(1))); 
     1866            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 12, 0, 0), FracSec.from!"hnsecs"(1))); 
     1867 
     1868            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 1, 59, 59))); 
     1869            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 7, 59, 59))); 
     1870            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 12, 59, 59))); 
     1871            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 1, 59, 59), FracSec.from!"hnsecs"(1))); 
     1872            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 7, 59, 59), FracSec.from!"hnsecs"(1))); 
     1873            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 12, 59, 59), FracSec.from!"hnsecs"(1))); 
     1874 
     1875            testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 7, 0, 0))); 
     1876            testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 1, 0, 0))); 
     1877 
     1878            testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(7))); 
     1879            testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(70))); 
     1880            testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(700))); 
     1881            testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(7000))); 
     1882            testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(70_000))); 
     1883            testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(700_000))); 
     1884 
     1885            testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(9))); 
     1886            testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(90))); 
     1887            testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(900))); 
     1888            testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(9000))); 
     1889            testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(90_000))); 
     1890            testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(900_000))); 
     1891 
     1892            testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0), UTC())); 
     1893 
     1894            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1895            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1896            static assert(!__traits(compiles, cst.hour = 27)); 
     1897            //static assert(!__traits(compiles, ist.hour = 27)); 
     1898        } 
     1899    } 
     1900 
     1901 
     1902    /++ 
     1903        Minutes past the current hour. 
     1904     +/ 
     1905    @property ubyte minute() const nothrow 
     1906    { 
     1907        auto hnsecs = adjTime; 
     1908        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     1909 
     1910        if(hnsecs < 0) 
     1911        { 
     1912            hnsecs += convert!("hours", "hnsecs")(24); 
     1913            --days; 
     1914        } 
     1915 
     1916        hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
     1917 
     1918        return cast(ubyte)getUnitsFromHNSecs!"minutes"(hnsecs); 
     1919    } 
     1920 
     1921    unittest 
     1922    { 
     1923        version(testStdDateTime) 
     1924        { 
     1925            assertPred!"=="(SysTime(0, UTC()).minute, 0); 
     1926            assertPred!"=="(SysTime(1, UTC()).minute, 0); 
     1927            assertPred!"=="(SysTime(-1, UTC()).minute, 59); 
     1928            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 30, 0)).minute, 30); 
     1929            assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 30, 0)).minute, 30); 
     1930 
     1931            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1932            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     1933            static assert(__traits(compiles, cst.minute)); 
     1934            //static assert(__traits(compiles, ist.minute)); 
     1935        } 
     1936    } 
     1937 
     1938 
     1939    /++ 
     1940        Minutes past the current hour. 
     1941 
     1942        Params: 
     1943            minutes = The minute to set this SysTime's minute to. 
     1944 
     1945        Throws: 
     1946            DateTimeException if the given minute are not a valid minute of an 
     1947            hour. 
     1948     +/ 
     1949    @property void minute(int minute) 
     1950    { 
     1951        enforceValid!"minutes"(minute); 
     1952 
     1953        auto hnsecs = adjTime; 
     1954        auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
     1955        immutable daysHNSecs = convert!("days", "hnsecs")(days); 
     1956        immutable negative = hnsecs < 0; 
     1957 
     1958        if(negative) 
     1959            hnsecs += convert!("hours", "hnsecs")(24); 
     1960 
     1961        immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     1962        hnsecs = removeUnitsFromHNSecs!"minutes"(hnsecs); 
     1963 
     1964        hnsecs += convert!("hours", "hnsecs")(hour); 
     1965        hnsecs += convert!("minutes", "hnsecs")(minute); 
     1966 
     1967        if(negative) 
     1968            hnsecs -= convert!("hours", "hnsecs")(24); 
     1969 
     1970        adjTime = daysHNSecs + hnsecs; 
     1971    } 
     1972 
     1973    unittest 
     1974    { 
     1975        version(testStdDateTime) 
     1976        { 
     1977            static void testSTInvalid(SysTime st, int minute) 
     1978            { 
     1979                st.minute = minute; 
     1980            } 
     1981 
     1982            static void testST(SysTime st, int minute, in SysTime expected, size_t line = __LINE__) 
     1983            { 
     1984                st.minute = minute; 
     1985                assertPred!"=="(st, expected, "", __FILE__, line); 
     1986            } 
     1987 
     1988            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 60)); 
     1989 
     1990            //Test A.D. 
     1991            testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 1, 0))); 
     1992            testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 7, 0))); 
     1993            testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0))); 
     1994            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 1, 0), FracSec.from!"hnsecs"(1))); 
     1995            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 7, 0), FracSec.from!"hnsecs"(1))); 
     1996            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0), FracSec.from!"hnsecs"(1))); 
     1997 
     1998            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 1, 59))); 
     1999            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 7, 59))); 
     2000            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 12, 59))); 
     2001            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 1, 59), FracSec.from!"hnsecs"(1))); 
     2002            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 7, 59), FracSec.from!"hnsecs"(1))); 
     2003            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 12, 59), FracSec.from!"hnsecs"(1))); 
     2004 
     2005            testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 12, 0))); 
     2006            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 5, 0))); 
     2007 
     2008            testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(7))); 
     2009            testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(70))); 
     2010            testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(700))); 
     2011            testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(7000))); 
     2012            testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(70_000))); 
     2013            testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(700_000))); 
     2014 
     2015            testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(9))); 
     2016            testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(90))); 
     2017            testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(900))); 
     2018            testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(9000))); 
     2019            testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(90_000))); 
     2020            testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(900_000))); 
     2021 
     2022            //Test B.C. 
     2023            testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 1, 0))); 
     2024            testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 7, 0))); 
     2025            testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 12, 0))); 
     2026            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 1, 0), FracSec.from!"hnsecs"(1))); 
     2027            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 7, 0), FracSec.from!"hnsecs"(1))); 
     2028            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 12, 0), FracSec.from!"hnsecs"(1))); 
     2029 
     2030            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 1, 59))); 
     2031            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 7, 59))); 
     2032            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 12, 59))); 
     2033            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 1, 59), FracSec.from!"hnsecs"(1))); 
     2034            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 7, 59), FracSec.from!"hnsecs"(1))); 
     2035            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 12, 59), FracSec.from!"hnsecs"(1))); 
     2036 
     2037            testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 7, 0))); 
     2038            testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 1, 0))); 
     2039 
     2040            testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(7))); 
     2041            testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(70))); 
     2042            testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(700))); 
     2043            testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(7000))); 
     2044            testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(70_000))); 
     2045            testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(700_000))); 
     2046 
     2047            testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(9))); 
     2048            testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(90))); 
     2049            testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(900))); 
     2050            testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(9000))); 
     2051            testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(90_000))); 
     2052            testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(900_000))); 
     2053 
     2054            testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0), UTC())); 
     2055 
     2056            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2057            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2058            static assert(!__traits(compiles, cst.minute = 27)); 
     2059            //static assert(!__traits(compiles, ist.minute = 27)); 
     2060        } 
     2061    } 
     2062 
     2063 
     2064    /++ 
     2065        Seconds past the current minute. 
     2066     +/ 
     2067    @property ubyte second() const nothrow 
     2068    { 
     2069        auto hnsecs = adjTime; 
     2070        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     2071 
     2072        if(hnsecs < 0) 
     2073        { 
     2074            hnsecs += convert!("hours", "hnsecs")(24); 
     2075            --days; 
     2076        } 
     2077 
     2078        hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
     2079        hnsecs = removeUnitsFromHNSecs!"minutes"(hnsecs); 
     2080 
     2081        return cast(ubyte)getUnitsFromHNSecs!"seconds"(hnsecs); 
     2082    } 
     2083 
     2084    unittest 
     2085    { 
     2086        version(testStdDateTime) 
     2087        { 
     2088            assertPred!"=="(SysTime(0, UTC()).second, 0); 
     2089            assertPred!"=="(SysTime(1, UTC()).second, 0); 
     2090            assertPred!"=="(SysTime(-1, UTC()).second, 59); 
     2091            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33)).second, 33); 
     2092            assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 0, 33)).second, 33); 
     2093 
     2094            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2095            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2096            static assert(__traits(compiles, cst.second)); 
     2097            //static assert(__traits(compiles, ist.second)); 
     2098        } 
     2099    } 
     2100 
     2101 
     2102    /++ 
     2103        Seconds past the current minute. 
     2104 
     2105        Params 
     2106            second = The second to set this SysTime's second to. 
     2107 
     2108        Throws: 
     2109            DateTimeException if the given second are not a valid second of a minute. 
     2110     +/ 
     2111    @property void second(int second) 
     2112    { 
     2113        enforceValid!"seconds"(second); 
     2114 
     2115        auto hnsecs = adjTime; 
     2116        auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
     2117        immutable daysHNSecs = convert!("days", "hnsecs")(days); 
     2118        immutable negative = hnsecs < 0; 
     2119 
     2120        if(negative) 
     2121            hnsecs += convert!("hours", "hnsecs")(24); 
     2122 
     2123        immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     2124        immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     2125        hnsecs = removeUnitsFromHNSecs!"seconds"(hnsecs); 
     2126 
     2127        hnsecs += convert!("hours", "hnsecs")(hour); 
     2128        hnsecs += convert!("minutes", "hnsecs")(minute); 
     2129        hnsecs += convert!("seconds", "hnsecs")(second); 
     2130 
     2131        if(negative) 
     2132            hnsecs -= convert!("hours", "hnsecs")(24); 
     2133 
     2134        adjTime = daysHNSecs + hnsecs; 
     2135    } 
     2136 
     2137    unittest 
     2138    { 
     2139        version(testStdDateTime) 
     2140        { 
     2141            static void testSTInvalid(SysTime st, int second) 
     2142            { 
     2143                st.second = second; 
     2144            } 
     2145 
     2146            static void testST(SysTime st, int second, in SysTime expected, size_t line = __LINE__) 
     2147            { 
     2148                st.second = second; 
     2149                assertPred!"=="(st, expected, "", __FILE__, line); 
     2150            } 
     2151 
     2152            assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 60)); 
     2153 
     2154            //Test A.D. 
     2155            testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 1))); 
     2156            testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 7))); 
     2157            testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12))); 
     2158            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(1))); 
     2159            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 7), FracSec.from!"hnsecs"(1))); 
     2160            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12), FracSec.from!"hnsecs"(1))); 
     2161 
     2162            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 1))); 
     2163            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 7))); 
     2164            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 12))); 
     2165            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 1), FracSec.from!"hnsecs"(1))); 
     2166            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 7), FracSec.from!"hnsecs"(1))); 
     2167            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 12), FracSec.from!"hnsecs"(1))); 
     2168 
     2169            testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 0, 12))); 
     2170            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 0, 5))); 
     2171 
     2172            testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(7))); 
     2173            testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(70))); 
     2174            testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(700))); 
     2175            testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(7000))); 
     2176            testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(70_000))); 
     2177            testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(700_000))); 
     2178 
     2179            testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(9))); 
     2180            testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(90))); 
     2181            testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(900))); 
     2182            testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(9000))); 
     2183            testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(90_000))); 
     2184            testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(900_000))); 
     2185 
     2186            //Test B.C. 
     2187            testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 1))); 
     2188            testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 7))); 
     2189            testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 12))); 
     2190            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(1))); 
     2191            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 7), FracSec.from!"hnsecs"(1))); 
     2192            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 12), FracSec.from!"hnsecs"(1))); 
     2193 
     2194            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 1))); 
     2195            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 7))); 
     2196            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 12))); 
     2197            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 1), FracSec.from!"hnsecs"(1))); 
     2198            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 7), FracSec.from!"hnsecs"(1))); 
     2199            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 12), FracSec.from!"hnsecs"(1))); 
     2200 
     2201            testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 0, 7))); 
     2202            testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 0, 1))); 
     2203 
     2204            testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(7))); 
     2205            testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(70))); 
     2206            testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(700))); 
     2207            testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(7000))); 
     2208            testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(70_000))); 
     2209            testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(700_000))); 
     2210 
     2211            testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(9))); 
     2212            testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(90))); 
     2213            testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(900))); 
     2214            testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(9000))); 
     2215            testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(90_000))); 
     2216            testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(900_000))); 
     2217 
     2218            testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12), UTC())); 
     2219 
     2220            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2221            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2222            static assert(!__traits(compiles, cst.seconds = 27)); 
     2223            //static assert(!__traits(compiles, ist.seconds = 27)); 
     2224        } 
     2225    } 
     2226 
     2227 
     2228    /++ 
     2229        Fractional seconds passed the second. 
     2230     +/ 
     2231    @property FracSec fracSec() const nothrow 
     2232    { 
     2233        try 
     2234        { 
     2235            auto hnsecs = removeUnitsFromHNSecs!"days"(adjTime); 
     2236 
     2237            if(hnsecs < 0) 
     2238                hnsecs += convert!("hours", "hnsecs")(24); 
     2239 
     2240            hnsecs = removeUnitsFromHNSecs!"seconds"(hnsecs); 
     2241 
     2242            return FracSec.from!"hnsecs"(cast(int)hnsecs); 
     2243        } 
     2244        catch(Exception e) 
     2245            assert(0, "FracSec.from!\"hnsecs\"() threw."); 
     2246    } 
     2247 
     2248    unittest 
     2249    { 
     2250        version(testStdDateTime) 
     2251        { 
     2252            assertPred!"=="(SysTime(0, UTC()).fracSec.hnsecs, 0); 
     2253            assertPred!"=="(SysTime(1, UTC()).fracSec.hnsecs, 1); 
     2254            assertPred!"=="(SysTime(-1, UTC()).fracSec.hnsecs, 9_999_999); 
     2255 
     2256            assertPred!"=="(SysTime(DateTime(200, 3, 30, 1, 27, 19), FracSec.from!"hnsecs"(348), UTC()).fracSec.hnsecs, 348); 
     2257            assertPred!"=="(SysTime(DateTime(-1, 2, 17, 4, 5, 22), FracSec.from!"hnsecs"(347), UTC()).fracSec.hnsecs, 347); 
     2258 
     2259            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502)).fracSec, FracSec.from!"hnsecs"(502)); 
     2260            assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502)).fracSec, FracSec.from!"hnsecs"(502)); 
     2261 
     2262            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2263            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2264            static assert(__traits(compiles, cst.fracSec)); 
     2265            //static assert(__traits(compiles, ist.fracSec)); 
     2266        } 
     2267    } 
     2268 
     2269 
     2270    /++ 
     2271        Fractional seconds passed the second. 
     2272 
     2273        Params 
     2274            fracSec = The fractional seconds to set this SysTimes's fractional 
     2275                      seconds to. 
     2276     +/ 
     2277    @property void fracSec(FracSec fracSec) nothrow 
     2278    { 
     2279        auto hnsecs = adjTime; 
     2280        auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
     2281        immutable daysHNSecs = convert!("days", "hnsecs")(days); 
     2282        immutable negative = hnsecs < 0; 
     2283 
     2284        if(negative) 
     2285            hnsecs += convert!("hours", "hnsecs")(24); 
     2286 
     2287        immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     2288        immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     2289        immutable second = getUnitsFromHNSecs!"seconds"(hnsecs); 
     2290 
     2291        hnsecs = fracSec.hnsecs; 
     2292        hnsecs += convert!("hours", "hnsecs")(hour); 
     2293        hnsecs += convert!("minutes", "hnsecs")(minute); 
     2294        hnsecs += convert!("seconds", "hnsecs")(second); 
     2295 
     2296        if(negative) 
     2297            hnsecs -= convert!("hours", "hnsecs")(24); 
     2298 
     2299        adjTime = daysHNSecs + hnsecs; 
     2300    } 
     2301 
     2302    unittest 
     2303    { 
     2304        version(testStdDateTime) 
     2305        { 
     2306            static void testST(SysTime st, int hnsecs, in SysTime expected, size_t line = __LINE__) 
     2307            { 
     2308                st.fracSec = FracSec.from!"hnsecs"(hnsecs); 
     2309                assertPred!"=="(st, expected, "", __FILE__, line); 
     2310            } 
     2311 
     2312            //Test A.D. 
     2313            testST(SysTime(Date(1, 1, 1)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2314            testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     2315            testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
     2316            testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
     2317            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     2318            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
     2319            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
     2320 
     2321            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 0, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     2322            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     2323            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
     2324            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
     2325            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     2326            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
     2327            testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
     2328 
     2329            testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
     2330            testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(5))); 
     2331 
     2332            testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
     2333            testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2334            testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2335            testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
     2336            testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2337            testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
     2338 
     2339            testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
     2340            testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2341            testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2342            testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
     2343            testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2344            testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
     2345 
     2346            //Test B.C. 
     2347            testST(SysTime(Date(0, 1, 1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2348            testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     2349            testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
     2350            testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
     2351            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2352            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     2353            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
     2354            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
     2355 
     2356            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     2357            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     2358            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
     2359            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
     2360            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     2361            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
     2362            testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
     2363 
     2364            testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
     2365            testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     2366 
     2367            testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
     2368            testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2369            testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2370            testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
     2371            testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2372            testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
     2373 
     2374            testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
     2375            testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2376            testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2377            testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
     2378            testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
     2379            testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
     2380 
     2381            testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12), UTC())); 
     2382 
     2383            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2384            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2385            static assert(!__traits(compiles, cst.fracSec = FracSec.from!"msecs"(7))); 
     2386            //static assert(!__traits(compiles, ist.fracSec = FracSec.from!"msecs"(7))); 
     2387        } 
     2388    } 
     2389 
     2390 
     2391    /++ 
     2392        The total hnsecs from midnight, January 1st, 1 A.D. UTC. This is the internal 
     2393        representation of SysTime. 
     2394     +/ 
     2395    @property long stdTime() const pure nothrow 
     2396    { 
     2397        return _stdTime; 
     2398    } 
     2399 
     2400    unittest 
     2401    { 
     2402        version(testStdDateTime) 
     2403        { 
     2404            assertPred!"=="(SysTime(0).stdTime, 0); 
     2405            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502), UTC()).stdTime, 330000502L); 
     2406            assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), UTC()).stdTime, 621355968000000000L); 
     2407 
     2408            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2409            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2410            static assert(__traits(compiles, cst.stdTime)); 
     2411            //static assert(__traits(compiles, ist.stdTime)); 
     2412        } 
     2413    } 
     2414 
     2415 
     2416    /++ 
     2417        The total hnsecs from midnight, January 1st, 1 A.D. UTC. This is the internal 
     2418        representation of SysTime. 
     2419 
     2420        Params 
     2421            stdTime = The number of hnsecs since January 1st, 1 A.D. UTC. 
     2422     +/ 
     2423    @property void stdTime(long stdTime) pure nothrow 
     2424    { 
     2425        _stdTime = stdTime; 
     2426    } 
     2427 
     2428    unittest 
     2429    { 
     2430        version(testStdDateTime) 
     2431        { 
     2432            { 
     2433                auto st = SysTime(0, UTC()); 
     2434                st.stdTime = 330000502L; 
     2435                assertPred!"=="(st, SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502), UTC())); 
     2436            } 
     2437 
     2438            { 
     2439                auto st = SysTime(0, UTC()); 
     2440                st.stdTime = 621355968000000000L; 
     2441                assertPred!"=="(st, SysTime(DateTime(1970, 1, 1, 0, 0, 0), UTC())); 
     2442            } 
     2443 
     2444            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2445            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     2446            static assert(!__traits(compiles, cst.stdTime = 27)); 
     2447            //static assert(!__traits(compiles, ist.stdTime = 27)); 
     2448        } 
     2449    } 
     2450 
     2451 
     2452    /++ 
     2453        The current time zone of this SysTime. Its internal time is always kept 
     2454        in UTC, so there are no conversion issues between time zones due to DST. 
     2455        Functions which return all or part of the time - such as hours - adjust 
     2456        the time to this SysTime's time zone before returning. 
     2457      +/ 
     2458    @property immutable(TimeZone) timezone() const pure nothrow 
     2459    { 
     2460        return _timezone.get; 
     2461    } 
     2462 
     2463 
     2464    /++ 
     2465        The current time zone of this SysTime. It's internal time is always kept 
     2466        in UTC, so there are no conversion issues between time zones due to DST. 
     2467        Functions which return all or part of the time - such as hours - adjust 
     2468        the time to this SysTime's time zone before returning. 
     2469      +/ 
     2470    @property void timezone(immutable TimeZone timezone) pure nothrow 
     2471    { 
     2472        _timezone = timezone; 
     2473    } 
     2474 
     2475 
     2476    /++ 
     2477        Returns whether DST is in effect for this SysTime. 
     2478      +/ 
     2479    @property bool dstInEffect() const nothrow 
     2480    { 
     2481        return _timezone.dstInEffect(_stdTime); 
     2482        //This function's unit testing is done in the time zone classes. 
     2483    } 
     2484 
     2485 
     2486    /++ 
     2487        Returns a SysTime with the same std time as this one, but with LocalTime 
     2488        as its time zone. 
     2489      +/ 
     2490    SysTime toLocalTime() const nothrow 
     2491    { 
     2492        return SysTime(_stdTime, LocalTime()); 
     2493    } 
     2494 
     2495    unittest 
     2496    { 
     2497        version(testStdDateTime) 
     2498        { 
     2499            { 
     2500                auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
     2501                assertPred!"=="(sysTime, sysTime.toLocalTime()); 
     2502                assertPred!"=="(sysTime._stdTime, sysTime.toLocalTime()._stdTime); 
     2503                assert(sysTime.toLocalTime().timezone is LocalTime()); 
     2504                assert(sysTime.toLocalTime().timezone is sysTime.timezone); 
     2505                assert(sysTime.toLocalTime().timezone !is UTC()); 
     2506            } 
     2507 
     2508            { 
     2509                immutable stz = new SimpleTimeZone(-3 * 60); 
     2510                auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27), stz); 
     2511                assertPred!"=="(sysTime, sysTime.toLocalTime()); 
     2512                assertPred!"=="(sysTime._stdTime, sysTime.toLocalTime()._stdTime); 
     2513                assert(sysTime.toLocalTime().timezone is LocalTime()); 
     2514                assert(sysTime.toLocalTime().timezone !is UTC()); 
     2515                assert(sysTime.toLocalTime().timezone !is stz); 
     2516            } 
     2517        } 
     2518    } 
     2519 
     2520 
     2521    /++ 
     2522        Returns a SysTime with the same std time as this one, but with UTC as 
     2523        its time zone. 
     2524      +/ 
     2525    SysTime toUTC() const pure nothrow 
     2526    { 
     2527        return SysTime(_stdTime, UTC()); 
     2528    } 
     2529 
     2530    unittest 
     2531    { 
     2532        version(testStdDateTime) 
     2533        { 
     2534            auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
     2535            assertPred!"=="(sysTime, sysTime.toUTC()); 
     2536            assertPred!"=="(sysTime._stdTime, sysTime.toUTC()._stdTime); 
     2537            assert(sysTime.toUTC().timezone is UTC()); 
     2538            assert(sysTime.toUTC().timezone !is LocalTime()); 
     2539            assert(sysTime.toUTC().timezone !is sysTime.timezone); 
     2540        } 
     2541    } 
     2542 
     2543 
     2544    /++ 
     2545        Returns a SysTime with the same std time as this one, but with given 
     2546        time zone as its time zone. 
     2547      +/ 
     2548    SysTime toOtherTZ(immutable TimeZone tz) const pure nothrow 
     2549    { 
     2550        return SysTime(_stdTime, tz); 
     2551    } 
     2552 
     2553    unittest 
     2554    { 
     2555        version(testStdDateTime) 
     2556        { 
     2557            immutable stz = new SimpleTimeZone(11 * 60); 
     2558            auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
     2559            assertPred!"=="(sysTime, sysTime.toOtherTZ(stz)); 
     2560            assertPred!"=="(sysTime._stdTime, sysTime.toOtherTZ(stz)._stdTime); 
     2561            assert(sysTime.toOtherTZ(stz).timezone is stz); 
     2562            assert(sysTime.toOtherTZ(stz).timezone !is LocalTime()); 
     2563            assert(sysTime.toOtherTZ(stz).timezone !is UTC()); 
     2564        } 
     2565    } 
     2566 
     2567 
     2568    /++ 
     2569        Returns a time_t which represents this SysTime. 
     2570 
     2571        If time_t is 32 bits, rather than 64, and the result can't fit in a 32-bit 
     2572        value, then the closest value that can be held in 32 bits will be used 
     2573        (so time_t.max if it goes over or time_t.min if it goes under). 
     2574      +/ 
     2575    time_t toUnixTime() const pure nothrow 
     2576    { 
     2577        return stdTimeToUnixTime(_stdTime); 
     2578    } 
     2579 
     2580    unittest 
     2581    { 
     2582        version(testStdDateTime) 
     2583        { 
     2584            assertPred!"=="(SysTime(DateTime(1970, 1, 1), UTC()).toUnixTime, 0); 
     2585            assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1), UTC()).toUnixTime, 0); 
     2586            assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"usecs"(1), UTC()).toUnixTime, 0); 
     2587            assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"msecs"(1), UTC()).toUnixTime, 0); 
     2588            assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 1), UTC()).toUnixTime, 1); 
     2589            assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toUnixTime, 0); 
     2590            assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999_999), UTC()).toUnixTime, 0); 
     2591            assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC()).toUnixTime, 0); 
     2592            assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), UTC()).toUnixTime, -1); 
     2593        } 
     2594    } 
     2595 
     2596 
     2597    /++ 
     2598        Returns a timeval which represents this SysTime. 
     2599 
     2600        If time_t is 32 bits, rather than 64, and the result can't fit in a 32-bit 
     2601        value, then the closest value that can be held in 32 bits will be used 
     2602        for tv_sec. (so time_t.max if it goes over or time_t.min if it goes under). 
     2603      +/ 
     2604    timeval toTimeVal() const pure nothrow 
     2605    { 
     2606        immutable tv_sec = toUnixTime(); 
     2607 
     2608        immutable fracHNSecs = removeUnitsFromHNSecs!"seconds"(_stdTime - 621355968000000000L); 
     2609        immutable tv_usec = cast(int)convert!("hnsecs", "usecs")(fracHNSecs); 
     2610 
     2611        return timeval(tv_sec, tv_usec); 
     2612    } 
     2613 
     2614    unittest 
     2615    { 
     2616        version(testStdDateTime) 
     2617        { 
     2618            assert(SysTime(DateTime(1970, 1, 1), UTC()).toTimeVal() == timeval(0, 0)); 
     2619            assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"hnsecs"(9), UTC()).toTimeVal() == timeval(0, 0)); 
     2620            assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"hnsecs"(10), UTC()).toTimeVal() == timeval(0, 1)); 
     2621            assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"usecs"(7), UTC()).toTimeVal() == timeval(0, 7)); 
     2622 
     2623            assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), UTC()).toTimeVal() == timeval(1, 0)); 
     2624            assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(9), UTC()).toTimeVal() == timeval(1, 0)); 
     2625            assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(10), UTC()).toTimeVal() == timeval(1, 1)); 
     2626            assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"usecs"(7), UTC()).toTimeVal() == timeval(1, 7)); 
     2627 
     2628            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toTimeVal() == 
     2629                   timeval(0, 0)); 
     2630            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_990), UTC()).toTimeVal() == 
     2631                   timeval(0, -1)); 
     2632 
     2633            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999_999), UTC()).toTimeVal() == 
     2634                   timeval(0, -1)); 
     2635            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999), UTC()).toTimeVal() == 
     2636                   timeval(0, -999_001)); 
     2637            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC()).toTimeVal() == 
     2638                   timeval(0, -1000)); 
     2639            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), UTC()).toTimeVal() == timeval(-1, 0)); 
     2640            assert(SysTime(DateTime(1969, 12, 31, 23, 59, 58), FracSec.from!"usecs"(17), UTC()).toTimeVal() == 
     2641                   timeval(-1, -999_983)); 
     2642        } 
     2643    } 
     2644 
     2645 
     2646    /++ 
     2647        Returns a tm which represents this SysTime. 
     2648      +/ 
     2649    tm toTM() const nothrow 
     2650    { 
     2651        try 
     2652        { 
     2653            auto dateTime = cast(DateTime)this; 
     2654            tm timeInfo; 
     2655 
     2656            timeInfo.tm_sec = dateTime.second; 
     2657            timeInfo.tm_min = dateTime.minute; 
     2658            timeInfo.tm_hour = dateTime.hour; 
     2659            timeInfo.tm_mday = dateTime.day; 
     2660            timeInfo.tm_mon = dateTime.month - 1; 
     2661            timeInfo.tm_year = dateTime.year - 1900; 
     2662            timeInfo.tm_wday = dateTime.dayOfWeek; 
     2663            timeInfo.tm_yday = dateTime.dayOfYear - 1; 
     2664            timeInfo.tm_isdst = _timezone.dstInEffect(_stdTime); 
     2665 
     2666            version(Posix) 
     2667            { 
     2668                char[] zone = (timeInfo.tm_isdst ? _timezone.dstName : _timezone.stdName).dup; 
     2669                zone ~= "\0"; 
     2670 
     2671                timeInfo.tm_gmtoff = cast(int)convert!("hnsecs", "seconds")(adjTime - _stdTime); 
     2672                timeInfo.tm_zone = zone.ptr; 
     2673            } 
     2674 
     2675            return timeInfo; 
     2676        } 
     2677        catch(Exception e) 
     2678            assert(0, "Either DateTime's constructor threw."); 
     2679    } 
     2680 
     2681    unittest 
     2682    { 
     2683        version(testStdDateTime) 
     2684        { 
     2685            version(Posix) 
     2686            { 
     2687                scope(exit) clearTZEnvVar(); 
     2688                setTZEnvVar("America/Los_Angeles"); 
     2689            } 
     2690 
     2691            { 
     2692                auto timeInfo = SysTime(DateTime(1970, 1, 1)).toTM(); 
     2693 
     2694                assertPred!"=="(timeInfo.tm_sec, 0); 
     2695                assertPred!"=="(timeInfo.tm_min, 0); 
     2696                assertPred!"=="(timeInfo.tm_hour, 0); 
     2697                assertPred!"=="(timeInfo.tm_mday, 1); 
     2698                assertPred!"=="(timeInfo.tm_mon, 0); 
     2699                assertPred!"=="(timeInfo.tm_year, 70); 
     2700                assertPred!"=="(timeInfo.tm_wday, 4); 
     2701                assertPred!"=="(timeInfo.tm_yday, 0); 
     2702 
     2703                version(Posix) 
     2704                    assertPred!"=="(timeInfo.tm_isdst, 0); 
     2705                else version(Windows) 
     2706                    assert(timeInfo.tm_isdst == 0 || timeInfo.tm_isdst == 1); 
     2707 
     2708                version(Posix) 
     2709                { 
     2710                    assertPred!"=="(timeInfo.tm_gmtoff, -8 * 60 * 60); 
     2711                    assertPred!"=="(to!string(timeInfo.tm_zone), "PST"); 
     2712                } 
     2713            } 
     2714 
     2715            { 
     2716                auto timeInfo = SysTime(DateTime(2010, 7, 4, 12, 15, 7), FracSec.from!"hnsecs"(15)).toTM(); 
     2717 
     2718                assertPred!"=="(timeInfo.tm_sec, 7); 
     2719                assertPred!"=="(timeInfo.tm_min, 15); 
     2720                assertPred!"=="(timeInfo.tm_hour, 12); 
     2721                assertPred!"=="(timeInfo.tm_mday, 4); 
     2722                assertPred!"=="(timeInfo.tm_mon, 6); 
     2723                assertPred!"=="(timeInfo.tm_year, 110); 
     2724                assertPred!"=="(timeInfo.tm_wday, 0); 
     2725                assertPred!"=="(timeInfo.tm_yday, 184); 
     2726 
     2727                version(Posix) 
     2728                    assertPred!"=="(timeInfo.tm_isdst, 1); 
     2729                else version(Windows) 
     2730                    assert(timeInfo.tm_isdst == 0 || timeInfo.tm_isdst == 1); 
     2731 
     2732                version(Posix) 
     2733                { 
     2734                    assertPred!"=="(timeInfo.tm_gmtoff, -7 * 60 * 60); 
     2735                    assertPred!"=="(to!string(timeInfo.tm_zone), "PDT"); 
     2736                } 
     2737            } 
     2738        } 
     2739    } 
     2740 
     2741 
     2742    /++ 
     2743        Adds the given number of years or months to this SysTime. A negative 
     2744        number will subtract. 
     2745 
     2746        Note that if day overflow is allowed, and the date with the adjusted 
     2747        year/month overflows the number of days in the new month, then the month 
     2748        will be incremented by one, and the days set to the number of days overflowed. 
     2749        (e.g. if the day were 31 and the new month were June, then the month would 
     2750        be incremented to July, and the new day would be 1). If day overflow is not 
     2751        allowed, then the day will be set to the last valid day in the month 
     2752        (e.g. June 31st would become June 30th). 
     2753 
     2754        Params: 
     2755            units         = The type of units to add ("years" or "months"). 
     2756            value         = The number of months or years to add to this SysTime. 
     2757            allowOverflow = Whether the days should be allowed to overflow, causing 
     2758                            the month to increment. 
     2759 
     2760        Examples: 
     2761-------------------- 
     2762auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
     2763st1.add!"months"(11); 
     2764assert(st1 == SysTime(DateTime(2010, 12, 1, 12, 30, 33))); 
     2765 
     2766auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
     2767st2.add!"months"(-11); 
     2768assert(st2 == SysTime(DateTime(2009, 2, 1, 12, 30, 33))); 
     2769 
     2770auto st3 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
     2771st3.add!"years"(1); 
     2772assert(st3 == SysTime(DateTime(2001, 3, 1, 12, 30, 33))); 
     2773 
     2774auto st4 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
     2775st4.add!"years"(1, AllowDayOverflow.no); 
     2776assert(st4 == SysTime(DateTime(2001, 2, 28, 12, 30, 33))); 
     2777-------------------- 
     2778      +/ 
     2779    ref SysTime add(string units)(long years, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
     2780        if(units == "years" || 
     2781           units == "months") 
     2782    { 
     2783        auto hnsecs = adjTime; 
     2784        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     2785 
     2786        if(hnsecs < 0) 
     2787        { 
     2788            hnsecs += convert!("hours", "hnsecs")(24); 
     2789            --days; 
     2790        } 
     2791 
     2792        auto date = Date(cast(int)days); 
     2793        date.add!units(years, allowOverflow); 
     2794        days = date.dayOfGregorianCal - 1; 
     2795 
     2796        if(days < 0) 
     2797        { 
     2798            hnsecs -= convert!("hours", "hnsecs")(24); 
     2799            ++days; 
     2800        } 
     2801 
     2802        immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
     2803 
     2804        adjTime = newDaysHNSecs + hnsecs; 
     2805 
     2806        return this; 
     2807    } 
     2808 
     2809    //Test add!"years"() with AllowDayOverlow.yes 
     2810    unittest 
     2811    { 
     2812        version(testStdDateTime) 
     2813        { 
     2814            //Test A.D. 
     2815            { 
     2816                auto sysTime = SysTime(Date(1999, 7, 6)); 
     2817                sysTime.add!"years"(7); 
     2818                assertPred!"=="(sysTime, SysTime(Date(2006, 7, 6))); 
     2819                sysTime.add!"years"(-9); 
     2820                assertPred!"=="(sysTime, SysTime(Date(1997, 7, 6))); 
     2821            } 
     2822 
     2823            { 
     2824                auto sysTime = SysTime(Date(1999, 2, 28)); 
     2825                sysTime.add!"years"(1); 
     2826                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
     2827            } 
     2828 
     2829            { 
     2830                auto sysTime = SysTime(Date(2000, 2, 29)); 
     2831                sysTime.add!"years"(-1); 
     2832                assertPred!"=="(sysTime, SysTime(Date(1999, 3, 1))); 
     2833            } 
     2834 
     2835            { 
     2836                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
     2837                sysTime.add!"years"(7); 
     2838                assertPred!"=="(sysTime, SysTime(DateTime(2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     2839                sysTime.add!"years"(-9); 
     2840                assertPred!"=="(sysTime, SysTime(DateTime(1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     2841            } 
     2842 
     2843            { 
     2844                auto sysTime = SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207)); 
     2845                sysTime.add!"years"(1); 
     2846                assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
     2847            } 
     2848 
     2849            { 
     2850                auto sysTime = SysTime(DateTime(2000, 2, 29, 0, 7, 2), FracSec.from!"usecs"(1207)); 
     2851                sysTime.add!"years"(-1); 
     2852                assertPred!"=="(sysTime, SysTime(DateTime(1999, 3, 1, 0, 7, 2), FracSec.from!"usecs"(1207))); 
     2853            } 
     2854 
     2855            //Test B.C. 
     2856            { 
     2857                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     2858                sysTime.add!"years"(-7); 
     2859                assertPred!"=="(sysTime, SysTime(Date(-2006, 7, 6))); 
     2860                sysTime.add!"years"(9); 
     2861                assertPred!"=="(sysTime, SysTime(Date(-1997, 7, 6))); 
     2862            } 
     2863 
     2864            { 
     2865                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     2866                sysTime.add!"years"(-1); 
     2867                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
     2868            } 
     2869 
     2870            { 
     2871                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     2872                sysTime.add!"years"(1); 
     2873                assertPred!"=="(sysTime, SysTime(Date(-1999, 3, 1))); 
     2874            } 
     2875 
     2876            { 
     2877                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
     2878                sysTime.add!"years"(-7); 
     2879                assertPred!"=="(sysTime, SysTime(DateTime(-2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     2880                sysTime.add!"years"(9); 
     2881                assertPred!"=="(sysTime, SysTime(DateTime(-1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     2882            } 
     2883 
     2884            { 
     2885                auto sysTime = SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
     2886                sysTime.add!"years"(-1); 
     2887                assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
     2888            } 
     2889 
     2890            { 
     2891                auto sysTime = SysTime(DateTime(-2000, 2, 29, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
     2892                sysTime.add!"years"(1); 
     2893                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 3, 1, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
     2894            } 
     2895 
     2896            //Test Both 
     2897            { 
     2898                auto sysTime = SysTime(Date(4, 7, 6)); 
     2899                sysTime.add!"years"(-5); 
     2900                assertPred!"=="(sysTime, SysTime(Date(-1, 7, 6))); 
     2901                sysTime.add!"years"(5); 
     2902                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     2903            } 
     2904 
     2905            { 
     2906                auto sysTime = SysTime(Date(-4, 7, 6)); 
     2907                sysTime.add!"years"(5); 
     2908                assertPred!"=="(sysTime, SysTime(Date(1, 7, 6))); 
     2909                sysTime.add!"years"(-5); 
     2910                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     2911            } 
     2912 
     2913            { 
     2914                auto sysTime = SysTime(Date(4, 7, 6)); 
     2915                sysTime.add!"years"(-8); 
     2916                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     2917                sysTime.add!"years"(8); 
     2918                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     2919            } 
     2920 
     2921            { 
     2922                auto sysTime = SysTime(Date(-4, 7, 6)); 
     2923                sysTime.add!"years"(8); 
     2924                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     2925                sysTime.add!"years"(-8); 
     2926                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     2927            } 
     2928 
     2929            { 
     2930                auto sysTime = SysTime(Date(-4, 2, 29)); 
     2931                sysTime.add!"years"(5); 
     2932                assertPred!"=="(sysTime, SysTime(Date(1, 3, 1))); 
     2933            } 
     2934 
     2935            { 
     2936                auto sysTime = SysTime(Date(4, 2, 29)); 
     2937                sysTime.add!"years"(-5); 
     2938                assertPred!"=="(sysTime, SysTime(Date(-1, 3, 1))); 
     2939            } 
     2940 
     2941            { 
     2942                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     2943                sysTime.add!"years"(-1); 
     2944                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2945                sysTime.add!"years"(1); 
     2946                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2947            } 
     2948 
     2949            { 
     2950                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     2951                sysTime.add!"years"(-1); 
     2952                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     2953                sysTime.add!"years"(1); 
     2954                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     2955            } 
     2956 
     2957            { 
     2958                auto sysTime = SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     2959                sysTime.add!"years"(1); 
     2960                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2961                sysTime.add!"years"(-1); 
     2962                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     2963            } 
     2964 
     2965            { 
     2966                auto sysTime = SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     2967                sysTime.add!"years"(1); 
     2968                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     2969                sysTime.add!"years"(-1); 
     2970                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     2971            } 
     2972 
     2973            { 
     2974                auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
     2975                sysTime.add!"years"(-5); 
     2976                assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     2977                sysTime.add!"years"(5); 
     2978                assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     2979            } 
     2980 
     2981            { 
     2982                auto sysTime = SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
     2983                sysTime.add!"years"(5); 
     2984                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     2985                sysTime.add!"years"(-5); 
     2986                assertPred!"=="(sysTime, SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     2987            } 
     2988 
     2989            { 
     2990                auto sysTime = SysTime(DateTime(-4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
     2991                sysTime.add!"years"(5); 
     2992                assertPred!"=="(sysTime, SysTime(DateTime(1, 3, 1, 5, 5, 5), FracSec.from!"msecs"(555))); 
     2993            } 
     2994 
     2995            { 
     2996                auto sysTime = SysTime(DateTime(4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
     2997                sysTime.add!"years"(-5); 
     2998                assertPred!"=="(sysTime, SysTime(DateTime(-1, 3, 1, 5, 5, 5), FracSec.from!"msecs"(555))); 
     2999            } 
     3000 
     3001            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3002            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3003            static assert(!__traits(compiles, cst.add!"years"(4))); 
     3004            //static assert(!__traits(compiles, ist.add!"years"(4))); 
     3005 
     3006            //Verify Examples. 
     3007            auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
     3008            st1.add!"months"(11); 
     3009            assert(st1 == SysTime(DateTime(2010, 12, 1, 12, 30, 33))); 
     3010 
     3011            auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
     3012            st2.add!"months"(-11); 
     3013            assert(st2 == SysTime(DateTime(2009, 2, 1, 12, 30, 33))); 
     3014 
     3015            auto st3 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
     3016            st3.add!"years"(1); 
     3017            assert(st3 == SysTime(DateTime(2001, 3, 1, 12, 30, 33))); 
     3018 
     3019            auto st4 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
     3020            st4.add!"years"(1, AllowDayOverflow.no); 
     3021            assert(st4 == SysTime(DateTime(2001, 2, 28, 12, 30, 33))); 
     3022        } 
     3023    } 
     3024 
     3025    //Test add!"years"() with AllowDayOverlow.no 
     3026    unittest 
     3027    { 
     3028        version(testStdDateTime) 
     3029        { 
     3030            //Test A.D. 
     3031            { 
     3032                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3033                sysTime.add!"years"(7, AllowDayOverflow.no); 
     3034                assertPred!"=="(sysTime, SysTime(Date(2006, 7, 6))); 
     3035                sysTime.add!"years"(-9, AllowDayOverflow.no); 
     3036                assertPred!"=="(sysTime, SysTime(Date(1997, 7, 6))); 
     3037            } 
     3038 
     3039            { 
     3040                auto sysTime = SysTime(Date(1999, 2, 28)); 
     3041                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3042                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
     3043            } 
     3044 
     3045            { 
     3046                auto sysTime = SysTime(Date(2000, 2, 29)); 
     3047                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3048                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     3049            } 
     3050 
     3051            { 
     3052                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
     3053                sysTime.add!"years"(7, AllowDayOverflow.no); 
     3054                assertPred!"=="(sysTime, SysTime(DateTime(2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     3055                sysTime.add!"years"(-9, AllowDayOverflow.no); 
     3056                assertPred!"=="(sysTime, SysTime(DateTime(1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     3057            } 
     3058 
     3059            { 
     3060                auto sysTime = SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207)); 
     3061                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3062                assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
     3063            } 
     3064 
     3065            { 
     3066                auto sysTime = SysTime(DateTime(2000, 2, 29, 0, 7, 2), FracSec.from!"usecs"(1207)); 
     3067                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3068                assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
     3069            } 
     3070 
     3071            //Test B.C. 
     3072            { 
     3073                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3074                sysTime.add!"years"(-7, AllowDayOverflow.no); 
     3075                assertPred!"=="(sysTime, SysTime(Date(-2006, 7, 6))); 
     3076                sysTime.add!"years"(9, AllowDayOverflow.no); 
     3077                assertPred!"=="(sysTime, SysTime(Date(-1997, 7, 6))); 
     3078            } 
     3079 
     3080            { 
     3081                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     3082                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3083                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
     3084            } 
     3085 
     3086            { 
     3087                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     3088                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3089                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
     3090            } 
     3091 
     3092            { 
     3093                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
     3094                sysTime.add!"years"(-7, AllowDayOverflow.no); 
     3095                assertPred!"=="(sysTime, SysTime(DateTime(-2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     3096                sysTime.add!"years"(9, AllowDayOverflow.no); 
     3097                assertPred!"=="(sysTime, SysTime(DateTime(-1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
     3098            } 
     3099 
     3100            { 
     3101                auto sysTime = SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
     3102                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3103                assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
     3104            } 
     3105 
     3106            { 
     3107                auto sysTime = SysTime(DateTime(-2000, 2, 29, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
     3108                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3109                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
     3110            } 
     3111 
     3112            //Test Both 
     3113            { 
     3114                auto sysTime = SysTime(Date(4, 7, 6)); 
     3115                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3116                assertPred!"=="(sysTime, SysTime(Date(-1, 7, 6))); 
     3117                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3118                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     3119            } 
     3120 
     3121            { 
     3122                auto sysTime = SysTime(Date(-4, 7, 6)); 
     3123                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3124                assertPred!"=="(sysTime, SysTime(Date(1, 7, 6))); 
     3125                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3126                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     3127            } 
     3128 
     3129            { 
     3130                auto sysTime = SysTime(Date(4, 7, 6)); 
     3131                sysTime.add!"years"(-8, AllowDayOverflow.no); 
     3132                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     3133                sysTime.add!"years"(8, AllowDayOverflow.no); 
     3134                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     3135            } 
     3136 
     3137            { 
     3138                auto sysTime = SysTime(Date(-4, 7, 6)); 
     3139                sysTime.add!"years"(8, AllowDayOverflow.no); 
     3140                assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
     3141                sysTime.add!"years"(-8, AllowDayOverflow.no); 
     3142                assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
     3143            } 
     3144 
     3145            { 
     3146                auto sysTime = SysTime(Date(-4, 2, 29)); 
     3147                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3148                assertPred!"=="(sysTime, SysTime(Date(1, 2, 28))); 
     3149            } 
     3150 
     3151            { 
     3152                auto sysTime = SysTime(Date(4, 2, 29)); 
     3153                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3154                assertPred!"=="(sysTime, SysTime(Date(-1, 2, 28))); 
     3155            } 
     3156 
     3157            { 
     3158                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3159                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3160                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3161                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3162                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3163            } 
     3164 
     3165            { 
     3166                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3167                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3168                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3169                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3170                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3171            } 
     3172 
     3173            { 
     3174                auto sysTime = SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3175                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3176                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3177                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3178                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3179            } 
     3180 
     3181            { 
     3182                auto sysTime = SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3183                sysTime.add!"years"(1, AllowDayOverflow.no); 
     3184                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3185                sysTime.add!"years"(-1, AllowDayOverflow.no); 
     3186                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3187            } 
     3188 
     3189            { 
     3190                auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
     3191                sysTime.add!"years"(-5); 
     3192                assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3193                sysTime.add!"years"(5); 
     3194                assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3195            } 
     3196 
     3197            { 
     3198                auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
     3199                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3200                assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3201                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3202                assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3203            } 
     3204 
     3205            { 
     3206                auto sysTime = SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
     3207                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3208                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3209                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3210                assertPred!"=="(sysTime, SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
     3211            } 
     3212 
     3213            { 
     3214                auto sysTime = SysTime(DateTime(-4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
     3215                sysTime.add!"years"(5, AllowDayOverflow.no); 
     3216                assertPred!"=="(sysTime, SysTime(DateTime(1, 2, 28, 5, 5, 5), FracSec.from!"msecs"(555))); 
     3217            } 
     3218 
     3219            { 
     3220                auto sysTime = SysTime(DateTime(4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
     3221                sysTime.add!"years"(-5, AllowDayOverflow.no); 
     3222                assertPred!"=="(sysTime, SysTime(DateTime(-1, 2, 28, 5, 5, 5), FracSec.from!"msecs"(555))); 
     3223            } 
     3224        } 
     3225    } 
     3226 
     3227    //Test add!"months"() with AllowDayOverlow.yes 
     3228    unittest 
     3229    { 
     3230        version(testStdDateTime) 
     3231        { 
     3232            //Test A.D. 
     3233            { 
     3234                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3235                sysTime.add!"months"(3); 
     3236                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     3237                sysTime.add!"months"(-4); 
     3238                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     3239            } 
     3240 
     3241            { 
     3242                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3243                sysTime.add!"months"(6); 
     3244                assertPred!"=="(sysTime, SysTime(Date(2000, 1, 6))); 
     3245                sysTime.add!"months"(-6); 
     3246                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     3247            } 
     3248 
     3249            { 
     3250                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3251                sysTime.add!"months"(27); 
     3252                assertPred!"=="(sysTime, SysTime(Date(2001, 10, 6))); 
     3253                sysTime.add!"months"(-28); 
     3254                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     3255            } 
     3256 
     3257            { 
     3258                auto sysTime = SysTime(Date(1999, 5, 31)); 
     3259                sysTime.add!"months"(1); 
     3260                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 1))); 
     3261            } 
     3262 
     3263            { 
     3264                auto sysTime = SysTime(Date(1999, 5, 31)); 
     3265                sysTime.add!"months"(-1); 
     3266                assertPred!"=="(sysTime, SysTime(Date(1999, 5, 1))); 
     3267            } 
     3268 
     3269            { 
     3270                auto sysTime = SysTime(Date(1999, 2, 28)); 
     3271                sysTime.add!"months"(12); 
     3272                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
     3273            } 
     3274 
     3275            { 
     3276                auto sysTime = SysTime(Date(2000, 2, 29)); 
     3277                sysTime.add!"months"(12); 
     3278                assertPred!"=="(sysTime, SysTime(Date(2001, 3, 1))); 
     3279            } 
     3280 
     3281            { 
     3282                auto sysTime = SysTime(Date(1999, 7, 31)); 
     3283                sysTime.add!"months"(1); 
     3284                assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
     3285                sysTime.add!"months"(1); 
     3286                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
     3287            } 
     3288 
     3289            { 
     3290                auto sysTime = SysTime(Date(1998, 8, 31)); 
     3291                sysTime.add!"months"(13); 
     3292                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
     3293                sysTime.add!"months"(-13); 
     3294                assertPred!"=="(sysTime, SysTime(Date(1998, 9, 1))); 
     3295            } 
     3296 
     3297            { 
     3298                auto sysTime = SysTime(Date(1997, 12, 31)); 
     3299                sysTime.add!"months"(13); 
     3300                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 31))); 
     3301                sysTime.add!"months"(-13); 
     3302                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
     3303            } 
     3304 
     3305            { 
     3306                auto sysTime = SysTime(Date(1997, 12, 31)); 
     3307                sysTime.add!"months"(14); 
     3308                assertPred!"=="(sysTime, SysTime(Date(1999, 3, 3))); 
     3309                sysTime.add!"months"(-14); 
     3310                assertPred!"=="(sysTime, SysTime(Date(1998, 1, 3))); 
     3311            } 
     3312 
     3313            { 
     3314                auto sysTime = SysTime(Date(1998, 12, 31)); 
     3315                sysTime.add!"months"(14); 
     3316                assertPred!"=="(sysTime, SysTime(Date(2000, 3, 2))); 
     3317                sysTime.add!"months"(-14); 
     3318                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 2))); 
     3319            } 
     3320 
     3321            { 
     3322                auto sysTime = SysTime(Date(1999, 12, 31)); 
     3323                sysTime.add!"months"(14); 
     3324                assertPred!"=="(sysTime, SysTime(Date(2001, 3, 3))); 
     3325                sysTime.add!"months"(-14); 
     3326                assertPred!"=="(sysTime, SysTime(Date(2000, 1, 3))); 
     3327            } 
     3328 
     3329            { 
     3330                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     3331                sysTime.add!"months"(3); 
     3332                assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3333                sysTime.add!"months"(-4); 
     3334                assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3335            } 
     3336 
     3337            { 
     3338                auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3339                sysTime.add!"months"(14); 
     3340                assertPred!"=="(sysTime, SysTime(DateTime(2000, 3, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3341                sysTime.add!"months"(-14); 
     3342                assertPred!"=="(sysTime, SysTime(DateTime(1999, 1, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3343            } 
     3344 
     3345            { 
     3346                auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3347                sysTime.add!"months"(14); 
     3348                assertPred!"=="(sysTime, SysTime(DateTime(2001, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3349                sysTime.add!"months"(-14); 
     3350                assertPred!"=="(sysTime, SysTime(DateTime(2000, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3351            } 
     3352 
     3353            //Test B.C. 
     3354            { 
     3355                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3356                sysTime.add!"months"(3); 
     3357                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
     3358                sysTime.add!"months"(-4); 
     3359                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
     3360            } 
     3361 
     3362            { 
     3363                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3364                sysTime.add!"months"(6); 
     3365                assertPred!"=="(sysTime, SysTime(Date(-1998, 1, 6))); 
     3366                sysTime.add!"months"(-6); 
     3367                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     3368            } 
     3369 
     3370            { 
     3371                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3372                sysTime.add!"months"(-27); 
     3373                assertPred!"=="(sysTime, SysTime(Date(-2001, 4, 6))); 
     3374                sysTime.add!"months"(28); 
     3375                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
     3376            } 
     3377 
     3378            { 
     3379                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     3380                sysTime.add!"months"(1); 
     3381                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 1))); 
     3382            } 
     3383 
     3384            { 
     3385                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     3386                sysTime.add!"months"(-1); 
     3387                assertPred!"=="(sysTime, SysTime(Date(-1999, 5, 1))); 
     3388            } 
     3389 
     3390            { 
     3391                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     3392                sysTime.add!"months"(-12); 
     3393                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
     3394            } 
     3395 
     3396            { 
     3397                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     3398                sysTime.add!"months"(-12); 
     3399                assertPred!"=="(sysTime, SysTime(Date(-2001, 3, 1))); 
     3400            } 
     3401 
     3402            { 
     3403                auto sysTime = SysTime(Date(-1999, 7, 31)); 
     3404                sysTime.add!"months"(1); 
     3405                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
     3406                sysTime.add!"months"(1); 
     3407                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 1))); 
     3408            } 
     3409 
     3410            { 
     3411                auto sysTime = SysTime(Date(-1998, 8, 31)); 
     3412                sysTime.add!"months"(13); 
     3413                assertPred!"=="(sysTime, SysTime(Date(-1997, 10, 1))); 
     3414                sysTime.add!"months"(-13); 
     3415                assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 1))); 
     3416            } 
     3417 
     3418            { 
     3419                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     3420                sysTime.add!"months"(13); 
     3421                assertPred!"=="(sysTime, SysTime(Date(-1995, 1, 31))); 
     3422                sysTime.add!"months"(-13); 
     3423                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
     3424            } 
     3425 
     3426            { 
     3427                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     3428                sysTime.add!"months"(14); 
     3429                assertPred!"=="(sysTime, SysTime(Date(-1995, 3, 3))); 
     3430                sysTime.add!"months"(-14); 
     3431                assertPred!"=="(sysTime, SysTime(Date(-1996, 1, 3))); 
     3432            } 
     3433 
     3434            { 
     3435                auto sysTime = SysTime(Date(-2002, 12, 31)); 
     3436                sysTime.add!"months"(14); 
     3437                assertPred!"=="(sysTime, SysTime(Date(-2000, 3, 2))); 
     3438                sysTime.add!"months"(-14); 
     3439                assertPred!"=="(sysTime, SysTime(Date(-2001, 1, 2))); 
     3440            } 
     3441 
     3442            { 
     3443                auto sysTime = SysTime(Date(-2001, 12, 31)); 
     3444                sysTime.add!"months"(14); 
     3445                assertPred!"=="(sysTime, SysTime(Date(-1999, 3, 3))); 
     3446                sysTime.add!"months"(-14); 
     3447                assertPred!"=="(sysTime, SysTime(Date(-2000, 1, 3))); 
     3448            } 
     3449 
     3450            { 
     3451                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     3452                sysTime.add!"months"(3); 
     3453                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3454                sysTime.add!"months"(-4); 
     3455                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3456            } 
     3457 
     3458            { 
     3459                auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3460                sysTime.add!"months"(14); 
     3461                assertPred!"=="(sysTime, SysTime(DateTime(-2000, 3, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3462                sysTime.add!"months"(-14); 
     3463                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 1, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3464            } 
     3465 
     3466            { 
     3467                auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3468                sysTime.add!"months"(14); 
     3469                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3470                sysTime.add!"months"(-14); 
     3471                assertPred!"=="(sysTime, SysTime(DateTime(-2000, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3472            } 
     3473 
     3474            //Test Both 
     3475            { 
     3476                auto sysTime = SysTime(Date(1, 1, 1)); 
     3477                sysTime.add!"months"(-1); 
     3478                assertPred!"=="(sysTime, SysTime(Date(0, 12, 1))); 
     3479                sysTime.add!"months"(1); 
     3480                assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
     3481            } 
     3482 
     3483            { 
     3484                auto sysTime = SysTime(Date(4, 1, 1)); 
     3485                sysTime.add!"months"(-48); 
     3486                assertPred!"=="(sysTime, SysTime(Date(0, 1, 1))); 
     3487                sysTime.add!"months"(48); 
     3488                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     3489            } 
     3490 
     3491            { 
     3492                auto sysTime = SysTime(Date(4, 3, 31)); 
     3493                sysTime.add!"months"(-49); 
     3494                assertPred!"=="(sysTime, SysTime(Date(0, 3, 2))); 
     3495                sysTime.add!"months"(49); 
     3496                assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
     3497            } 
     3498 
     3499            { 
     3500                auto sysTime = SysTime(Date(4, 3, 31)); 
     3501                sysTime.add!"months"(-85); 
     3502                assertPred!"=="(sysTime, SysTime(Date(-3, 3, 3))); 
     3503                sysTime.add!"months"(85); 
     3504                assertPred!"=="(sysTime, SysTime(Date(4, 4, 3))); 
     3505            } 
     3506 
     3507            { 
     3508                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3509                sysTime.add!"months"(-1); 
     3510                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3511                sysTime.add!"months"(1); 
     3512                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3513            } 
     3514 
     3515            { 
     3516                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3517                sysTime.add!"months"(-1); 
     3518                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3519                sysTime.add!"months"(1); 
     3520                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3521            } 
     3522 
     3523            { 
     3524                auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3525                sysTime.add!"months"(1); 
     3526                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3527                sysTime.add!"months"(-1); 
     3528                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3529            } 
     3530 
     3531            { 
     3532                auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3533                sysTime.add!"months"(1); 
     3534                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3535                sysTime.add!"months"(-1); 
     3536                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3537            } 
     3538 
     3539            { 
     3540                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
     3541                sysTime.add!"months"(-1); 
     3542                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     3543                sysTime.add!"months"(1); 
     3544                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     3545            } 
     3546 
     3547            { 
     3548                auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     3549                sysTime.add!"months"(-85); 
     3550                assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 3, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3551                sysTime.add!"months"(85); 
     3552                assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 3, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3553            } 
     3554 
     3555            { 
     3556                auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     3557                sysTime.add!"months"(85); 
     3558                assertPred!"=="(sysTime, SysTime(DateTime(4, 5, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3559                sysTime.add!"months"(-85); 
     3560                assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3561            } 
     3562 
     3563            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3564            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3565            static assert(!__traits(compiles, cst.add!"months"(4))); 
     3566            //static assert(!__traits(compiles, ist.add!"months"(4))); 
     3567 
     3568            //Verify Examples. 
     3569            auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30 ,33)); 
     3570            st1.add!"months"(1); 
     3571            assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 30 ,33))); 
     3572 
     3573            auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30 ,33)); 
     3574            st2.add!"months"(-1); 
     3575            assert(st2 == SysTime(DateTime(2009, 12, 1, 12, 30 ,33))); 
     3576 
     3577            auto st3 = SysTime(DateTime(1999, 1, 29, 12, 30 ,33)); 
     3578            st3.add!"months"(1); 
     3579            assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 30 ,33))); 
     3580 
     3581            auto st4 = SysTime(DateTime(1999, 1, 29, 12, 30 ,33)); 
     3582            st4.add!"months"(1, AllowDayOverflow.no); 
     3583            assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 30 ,33))); 
     3584        } 
     3585    } 
     3586 
     3587    //Test add!"months"() with AllowDayOverlow.no 
     3588    unittest 
     3589    { 
     3590        version(testStdDateTime) 
     3591        { 
     3592            //Test A.D. 
     3593            { 
     3594                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3595                sysTime.add!"months"(3, AllowDayOverflow.no); 
     3596                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     3597                sysTime.add!"months"(-4, AllowDayOverflow.no); 
     3598                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     3599            } 
     3600 
     3601            { 
     3602                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3603                sysTime.add!"months"(6, AllowDayOverflow.no); 
     3604                assertPred!"=="(sysTime, SysTime(Date(2000, 1, 6))); 
     3605                sysTime.add!"months"(-6, AllowDayOverflow.no); 
     3606                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     3607            } 
     3608 
     3609            { 
     3610                auto sysTime = SysTime(Date(1999, 7, 6)); 
     3611                sysTime.add!"months"(27, AllowDayOverflow.no); 
     3612                assertPred!"=="(sysTime, SysTime(Date(2001, 10, 6))); 
     3613                sysTime.add!"months"(-28, AllowDayOverflow.no); 
     3614                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     3615            } 
     3616 
     3617            { 
     3618                auto sysTime = SysTime(Date(1999, 5, 31)); 
     3619                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3620                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 30))); 
     3621            } 
     3622 
     3623            { 
     3624                auto sysTime = SysTime(Date(1999, 5, 31)); 
     3625                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3626                assertPred!"=="(sysTime, SysTime(Date(1999, 4, 30))); 
     3627            } 
     3628 
     3629            { 
     3630                auto sysTime = SysTime(Date(1999, 2, 28)); 
     3631                sysTime.add!"months"(12, AllowDayOverflow.no); 
     3632                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
     3633            } 
     3634 
     3635            { 
     3636                auto sysTime = SysTime(Date(2000, 2, 29)); 
     3637                sysTime.add!"months"(12, AllowDayOverflow.no); 
     3638                assertPred!"=="(sysTime, SysTime(Date(2001, 2, 28))); 
     3639            } 
     3640 
     3641            { 
     3642                auto sysTime = SysTime(Date(1999, 7, 31)); 
     3643                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3644                assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
     3645                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3646                assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
     3647            } 
     3648 
     3649            { 
     3650                auto sysTime = SysTime(Date(1998, 8, 31)); 
     3651                sysTime.add!"months"(13, AllowDayOverflow.no); 
     3652                assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
     3653                sysTime.add!"months"(-13, AllowDayOverflow.no); 
     3654                assertPred!"=="(sysTime, SysTime(Date(1998, 8, 30))); 
     3655            } 
     3656 
     3657            { 
     3658                auto sysTime = SysTime(Date(1997, 12, 31)); 
     3659                sysTime.add!"months"(13, AllowDayOverflow.no); 
     3660                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 31))); 
     3661                sysTime.add!"months"(-13, AllowDayOverflow.no); 
     3662                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
     3663            } 
     3664 
     3665            { 
     3666                auto sysTime = SysTime(Date(1997, 12, 31)); 
     3667                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3668                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     3669                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3670                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 28))); 
     3671            } 
     3672 
     3673            { 
     3674                auto sysTime = SysTime(Date(1998, 12, 31)); 
     3675                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3676                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
     3677                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3678                assertPred!"=="(sysTime, SysTime(Date(1998, 12, 29))); 
     3679            } 
     3680 
     3681            { 
     3682                auto sysTime = SysTime(Date(1999, 12, 31)); 
     3683                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3684                assertPred!"=="(sysTime, SysTime(Date(2001, 2, 28))); 
     3685                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3686                assertPred!"=="(sysTime, SysTime(Date(1999, 12, 28))); 
     3687            } 
     3688 
     3689            { 
     3690                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     3691                sysTime.add!"months"(3, AllowDayOverflow.no); 
     3692                assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3693                sysTime.add!"months"(-4, AllowDayOverflow.no); 
     3694                assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3695            } 
     3696 
     3697            { 
     3698                auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3699                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3700                assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3701                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3702                assertPred!"=="(sysTime, SysTime(DateTime(1998, 12, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3703            } 
     3704 
     3705            { 
     3706                auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3707                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3708                assertPred!"=="(sysTime, SysTime(DateTime(2001, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3709                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3710                assertPred!"=="(sysTime, SysTime(DateTime(1999, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3711            } 
     3712 
     3713            //Test B.C. 
     3714            { 
     3715                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3716                sysTime.add!"months"(3, AllowDayOverflow.no); 
     3717                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
     3718                sysTime.add!"months"(-4, AllowDayOverflow.no); 
     3719                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
     3720            } 
     3721 
     3722            { 
     3723                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3724                sysTime.add!"months"(6, AllowDayOverflow.no); 
     3725                assertPred!"=="(sysTime, SysTime(Date(-1998, 1, 6))); 
     3726                sysTime.add!"months"(-6, AllowDayOverflow.no); 
     3727                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     3728            } 
     3729 
     3730            { 
     3731                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     3732                sysTime.add!"months"(-27, AllowDayOverflow.no); 
     3733                assertPred!"=="(sysTime, SysTime(Date(-2001, 4, 6))); 
     3734                sysTime.add!"months"(28, AllowDayOverflow.no); 
     3735                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
     3736            } 
     3737 
     3738            { 
     3739                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     3740                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3741                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 30))); 
     3742            } 
     3743 
     3744            { 
     3745                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     3746                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3747                assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 30))); 
     3748            } 
     3749 
     3750            { 
     3751                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     3752                sysTime.add!"months"(-12, AllowDayOverflow.no); 
     3753                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
     3754            } 
     3755 
     3756            { 
     3757                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     3758                sysTime.add!"months"(-12, AllowDayOverflow.no); 
     3759                assertPred!"=="(sysTime, SysTime(Date(-2001, 2, 28))); 
     3760            } 
     3761 
     3762            { 
     3763                auto sysTime = SysTime(Date(-1999, 7, 31)); 
     3764                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3765                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
     3766                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3767                assertPred!"=="(sysTime, SysTime(Date(-1999, 9, 30))); 
     3768            } 
     3769 
     3770            { 
     3771                auto sysTime = SysTime(Date(-1998, 8, 31)); 
     3772                sysTime.add!"months"(13, AllowDayOverflow.no); 
     3773                assertPred!"=="(sysTime, SysTime(Date(-1997, 9, 30))); 
     3774                sysTime.add!"months"(-13, AllowDayOverflow.no); 
     3775                assertPred!"=="(sysTime, SysTime(Date(-1998, 8, 30))); 
     3776            } 
     3777 
     3778            { 
     3779                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     3780                sysTime.add!"months"(13, AllowDayOverflow.no); 
     3781                assertPred!"=="(sysTime, SysTime(Date(-1995, 1, 31))); 
     3782                sysTime.add!"months"(-13, AllowDayOverflow.no); 
     3783                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
     3784            } 
     3785 
     3786            { 
     3787                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     3788                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3789                assertPred!"=="(sysTime, SysTime(Date(-1995, 2, 28))); 
     3790                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3791                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 28))); 
     3792            } 
     3793 
     3794            { 
     3795                auto sysTime = SysTime(Date(-2002, 12, 31)); 
     3796                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3797                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
     3798                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3799                assertPred!"=="(sysTime, SysTime(Date(-2002, 12, 29))); 
     3800            } 
     3801 
     3802            { 
     3803                auto sysTime = SysTime(Date(-2001, 12, 31)); 
     3804                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3805                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
     3806                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3807                assertPred!"=="(sysTime, SysTime(Date(-2001, 12, 28))); 
     3808            } 
     3809 
     3810            { 
     3811                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     3812                sysTime.add!"months"(3, AllowDayOverflow.no); 
     3813                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3814                sysTime.add!"months"(-4, AllowDayOverflow.no); 
     3815                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     3816            } 
     3817 
     3818            { 
     3819                auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3820                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3821                assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3822                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3823                assertPred!"=="(sysTime, SysTime(DateTime(-2002, 12, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3824            } 
     3825 
     3826            { 
     3827                auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     3828                sysTime.add!"months"(14, AllowDayOverflow.no); 
     3829                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3830                sysTime.add!"months"(-14, AllowDayOverflow.no); 
     3831                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     3832            } 
     3833 
     3834            //Test Both 
     3835            { 
     3836                auto sysTime = SysTime(Date(1, 1, 1)); 
     3837                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3838                assertPred!"=="(sysTime, SysTime(Date(0, 12, 1))); 
     3839                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3840                assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
     3841            } 
     3842 
     3843            { 
     3844                auto sysTime = SysTime(Date(4, 1, 1)); 
     3845                sysTime.add!"months"(-48, AllowDayOverflow.no); 
     3846                assertPred!"=="(sysTime, SysTime(Date(0, 1, 1))); 
     3847                sysTime.add!"months"(48, AllowDayOverflow.no); 
     3848                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     3849            } 
     3850 
     3851            { 
     3852                auto sysTime = SysTime(Date(4, 3, 31)); 
     3853                sysTime.add!"months"(-49, AllowDayOverflow.no); 
     3854                assertPred!"=="(sysTime, SysTime(Date(0, 2, 29))); 
     3855                sysTime.add!"months"(49, AllowDayOverflow.no); 
     3856                assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
     3857            } 
     3858 
     3859            { 
     3860                auto sysTime = SysTime(Date(4, 3, 31)); 
     3861                sysTime.add!"months"(-85, AllowDayOverflow.no); 
     3862                assertPred!"=="(sysTime, SysTime(Date(-3, 2, 28))); 
     3863                sysTime.add!"months"(85, AllowDayOverflow.no); 
     3864                assertPred!"=="(sysTime, SysTime(Date(4, 3, 28))); 
     3865            } 
     3866 
     3867            { 
     3868                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3869                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3870                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3871                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3872                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3873            } 
     3874 
     3875            { 
     3876                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3877                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3878                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3879                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3880                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3881            } 
     3882 
     3883            { 
     3884                auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     3885                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3886                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3887                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3888                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     3889            } 
     3890 
     3891            { 
     3892                auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     3893                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3894                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3895                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3896                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     3897            } 
     3898 
     3899            { 
     3900                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
     3901                sysTime.add!"months"(-1, AllowDayOverflow.no); 
     3902                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     3903                sysTime.add!"months"(1, AllowDayOverflow.no); 
     3904                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     3905            } 
     3906 
     3907            { 
     3908                auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     3909                sysTime.add!"months"(-85, AllowDayOverflow.no); 
     3910                assertPred!"=="(sysTime, SysTime(DateTime(-3, 2, 28, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3911                sysTime.add!"months"(85, AllowDayOverflow.no); 
     3912                assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 28, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3913            } 
     3914 
     3915            { 
     3916                auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     3917                sysTime.add!"months"(85, AllowDayOverflow.no); 
     3918                assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3919                sysTime.add!"months"(-85, AllowDayOverflow.no); 
     3920                assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
     3921            } 
     3922        } 
     3923    } 
     3924 
     3925 
     3926    /++ 
     3927        Adds the given number of years to this SysTime. A negative number will 
     3928        subtract. 
     3929 
     3930        For years, because they are the largest unit in SysTime, there is no 
     3931        difference between adding or rolling. 
     3932 
     3933        Params: 
     3934            years         = The number of years to add to this SysTime. 
     3935            allowOverflow = Whether the days should be allowed to overflow, 
     3936                            causing the month to increment. 
     3937      +/ 
     3938    /+ref SysTime+/ void roll(string units)(long years, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
     3939        if(units == "years") 
     3940    { 
     3941        add!"years"(years, allowOverflow); 
     3942    } 
     3943 
     3944    unittest 
     3945    { 
     3946        version(testStdDateTime) 
     3947        { 
     3948            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3949            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3950            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     3951            static assert(__traits(compiles, st.roll!"years"(4))); 
     3952            static assert(!__traits(compiles, cst.roll!"years"(4))); 
     3953            //static assert(!__traits(compiles, ist.roll!"years"(4))); 
     3954        } 
     3955    } 
     3956 
     3957 
     3958    /++ 
     3959        Adds the given number of months to this SysTime. A negative number will 
     3960        subtract. 
     3961 
     3962        The difference between rolling and adding is that rolling does not affect 
     3963        larger units. So, if you roll the SysTime 12 months, you get the exact 
     3964        same SysTime. However, the days can still be affected due to the differing 
     3965        number of days in each month. 
     3966 
     3967        Params: 
     3968            months        = The number of months to add to this SysTime. 
     3969            allowOverflow = Whether the days should be allowed to overflow, 
     3970                            causing the month to increment. 
     3971 
     3972        Examples: 
     3973-------------------- 
     3974auto st1 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
     3975st1.roll!"months"(1); 
     3976assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 33, 33))); 
     3977 
     3978auto st2 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
     3979st2.roll!"months"(-1); 
     3980assert(st2 == SysTime(DateTime(2010, 12, 1, 12, 33, 33))); 
     3981 
     3982auto st3 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
     3983st3.roll!"months"(1); 
     3984assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 33, 33))); 
     3985 
     3986auto st4 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
     3987st4.roll!"months"(1, AllowDayOverflow.no); 
     3988assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 33, 33))); 
     3989-------------------- 
     3990      +/ 
     3991    /+ref SysTime+/ void roll(string units)(long months, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
     3992        if(units == "months") 
     3993    { 
     3994        auto hnsecs = adjTime; 
     3995        auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     3996 
     3997        if(hnsecs < 0) 
     3998        { 
     3999            hnsecs += convert!("hours", "hnsecs")(24); 
     4000            --days; 
     4001        } 
     4002 
     4003        auto date = Date(cast(int)days); 
     4004        date.roll!"months"(months, allowOverflow); 
     4005        days = date.dayOfGregorianCal - 1; 
     4006 
     4007        if(days < 0) 
     4008        { 
     4009            hnsecs -= convert!("hours", "hnsecs")(24); 
     4010            ++days; 
     4011        } 
     4012 
     4013        immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
     4014 
     4015        adjTime = newDaysHNSecs + hnsecs; 
     4016    } 
     4017 
     4018    //Test roll!"months"() with AllowDayOverlow.yes 
     4019    unittest 
     4020    { 
     4021        version(testStdDateTime) 
     4022        { 
     4023            //Test A.D. 
     4024            { 
     4025                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4026                sysTime.roll!"months"(3); 
     4027                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     4028                sysTime.roll!"months"(-4); 
     4029                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     4030            } 
     4031 
     4032            { 
     4033                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4034                sysTime.roll!"months"(6); 
     4035                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 6))); 
     4036                sysTime.roll!"months"(-6); 
     4037                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     4038            } 
     4039 
     4040            { 
     4041                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4042                sysTime.roll!"months"(27); 
     4043                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     4044                sysTime.roll!"months"(-28); 
     4045                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     4046            } 
     4047 
     4048            { 
     4049                auto sysTime = SysTime(Date(1999, 5, 31)); 
     4050                sysTime.roll!"months"(1); 
     4051                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 1))); 
     4052            } 
     4053 
     4054            { 
     4055                auto sysTime = SysTime(Date(1999, 5, 31)); 
     4056                sysTime.roll!"months"(-1); 
     4057                assertPred!"=="(sysTime, SysTime(Date(1999, 5, 1))); 
     4058            } 
     4059 
     4060            { 
     4061                auto sysTime = SysTime(Date(1999, 2, 28)); 
     4062                sysTime.roll!"months"(12); 
     4063                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     4064            } 
     4065 
     4066            { 
     4067                auto sysTime = SysTime(Date(2000, 2, 29)); 
     4068                sysTime.roll!"months"(12); 
     4069                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
     4070            } 
     4071 
     4072            { 
     4073                auto sysTime = SysTime(Date(1999, 7, 31)); 
     4074                sysTime.roll!"months"(1); 
     4075                assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
     4076                sysTime.roll!"months"(1); 
     4077                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
     4078            } 
     4079 
     4080            { 
     4081                auto sysTime = SysTime(Date(1998, 8, 31)); 
     4082                sysTime.roll!"months"(13); 
     4083                assertPred!"=="(sysTime, SysTime(Date(1998, 10, 1))); 
     4084                sysTime.roll!"months"(-13); 
     4085                assertPred!"=="(sysTime, SysTime(Date(1998, 9, 1))); 
     4086            } 
     4087 
     4088            { 
     4089                auto sysTime = SysTime(Date(1997, 12, 31)); 
     4090                sysTime.roll!"months"(13); 
     4091                assertPred!"=="(sysTime, SysTime(Date(1997, 1, 31))); 
     4092                sysTime.roll!"months"(-13); 
     4093                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
     4094            } 
     4095 
     4096            { 
     4097                auto sysTime = SysTime(Date(1997, 12, 31)); 
     4098                sysTime.roll!"months"(14); 
     4099                assertPred!"=="(sysTime, SysTime(Date(1997, 3, 3))); 
     4100                sysTime.roll!"months"(-14); 
     4101                assertPred!"=="(sysTime, SysTime(Date(1997, 1, 3))); 
     4102            } 
     4103 
     4104            { 
     4105                auto sysTime = SysTime(Date(1998, 12, 31)); 
     4106                sysTime.roll!"months"(14); 
     4107                assertPred!"=="(sysTime, SysTime(Date(1998, 3, 3))); 
     4108                sysTime.roll!"months"(-14); 
     4109                assertPred!"=="(sysTime, SysTime(Date(1998, 1, 3))); 
     4110            } 
     4111 
     4112            { 
     4113                auto sysTime = SysTime(Date(1999, 12, 31)); 
     4114                sysTime.roll!"months"(14); 
     4115                assertPred!"=="(sysTime, SysTime(Date(1999, 3, 3))); 
     4116                sysTime.roll!"months"(-14); 
     4117                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 3))); 
     4118            } 
     4119 
     4120            { 
     4121                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     4122                sysTime.roll!"months"(3); 
     4123                assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4124                sysTime.roll!"months"(-4); 
     4125                assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4126            } 
     4127 
     4128            { 
     4129                auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4130                sysTime.roll!"months"(14); 
     4131                assertPred!"=="(sysTime, SysTime(DateTime(1998, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4132                sysTime.roll!"months"(-14); 
     4133                assertPred!"=="(sysTime, SysTime(DateTime(1998, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4134            } 
     4135 
     4136            { 
     4137                auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4138                sysTime.roll!"months"(14); 
     4139                assertPred!"=="(sysTime, SysTime(DateTime(1999, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4140                sysTime.roll!"months"(-14); 
     4141                assertPred!"=="(sysTime, SysTime(DateTime(1999, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4142            } 
     4143 
     4144            //Test B.C. 
     4145            { 
     4146                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4147                sysTime.roll!"months"(3); 
     4148                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
     4149                sysTime.roll!"months"(-4); 
     4150                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
     4151            } 
     4152 
     4153            { 
     4154                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4155                sysTime.roll!"months"(6); 
     4156                assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 6))); 
     4157                sysTime.roll!"months"(-6); 
     4158                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     4159            } 
     4160 
     4161            { 
     4162                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4163                sysTime.roll!"months"(-27); 
     4164                assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 6))); 
     4165                sysTime.roll!"months"(28); 
     4166                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
     4167            } 
     4168 
     4169            { 
     4170                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     4171                sysTime.roll!"months"(1); 
     4172                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 1))); 
     4173            } 
     4174 
     4175            { 
     4176                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     4177                sysTime.roll!"months"(-1); 
     4178                assertPred!"=="(sysTime, SysTime(Date(-1999, 5, 1))); 
     4179            } 
     4180 
     4181            { 
     4182                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     4183                sysTime.roll!"months"(-12); 
     4184                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
     4185            } 
     4186 
     4187            { 
     4188                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     4189                sysTime.roll!"months"(-12); 
     4190                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
     4191            } 
     4192 
     4193            { 
     4194                auto sysTime = SysTime(Date(-1999, 7, 31)); 
     4195                sysTime.roll!"months"(1); 
     4196                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
     4197                sysTime.roll!"months"(1); 
     4198                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 1))); 
     4199            } 
     4200 
     4201            { 
     4202                auto sysTime = SysTime(Date(-1998, 8, 31)); 
     4203                sysTime.roll!"months"(13); 
     4204                assertPred!"=="(sysTime, SysTime(Date(-1998, 10, 1))); 
     4205                sysTime.roll!"months"(-13); 
     4206                assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 1))); 
     4207            } 
     4208 
     4209            { 
     4210                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     4211                sysTime.roll!"months"(13); 
     4212                assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 31))); 
     4213                sysTime.roll!"months"(-13); 
     4214                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
     4215            } 
     4216 
     4217            { 
     4218                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     4219                sysTime.roll!"months"(14); 
     4220                assertPred!"=="(sysTime, SysTime(Date(-1997, 3, 3))); 
     4221                sysTime.roll!"months"(-14); 
     4222                assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 3))); 
     4223            } 
     4224 
     4225            { 
     4226                auto sysTime = SysTime(Date(-2002, 12, 31)); 
     4227                sysTime.roll!"months"(14); 
     4228                assertPred!"=="(sysTime, SysTime(Date(-2002, 3, 3))); 
     4229                sysTime.roll!"months"(-14); 
     4230                assertPred!"=="(sysTime, SysTime(Date(-2002, 1, 3))); 
     4231            } 
     4232 
     4233            { 
     4234                auto sysTime = SysTime(Date(-2001, 12, 31)); 
     4235                sysTime.roll!"months"(14); 
     4236                assertPred!"=="(sysTime, SysTime(Date(-2001, 3, 3))); 
     4237                sysTime.roll!"months"(-14); 
     4238                assertPred!"=="(sysTime, SysTime(Date(-2001, 1, 3))); 
     4239            } 
     4240 
     4241            { 
     4242                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     4243                sysTime.roll!"months"(-1); 
     4244                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4245                sysTime.roll!"months"(1); 
     4246                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4247            } 
     4248 
     4249            { 
     4250                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     4251                sysTime.roll!"months"(-1); 
     4252                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4253                sysTime.roll!"months"(1); 
     4254                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4255            } 
     4256 
     4257            { 
     4258                auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     4259                sysTime.roll!"months"(1); 
     4260                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4261                sysTime.roll!"months"(-1); 
     4262                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4263            } 
     4264 
     4265            { 
     4266                auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     4267                sysTime.roll!"months"(1); 
     4268                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4269                sysTime.roll!"months"(-1); 
     4270                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4271            } 
     4272 
     4273            { 
     4274                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007)); 
     4275                sysTime.roll!"months"(3); 
     4276                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007))); 
     4277                sysTime.roll!"months"(-4); 
     4278                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007))); 
     4279            } 
     4280 
     4281            { 
     4282                auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4283                sysTime.roll!"months"(14); 
     4284                assertPred!"=="(sysTime, SysTime(DateTime(-2002, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4285                sysTime.roll!"months"(-14); 
     4286                assertPred!"=="(sysTime, SysTime(DateTime(-2002, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4287            } 
     4288 
     4289            { 
     4290                auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4291                sysTime.roll!"months"(14); 
     4292                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4293                sysTime.roll!"months"(-14); 
     4294                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4295            } 
     4296 
     4297            //Test Both 
     4298            { 
     4299                auto sysTime = SysTime(Date(1, 1, 1)); 
     4300                sysTime.roll!"months"(-1); 
     4301                assertPred!"=="(sysTime, SysTime(Date(1, 12, 1))); 
     4302                sysTime.roll!"months"(1); 
     4303                assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
     4304            } 
     4305 
     4306            { 
     4307                auto sysTime = SysTime(Date(4, 1, 1)); 
     4308                sysTime.roll!"months"(-48); 
     4309                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     4310                sysTime.roll!"months"(48); 
     4311                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     4312            } 
     4313 
     4314            { 
     4315                auto sysTime = SysTime(Date(4, 3, 31)); 
     4316                sysTime.roll!"months"(-49); 
     4317                assertPred!"=="(sysTime, SysTime(Date(4, 3, 2))); 
     4318                sysTime.roll!"months"(49); 
     4319                assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
     4320            } 
     4321 
     4322            { 
     4323                auto sysTime = SysTime(Date(4, 3, 31)); 
     4324                sysTime.roll!"months"(-85); 
     4325                assertPred!"=="(sysTime, SysTime(Date(4, 3, 2))); 
     4326                sysTime.roll!"months"(85); 
     4327                assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
     4328            } 
     4329 
     4330            { 
     4331                auto sysTime = SysTime(Date(-1, 1, 1)); 
     4332                sysTime.roll!"months"(-1); 
     4333                assertPred!"=="(sysTime, SysTime(Date(-1, 12, 1))); 
     4334                sysTime.roll!"months"(1); 
     4335                assertPred!"=="(sysTime, SysTime(Date(-1, 1, 1))); 
     4336            } 
     4337 
     4338            { 
     4339                auto sysTime = SysTime(Date(-4, 1, 1)); 
     4340                sysTime.roll!"months"(-48); 
     4341                assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
     4342                sysTime.roll!"months"(48); 
     4343                assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
     4344            } 
     4345 
     4346            { 
     4347                auto sysTime = SysTime(Date(-4, 3, 31)); 
     4348                sysTime.roll!"months"(-49); 
     4349                assertPred!"=="(sysTime, SysTime(Date(-4, 3, 2))); 
     4350                sysTime.roll!"months"(49); 
     4351                assertPred!"=="(sysTime, SysTime(Date(-4, 4, 2))); 
     4352            } 
     4353 
     4354            { 
     4355                auto sysTime = SysTime(Date(-4, 3, 31)); 
     4356                sysTime.roll!"months"(-85); 
     4357                assertPred!"=="(sysTime, SysTime(Date(-4, 3, 2))); 
     4358                sysTime.roll!"months"(85); 
     4359                assertPred!"=="(sysTime, SysTime(Date(-4, 4, 2))); 
     4360            } 
     4361 
     4362            { 
     4363                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
     4364                sysTime.roll!"months"(-1); 
     4365                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     4366                sysTime.roll!"months"(1); 
     4367                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     4368            } 
     4369 
     4370            { 
     4371                auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     4372                sysTime.roll!"months"(-85); 
     4373                assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 2, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4374                sysTime.roll!"months"(85); 
     4375                assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 2, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4376            } 
     4377 
     4378            { 
     4379                auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     4380                sysTime.roll!"months"(85); 
     4381                assertPred!"=="(sysTime, SysTime(DateTime(-3, 5, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4382                sysTime.roll!"months"(-85); 
     4383                assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4384            } 
     4385 
     4386            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     4387            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     4388            static assert(!__traits(compiles, cst.roll!"months"(4))); 
     4389            //static assert(!__traits(compiles, ist.roll!"months"(4))); 
     4390 
     4391            //Verify Examples. 
     4392            auto st1 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
     4393            st1.roll!"months"(1); 
     4394            assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 33, 33))); 
     4395 
     4396            auto st2 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
     4397            st2.roll!"months"(-1); 
     4398            assert(st2 == SysTime(DateTime(2010, 12, 1, 12, 33, 33))); 
     4399 
     4400            auto st3 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
     4401            st3.roll!"months"(1); 
     4402            assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 33, 33))); 
     4403 
     4404            auto st4 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
     4405            st4.roll!"months"(1, AllowDayOverflow.no); 
     4406            assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 33, 33))); 
     4407        } 
     4408    } 
     4409 
     4410    //Test roll!"months"() with AllowDayOverlow.no 
     4411    unittest 
     4412    { 
     4413        version(testStdDateTime) 
     4414        { 
     4415            //Test A.D. 
     4416            { 
     4417                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4418                sysTime.roll!"months"(3, AllowDayOverflow.no); 
     4419                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     4420                sysTime.roll!"months"(-4, AllowDayOverflow.no); 
     4421                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     4422            } 
     4423 
     4424            { 
     4425                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4426                sysTime.roll!"months"(6, AllowDayOverflow.no); 
     4427                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 6))); 
     4428                sysTime.roll!"months"(-6, AllowDayOverflow.no); 
     4429                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     4430            } 
     4431 
     4432            { 
     4433                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4434                sysTime.roll!"months"(27, AllowDayOverflow.no); 
     4435                assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
     4436                sysTime.roll!"months"(-28, AllowDayOverflow.no); 
     4437                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
     4438            } 
     4439 
     4440            { 
     4441                auto sysTime = SysTime(Date(1999, 5, 31)); 
     4442                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4443                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 30))); 
     4444            } 
     4445 
     4446            { 
     4447                auto sysTime = SysTime(Date(1999, 5, 31)); 
     4448                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4449                assertPred!"=="(sysTime, SysTime(Date(1999, 4, 30))); 
     4450            } 
     4451 
     4452            { 
     4453                auto sysTime = SysTime(Date(1999, 2, 28)); 
     4454                sysTime.roll!"months"(12, AllowDayOverflow.no); 
     4455                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     4456            } 
     4457 
     4458            { 
     4459                auto sysTime = SysTime(Date(2000, 2, 29)); 
     4460                sysTime.roll!"months"(12, AllowDayOverflow.no); 
     4461                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
     4462            } 
     4463 
     4464            { 
     4465                auto sysTime = SysTime(Date(1999, 7, 31)); 
     4466                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4467                assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
     4468                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4469                assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
     4470            } 
     4471 
     4472            { 
     4473                auto sysTime = SysTime(Date(1998, 8, 31)); 
     4474                sysTime.roll!"months"(13, AllowDayOverflow.no); 
     4475                assertPred!"=="(sysTime, SysTime(Date(1998, 9, 30))); 
     4476                sysTime.roll!"months"(-13, AllowDayOverflow.no); 
     4477                assertPred!"=="(sysTime, SysTime(Date(1998, 8, 30))); 
     4478            } 
     4479 
     4480            { 
     4481                auto sysTime = SysTime(Date(1997, 12, 31)); 
     4482                sysTime.roll!"months"(13, AllowDayOverflow.no); 
     4483                assertPred!"=="(sysTime, SysTime(Date(1997, 1, 31))); 
     4484                sysTime.roll!"months"(-13, AllowDayOverflow.no); 
     4485                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
     4486            } 
     4487 
     4488            { 
     4489                auto sysTime = SysTime(Date(1997, 12, 31)); 
     4490                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4491                assertPred!"=="(sysTime, SysTime(Date(1997, 2, 28))); 
     4492                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4493                assertPred!"=="(sysTime, SysTime(Date(1997, 12, 28))); 
     4494            } 
     4495 
     4496            { 
     4497                auto sysTime = SysTime(Date(1998, 12, 31)); 
     4498                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4499                assertPred!"=="(sysTime, SysTime(Date(1998, 2, 28))); 
     4500                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4501                assertPred!"=="(sysTime, SysTime(Date(1998, 12, 28))); 
     4502            } 
     4503 
     4504            { 
     4505                auto sysTime = SysTime(Date(1999, 12, 31)); 
     4506                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4507                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     4508                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4509                assertPred!"=="(sysTime, SysTime(Date(1999, 12, 28))); 
     4510            } 
     4511 
     4512            { 
     4513                auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     4514                sysTime.roll!"months"(3, AllowDayOverflow.no); 
     4515                assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4516                sysTime.roll!"months"(-4, AllowDayOverflow.no); 
     4517                assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4518            } 
     4519 
     4520            { 
     4521                auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4522                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4523                assertPred!"=="(sysTime, SysTime(DateTime(1998, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4524                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4525                assertPred!"=="(sysTime, SysTime(DateTime(1998, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4526            } 
     4527 
     4528            { 
     4529                auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4530                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4531                assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4532                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4533                assertPred!"=="(sysTime, SysTime(DateTime(1999, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4534            } 
     4535 
     4536            //Test B.C. 
     4537            { 
     4538                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4539                sysTime.roll!"months"(3, AllowDayOverflow.no); 
     4540                assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
     4541                sysTime.roll!"months"(-4, AllowDayOverflow.no); 
     4542                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
     4543            } 
     4544 
     4545            { 
     4546                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4547                sysTime.roll!"months"(6, AllowDayOverflow.no); 
     4548                assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 6))); 
     4549                sysTime.roll!"months"(-6, AllowDayOverflow.no); 
     4550                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     4551            } 
     4552 
     4553            { 
     4554                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4555                sysTime.roll!"months"(-27, AllowDayOverflow.no); 
     4556                assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 6))); 
     4557                sysTime.roll!"months"(28, AllowDayOverflow.no); 
     4558                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
     4559            } 
     4560 
     4561            { 
     4562                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     4563                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4564                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 30))); 
     4565            } 
     4566 
     4567            { 
     4568                auto sysTime = SysTime(Date(-1999, 5, 31)); 
     4569                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4570                assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 30))); 
     4571            } 
     4572 
     4573            { 
     4574                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     4575                sysTime.roll!"months"(-12, AllowDayOverflow.no); 
     4576                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
     4577            } 
     4578 
     4579            { 
     4580                auto sysTime = SysTime(Date(-2000, 2, 29)); 
     4581                sysTime.roll!"months"(-12, AllowDayOverflow.no); 
     4582                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
     4583            } 
     4584 
     4585            { 
     4586                auto sysTime = SysTime(Date(-1999, 7, 31)); 
     4587                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4588                assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
     4589                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4590                assertPred!"=="(sysTime, SysTime(Date(-1999, 9, 30))); 
     4591            } 
     4592 
     4593            { 
     4594                auto sysTime = SysTime(Date(-1998, 8, 31)); 
     4595                sysTime.roll!"months"(13, AllowDayOverflow.no); 
     4596                assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 30))); 
     4597                sysTime.roll!"months"(-13, AllowDayOverflow.no); 
     4598                assertPred!"=="(sysTime, SysTime(Date(-1998, 8, 30))); 
     4599            } 
     4600 
     4601            { 
     4602                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     4603                sysTime.roll!"months"(13, AllowDayOverflow.no); 
     4604                assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 31))); 
     4605                sysTime.roll!"months"(-13, AllowDayOverflow.no); 
     4606                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
     4607            } 
     4608 
     4609            { 
     4610                auto sysTime = SysTime(Date(-1997, 12, 31)); 
     4611                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4612                assertPred!"=="(sysTime, SysTime(Date(-1997, 2, 28))); 
     4613                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4614                assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 28))); 
     4615            } 
     4616 
     4617            { 
     4618                auto sysTime = SysTime(Date(-2002, 12, 31)); 
     4619                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4620                assertPred!"=="(sysTime, SysTime(Date(-2002, 2, 28))); 
     4621                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4622                assertPred!"=="(sysTime, SysTime(Date(-2002, 12, 28))); 
     4623            } 
     4624 
     4625            { 
     4626                auto sysTime = SysTime(Date(-2001, 12, 31)); 
     4627                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4628                assertPred!"=="(sysTime, SysTime(Date(-2001, 2, 28))); 
     4629                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4630                assertPred!"=="(sysTime, SysTime(Date(-2001, 12, 28))); 
     4631            } 
     4632 
     4633            { 
     4634                auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
     4635                sysTime.roll!"months"(3, AllowDayOverflow.no); 
     4636                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4637                sysTime.roll!"months"(-4, AllowDayOverflow.no); 
     4638                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
     4639            } 
     4640 
     4641            { 
     4642                auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4643                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4644                assertPred!"=="(sysTime, SysTime(DateTime(-2002, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4645                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4646                assertPred!"=="(sysTime, SysTime(DateTime(-2002, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4647            } 
     4648 
     4649            { 
     4650                auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
     4651                sysTime.roll!"months"(14, AllowDayOverflow.no); 
     4652                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4653                sysTime.roll!"months"(-14, AllowDayOverflow.no); 
     4654                assertPred!"=="(sysTime, SysTime(DateTime(-2001, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
     4655            } 
     4656 
     4657            //Test Both 
     4658            { 
     4659                auto sysTime = SysTime(Date(1, 1, 1)); 
     4660                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4661                assertPred!"=="(sysTime, SysTime(Date(1, 12, 1))); 
     4662                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4663                assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
     4664            } 
     4665 
     4666            { 
     4667                auto sysTime = SysTime(Date(4, 1, 1)); 
     4668                sysTime.roll!"months"(-48, AllowDayOverflow.no); 
     4669                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     4670                sysTime.roll!"months"(48, AllowDayOverflow.no); 
     4671                assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
     4672            } 
     4673 
     4674            { 
     4675                auto sysTime = SysTime(Date(4, 3, 31)); 
     4676                sysTime.roll!"months"(-49, AllowDayOverflow.no); 
     4677                assertPred!"=="(sysTime, SysTime(Date(4, 2, 29))); 
     4678                sysTime.roll!"months"(49, AllowDayOverflow.no); 
     4679                assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
     4680            } 
     4681 
     4682            { 
     4683                auto sysTime = SysTime(Date(4, 3, 31)); 
     4684                sysTime.roll!"months"(-85, AllowDayOverflow.no); 
     4685                assertPred!"=="(sysTime, SysTime(Date(4, 2, 29))); 
     4686                sysTime.roll!"months"(85, AllowDayOverflow.no); 
     4687                assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
     4688            } 
     4689 
     4690            { 
     4691                auto sysTime = SysTime(Date(-1, 1, 1)); 
     4692                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4693                assertPred!"=="(sysTime, SysTime(Date(-1, 12, 1))); 
     4694                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4695                assertPred!"=="(sysTime, SysTime(Date(-1, 1, 1))); 
     4696            } 
     4697 
     4698            { 
     4699                auto sysTime = SysTime(Date(-4, 1, 1)); 
     4700                sysTime.roll!"months"(-48, AllowDayOverflow.no); 
     4701                assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
     4702                sysTime.roll!"months"(48, AllowDayOverflow.no); 
     4703                assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
     4704            } 
     4705 
     4706            { 
     4707                auto sysTime = SysTime(Date(-4, 3, 31)); 
     4708                sysTime.roll!"months"(-49, AllowDayOverflow.no); 
     4709                assertPred!"=="(sysTime, SysTime(Date(-4, 2, 29))); 
     4710                sysTime.roll!"months"(49, AllowDayOverflow.no); 
     4711                assertPred!"=="(sysTime, SysTime(Date(-4, 3, 29))); 
     4712            } 
     4713 
     4714            { 
     4715                auto sysTime = SysTime(Date(-4, 3, 31)); 
     4716                sysTime.roll!"months"(-85, AllowDayOverflow.no); 
     4717                assertPred!"=="(sysTime, SysTime(Date(-4, 2, 29))); 
     4718                sysTime.roll!"months"(85, AllowDayOverflow.no); 
     4719                assertPred!"=="(sysTime, SysTime(Date(-4, 3, 29))); 
     4720            } 
     4721 
     4722            { 
     4723                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     4724                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4725                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4726                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4727                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4728            } 
     4729 
     4730            { 
     4731                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     4732                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4733                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4734                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4735                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4736            } 
     4737 
     4738            { 
     4739                auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     4740                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4741                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4742                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4743                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     4744            } 
     4745 
     4746            { 
     4747                auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     4748                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4749                assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4750                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4751                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     4752            } 
     4753 
     4754            { 
     4755                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
     4756                sysTime.roll!"months"(-1, AllowDayOverflow.no); 
     4757                assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     4758                sysTime.roll!"months"(1, AllowDayOverflow.no); 
     4759                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
     4760            } 
     4761 
     4762            { 
     4763                auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     4764                sysTime.roll!"months"(-85, AllowDayOverflow.no); 
     4765                assertPred!"=="(sysTime, SysTime(DateTime(4, 2, 29, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4766                sysTime.roll!"months"(85, AllowDayOverflow.no); 
     4767                assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 29, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4768            } 
     4769 
     4770            { 
     4771                auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
     4772                sysTime.roll!"months"(85, AllowDayOverflow.no); 
     4773                assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4774                sysTime.roll!"months"(-85, AllowDayOverflow.no); 
     4775                assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
     4776            } 
     4777        } 
     4778    } 
     4779 
     4780 
     4781    /++ 
     4782        Adds the given number of days to this SysTime. A negative number will 
     4783        subtract. 
     4784 
     4785        The difference between rolling and adding is that rolling does not affect 
     4786        larger units. So, if you roll the SysTime one year's worth of days, then 
     4787        you get the exact same SysTime. 
     4788 
     4789        Note that TimeOfDay has no $(D add!"days"()) function because you can add 
     4790        days to a SysTime by adding a duration to it. 
     4791 
     4792        Params: 
     4793            days = The number of days to add to this SysTime. 
     4794 
     4795        Examples: 
     4796-------------------- 
     4797auto st = SysTime(DateTime(2010, 1, 1, 11, 23, 12)); 
     4798st.roll!"days"(1); 
     4799assert(st == SysTime(DateTime(2010, 1, 2, 11, 23, 12))); 
     4800st.roll!"days"(365); 
     4801assert(st == SysTime(DateTime(2010, 1, 26, 11, 23, 12))); 
     4802st.roll!"days"(-32); 
     4803assert(st == SysTime(DateTime(2010, 1, 25, 11, 23, 12))); 
     4804-------------------- 
     4805      +/ 
     4806    /+ref SysTime+/ void roll(string units)(long days) nothrow 
     4807        if(units == "days") 
     4808    { 
     4809        auto hnsecs = adjTime; 
     4810        auto gdays = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     4811 
     4812        if(hnsecs < 0) 
     4813        { 
     4814            hnsecs += convert!("hours", "hnsecs")(24); 
     4815            --gdays; 
     4816        } 
     4817 
     4818        auto date = Date(cast(int)gdays); 
     4819        date.roll!"days"(days); 
     4820        gdays = date.dayOfGregorianCal - 1; 
     4821 
     4822        if(gdays < 0) 
     4823        { 
     4824            hnsecs -= convert!("hours", "hnsecs")(24); 
     4825            ++gdays; 
     4826        } 
     4827 
     4828        immutable newDaysHNSecs = convert!("days", "hnsecs")(gdays); 
     4829 
     4830        adjTime = newDaysHNSecs + hnsecs; 
     4831    } 
     4832 
     4833    unittest 
     4834    { 
     4835        version(testStdDateTime) 
     4836        { 
     4837            //Test A.D. 
     4838            { 
     4839                auto sysTime = SysTime(Date(1999, 2, 28)); 
     4840                sysTime.roll!"days"(1); 
     4841                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 1))); 
     4842                sysTime.roll!"days"(-1); 
     4843                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
     4844            } 
     4845 
     4846            { 
     4847                auto sysTime = SysTime(Date(2000, 2, 28)); 
     4848                sysTime.roll!"days"(1); 
     4849                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
     4850                sysTime.roll!"days"(1); 
     4851                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 1))); 
     4852                sysTime.roll!"days"(-1); 
     4853                assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
     4854            } 
     4855 
     4856            { 
     4857                auto sysTime = SysTime(Date(1999, 6, 30)); 
     4858                sysTime.roll!"days"(1); 
     4859                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 1))); 
     4860                sysTime.roll!"days"(-1); 
     4861                assertPred!"=="(sysTime, SysTime(Date(1999, 6, 30))); 
     4862            } 
     4863 
     4864            { 
     4865                auto sysTime = SysTime(Date(1999, 7, 31)); 
     4866                sysTime.roll!"days"(1); 
     4867                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 1))); 
     4868                sysTime.roll!"days"(-1); 
     4869                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 31))); 
     4870            } 
     4871 
     4872            { 
     4873                auto sysTime = SysTime(Date(1999, 1, 1)); 
     4874                sysTime.roll!"days"(-1); 
     4875                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 31))); 
     4876                sysTime.roll!"days"(1); 
     4877                assertPred!"=="(sysTime, SysTime(Date(1999, 1, 1))); 
     4878            } 
     4879 
     4880            { 
     4881                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4882                sysTime.roll!"days"(9); 
     4883                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 15))); 
     4884                sysTime.roll!"days"(-11); 
     4885                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 4))); 
     4886                sysTime.roll!"days"(30); 
     4887                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 3))); 
     4888                sysTime.roll!"days"(-3); 
     4889                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 31))); 
     4890            } 
     4891 
     4892            { 
     4893                auto sysTime = SysTime(Date(1999, 7, 6)); 
     4894                sysTime.roll!"days"(365); 
     4895                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 30))); 
     4896                sysTime.roll!"days"(-365); 
     4897                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     4898                sysTime.roll!"days"(366); 
     4899                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 31))); 
     4900                sysTime.roll!"days"(730); 
     4901                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 17))); 
     4902                sysTime.roll!"days"(-1096); 
     4903                assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
     4904            } 
     4905 
     4906            { 
     4907                auto sysTime = SysTime(Date(1999, 2, 6)); 
     4908                sysTime.roll!"days"(365); 
     4909                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 7))); 
     4910                sysTime.roll!"days"(-365); 
     4911                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 6))); 
     4912                sysTime.roll!"days"(366); 
     4913                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 8))); 
     4914                sysTime.roll!"days"(730); 
     4915                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 10))); 
     4916                sysTime.roll!"days"(-1096); 
     4917                assertPred!"=="(sysTime, SysTime(Date(1999, 2, 6))); 
     4918            } 
     4919 
     4920            { 
     4921                auto sysTime = SysTime(DateTime(1999, 2, 28, 7, 9, 2), FracSec.from!"usecs"(234578)); 
     4922                sysTime.roll!"days"(1); 
     4923                assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 1, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4924                sysTime.roll!"days"(-1); 
     4925                assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 28, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4926            } 
     4927 
     4928            { 
     4929                auto sysTime = SysTime(DateTime(1999, 7, 6, 7, 9, 2), FracSec.from!"usecs"(234578)); 
     4930                sysTime.roll!"days"(9); 
     4931                assertPred!"=="(sysTime, SysTime(DateTime(1999, 7, 15, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4932                sysTime.roll!"days"(-11); 
     4933                assertPred!"=="(sysTime, SysTime(DateTime(1999, 7, 4, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4934                sysTime.roll!"days"(30); 
     4935                assertPred!"=="(sysTime, SysTime(DateTime(1999, 7, 3, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4936                sysTime.roll!"days"(-3); 
     4937                assertPred!"=="(sysTime, SysTime(DateTime(1999, 7, 31, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     4938            } 
     4939 
     4940            //Test B.C. 
     4941            { 
     4942                auto sysTime = SysTime(Date(-1999, 2, 28)); 
     4943                sysTime.roll!"days"(1); 
     4944                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 1))); 
     4945                sysTime.roll!"days"(-1); 
     4946                assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
     4947            } 
     4948 
     4949            { 
     4950                auto sysTime = SysTime(Date(-2000, 2, 28)); 
     4951                sysTime.roll!"days"(1); 
     4952                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
     4953                sysTime.roll!"days"(1); 
     4954                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 1))); 
     4955                sysTime.roll!"days"(-1); 
     4956                assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
     4957            } 
     4958 
     4959            { 
     4960                auto sysTime = SysTime(Date(-1999, 6, 30)); 
     4961                sysTime.roll!"days"(1); 
     4962                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 1))); 
     4963                sysTime.roll!"days"(-1); 
     4964                assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 30))); 
     4965            } 
     4966 
     4967            { 
     4968                auto sysTime = SysTime(Date(-1999, 7, 31)); 
     4969                sysTime.roll!"days"(1); 
     4970                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 1))); 
     4971                sysTime.roll!"days"(-1); 
     4972                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 31))); 
     4973            } 
     4974 
     4975            { 
     4976                auto sysTime = SysTime(Date(-1999, 1, 1)); 
     4977                sysTime.roll!"days"(-1); 
     4978                assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 31))); 
     4979                sysTime.roll!"days"(1); 
     4980                assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 1))); 
     4981            } 
     4982 
     4983            { 
     4984                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4985                sysTime.roll!"days"(9); 
     4986                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 15))); 
     4987                sysTime.roll!"days"(-11); 
     4988                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 4))); 
     4989                sysTime.roll!"days"(30); 
     4990                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 3))); 
     4991                sysTime.roll!"days"(-3); 
     4992                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 31))); 
     4993            } 
     4994 
     4995            { 
     4996                auto sysTime = SysTime(Date(-1999, 7, 6)); 
     4997                sysTime.roll!"days"(365); 
     4998                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 30))); 
     4999                sysTime.roll!"days"(-365); 
     5000                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     5001                sysTime.roll!"days"(366); 
     5002                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 31))); 
     5003                sysTime.roll!"days"(730); 
     5004                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 17))); 
     5005                sysTime.roll!"days"(-1096); 
     5006                assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
     5007            } 
     5008 
     5009            { 
     5010                auto sysTime = SysTime(DateTime(-1999, 2, 28, 7, 9, 2), FracSec.from!"usecs"(234578)); 
     5011                sysTime.roll!"days"(1); 
     5012                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 1, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     5013                sysTime.roll!"days"(-1); 
     5014                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 28, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     5015            } 
     5016 
     5017            { 
     5018                auto sysTime = SysTime(DateTime(-1999, 7, 6, 7, 9, 2), FracSec.from!"usecs"(234578)); 
     5019                sysTime.roll!"days"(9); 
     5020                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 7, 15, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     5021                sysTime.roll!"days"(-11); 
     5022                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 7, 4, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     5023                sysTime.roll!"days"(30); 
     5024                assertPred!"=="(sysTime, SysTime(DateTime(-1999, 7, 3, 7, 9, 2), FracSec.from!"usecs"(234578))); 
     5025                sysTime.roll!"days"(-3); 
     5026            } 
     5027 
     5028            //Test Both 
     5029            { 
     5030                auto sysTime = SysTime(Date(1, 7, 6)); 
     5031                sysTime.roll!"days"(-365); 
     5032                assertPred!"=="(sysTime, SysTime(Date(1, 7, 13))); 
     5033                sysTime.roll!"days"(365); 
     5034                assertPred!"=="(sysTime, SysTime(Date(1, 7, 6))); 
     5035                sysTime.roll!"days"(-731); 
     5036                assertPred!"=="(sysTime, SysTime(Date(1, 7, 19))); 
     5037                sysTime.roll!"days"(730); 
     5038                assertPred!"=="(sysTime, SysTime(Date(1, 7, 5))); 
     5039            } 
     5040 
     5041            { 
     5042                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     5043                sysTime.roll!"days"(-1); 
     5044                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 31, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5045                sysTime.roll!"days"(1); 
     5046                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5047            } 
     5048 
     5049            { 
     5050                auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5051                sysTime.roll!"days"(-1); 
     5052                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5053                sysTime.roll!"days"(1); 
     5054                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5055            } 
     5056 
     5057            { 
     5058                auto sysTime = SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     5059                sysTime.roll!"days"(1); 
     5060                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5061                sysTime.roll!"days"(-1); 
     5062                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5063            } 
     5064 
     5065            { 
     5066                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5067                sysTime.roll!"days"(1); 
     5068                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5069                sysTime.roll!"days"(-1); 
     5070                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5071            } 
     5072 
     5073            { 
     5074                auto sysTime = SysTime(DateTime(1, 7, 6, 13, 13, 9), FracSec.from!"msecs"(22)); 
     5075                sysTime.roll!"days"(-365); 
     5076                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 13, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5077                sysTime.roll!"days"(365); 
     5078                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 6, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5079                sysTime.roll!"days"(-731); 
     5080                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 19, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5081                sysTime.roll!"days"(730); 
     5082                assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 5, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5083            } 
     5084 
     5085            { 
     5086                auto sysTime = SysTime(DateTime(0, 7, 6, 13, 13, 9), FracSec.from!"msecs"(22)); 
     5087                sysTime.roll!"days"(-365); 
     5088                assertPred!"=="(sysTime, SysTime(DateTime(0, 7, 13, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5089                sysTime.roll!"days"(365); 
     5090                assertPred!"=="(sysTime, SysTime(DateTime(0, 7, 6, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5091                sysTime.roll!"days"(-731); 
     5092                assertPred!"=="(sysTime, SysTime(DateTime(0, 7, 19, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5093                sysTime.roll!"days"(730); 
     5094                assertPred!"=="(sysTime, SysTime(DateTime(0, 7, 5, 13, 13, 9), FracSec.from!"msecs"(22))); 
     5095            } 
     5096 
     5097            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5098            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5099            static assert(!__traits(compiles, cst.roll!"days"(4))); 
     5100            //static assert(!__traits(compiles, ist.roll!"days"(4))); 
     5101 
     5102            //Verify Examples. 
     5103            auto st = SysTime(DateTime(2010, 1, 1, 11, 23, 12)); 
     5104            st.roll!"days"(1); 
     5105            assert(st == SysTime(DateTime(2010, 1, 2, 11, 23, 12))); 
     5106            st.roll!"days"(365); 
     5107            assert(st == SysTime(DateTime(2010, 1, 26, 11, 23, 12))); 
     5108            st.roll!"days"(-32); 
     5109            assert(st == SysTime(DateTime(2010, 1, 25, 11, 23, 12))); 
     5110        } 
     5111    } 
     5112 
     5113 
     5114 
     5115    /++ 
     5116        Add hours to the time of day. Negative values will subtract. 
     5117 
     5118        The difference between rolling and adding is that rolling does not 
     5119        affect larger units. So, if you roll the SysTime 24 hours, you get 
     5120        the exact same SysTime. 
     5121 
     5122        Note that SysTime has no $(D add!"hours"()), $(D add!"minutes"()), or 
     5123        $(D add!"seconds"()) function because you can add those units to 
     5124        a SysTime by adding a duration to it. 
     5125 
     5126        Params: 
     5127            hours = The number of hours to add to this SysTime. 
     5128 
     5129        Examples: 
     5130-------------------- 
     5131auto st1 = SysTime(DateTime(2010, 7, 4, 12, 0, 0)); 
     5132st1.roll!"hours"(1); 
     5133assert(st1 == SysTime(DateTime(2010, 7, 4, 13, 0, 0))); 
     5134 
     5135auto st2 = SysTime(DateTime(2010, 2, 12, 12, 0, 0)); 
     5136st2.roll!"hours"(-1); 
     5137assert(st2 == SysTime(DateTime(2010, 2, 12, 11, 0, 0))); 
     5138 
     5139auto st3 = SysTime(DateTime(2009, 12, 31, 0, 0, 0)); 
     5140st3.roll!"minutes"(1); 
     5141assert(st3 == SysTime(DateTime(2009, 12, 31, 0, 1, 0))); 
     5142 
     5143auto st4 = SysTime(DateTime(2010, 1, 1, 0, 0, 0)); 
     5144st4.roll!"minutes"(-1); 
     5145assert(st4 == SysTime(DateTime(2010, 1, 1, 0, 59, 0))); 
     5146 
     5147auto st5 = SysTime(DateTime(2009, 12, 31, 0, 0, 0)); 
     5148st5.roll!"seconds"(1); 
     5149assert(st5 == SysTime(DateTime(2009, 12, 31, 0, 0, 1))); 
     5150 
     5151auto st6 = SysTime(DateTime(2010, 1, 1, 0, 0, 0)); 
     5152st6.roll!"seconds"(-1); 
     5153assert(st6 == SysTime(DateTime(2010, 1, 1, 0, 0, 59))); 
     5154-------------------- 
     5155      +/ 
     5156    /+ref SysTime+/ void roll(string units)(long value) nothrow 
     5157        if(units == "hours" || 
     5158           units == "minutes" || 
     5159           units == "seconds") 
     5160    { 
     5161        try 
     5162        { 
     5163            auto hnsecs = adjTime; 
     5164            auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     5165 
     5166            if(hnsecs < 0) 
     5167            { 
     5168                hnsecs += convert!("hours", "hnsecs")(24); 
     5169                --days; 
     5170            } 
     5171 
     5172            immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     5173            immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     5174            immutable second = splitUnitsFromHNSecs!"seconds"(hnsecs); 
     5175 
     5176            auto dateTime = DateTime(Date(cast(int)days), TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second)); 
     5177            dateTime.roll!units(value); 
     5178            --days; 
     5179 
     5180            hnsecs += convert!("hours", "hnsecs")(dateTime.hour); 
     5181            hnsecs += convert!("minutes", "hnsecs")(dateTime.minute); 
     5182            hnsecs += convert!("seconds", "hnsecs")(dateTime.second); 
     5183 
     5184            if(days < 0) 
     5185            { 
     5186                hnsecs -= convert!("hours", "hnsecs")(24); 
     5187                ++days; 
     5188            } 
     5189 
     5190            immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
     5191 
     5192            adjTime = newDaysHNSecs + hnsecs; 
     5193        } 
     5194        catch(Exception e) 
     5195            assert(0, "Either DateTime's constructor or TimeOfDay's constructor threw."); 
     5196    } 
     5197 
     5198    //Test roll!"hours"(). 
     5199    unittest 
     5200    { 
     5201        version(testStdDateTime) 
     5202        { 
     5203            static void TestST(SysTime orig, int hours, in SysTime expected, size_t line = __LINE__) 
     5204            { 
     5205                orig.roll!"hours"(hours); 
     5206                assertPred!"=="(orig, expected, "", __FILE__, line); 
     5207            } 
     5208 
     5209            //Test A.D. 
     5210            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5211            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5212            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 2, SysTime(DateTime(1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5213            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 3, SysTime(DateTime(1999, 7, 6, 15, 30, 33), FracSec.from!"msecs"(45))); 
     5214            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 4, SysTime(DateTime(1999, 7, 6, 16, 30, 33), FracSec.from!"msecs"(45))); 
     5215            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 5, SysTime(DateTime(1999, 7, 6, 17, 30, 33), FracSec.from!"msecs"(45))); 
     5216            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 6, SysTime(DateTime(1999, 7, 6, 18, 30, 33), FracSec.from!"msecs"(45))); 
     5217            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 7, SysTime(DateTime(1999, 7, 6, 19, 30, 33), FracSec.from!"msecs"(45))); 
     5218            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 8, SysTime(DateTime(1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5219            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 9, SysTime(DateTime(1999, 7, 6, 21, 30, 33), FracSec.from!"msecs"(45))); 
     5220            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 10, SysTime(DateTime(1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5221            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 11, SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5222            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 12, SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5223            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 13, SysTime(DateTime(1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5224            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 14, SysTime(DateTime(1999, 7, 6, 2, 30, 33), FracSec.from!"msecs"(45))); 
     5225            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 15, SysTime(DateTime(1999, 7, 6, 3, 30, 33), FracSec.from!"msecs"(45))); 
     5226            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 16, SysTime(DateTime(1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5227            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 17, SysTime(DateTime(1999, 7, 6, 5, 30, 33), FracSec.from!"msecs"(45))); 
     5228            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 18, SysTime(DateTime(1999, 7, 6, 6, 30, 33), FracSec.from!"msecs"(45))); 
     5229            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 19, SysTime(DateTime(1999, 7, 6, 7, 30, 33), FracSec.from!"msecs"(45))); 
     5230            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 20, SysTime(DateTime(1999, 7, 6, 8, 30, 33), FracSec.from!"msecs"(45))); 
     5231            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 21, SysTime(DateTime(1999, 7, 6, 9, 30, 33), FracSec.from!"msecs"(45))); 
     5232            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 22, SysTime(DateTime(1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5233            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 23, SysTime(DateTime(1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5234            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 24, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5235            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5236            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 50, SysTime(DateTime(1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5237            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 10_000, SysTime(DateTime(1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5238 
     5239            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5240            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -2, SysTime(DateTime(1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5241            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -3, SysTime(DateTime(1999, 7, 6, 9, 30, 33), FracSec.from!"msecs"(45))); 
     5242            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -4, SysTime(DateTime(1999, 7, 6, 8, 30, 33), FracSec.from!"msecs"(45))); 
     5243            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -5, SysTime(DateTime(1999, 7, 6, 7, 30, 33), FracSec.from!"msecs"(45))); 
     5244            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -6, SysTime(DateTime(1999, 7, 6, 6, 30, 33), FracSec.from!"msecs"(45))); 
     5245            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -7, SysTime(DateTime(1999, 7, 6, 5, 30, 33), FracSec.from!"msecs"(45))); 
     5246            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -8, SysTime(DateTime(1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5247            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -9, SysTime(DateTime(1999, 7, 6, 3, 30, 33), FracSec.from!"msecs"(45))); 
     5248            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -10, SysTime(DateTime(1999, 7, 6, 2, 30, 33), FracSec.from!"msecs"(45))); 
     5249            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -11, SysTime(DateTime(1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5250            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -12, SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5251            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -13, SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5252            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -14, SysTime(DateTime(1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5253            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -15, SysTime(DateTime(1999, 7, 6, 21, 30, 33), FracSec.from!"msecs"(45))); 
     5254            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -16, SysTime(DateTime(1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5255            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -17, SysTime(DateTime(1999, 7, 6, 19, 30, 33), FracSec.from!"msecs"(45))); 
     5256            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -18, SysTime(DateTime(1999, 7, 6, 18, 30, 33), FracSec.from!"msecs"(45))); 
     5257            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -19, SysTime(DateTime(1999, 7, 6, 17, 30, 33), FracSec.from!"msecs"(45))); 
     5258            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -20, SysTime(DateTime(1999, 7, 6, 16, 30, 33), FracSec.from!"msecs"(45))); 
     5259            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -21, SysTime(DateTime(1999, 7, 6, 15, 30, 33), FracSec.from!"msecs"(45))); 
     5260            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -22, SysTime(DateTime(1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5261            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -23, SysTime(DateTime(1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5262            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -24, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5263            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5264            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -50, SysTime(DateTime(1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5265            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -10_000, SysTime(DateTime(1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5266 
     5267            TestST(SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5268            TestST(SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5269            TestST(SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5270 
     5271            TestST(SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5272            TestST(SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5273            TestST(SysTime(DateTime(1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5274 
     5275            TestST(SysTime(DateTime(1999, 7, 31, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(1999, 7, 31, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5276            TestST(SysTime(DateTime(1999, 8, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(1999, 8, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5277 
     5278            TestST(SysTime(DateTime(1999, 12, 31, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(1999, 12, 31, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5279            TestST(SysTime(DateTime(2000, 1, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(2000, 1, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5280 
     5281            TestST(SysTime(DateTime(1999, 2, 28, 23, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(1999, 2, 28, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5282            TestST(SysTime(DateTime(1999, 3, 2, 0, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(1999, 3, 2, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5283 
     5284            TestST(SysTime(DateTime(2000, 2, 28, 23, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(2000, 2, 28, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5285            TestST(SysTime(DateTime(2000, 3, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(2000, 3, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5286 
     5287            //Test B.C. 
     5288            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5289            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(-1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5290            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 2, SysTime(DateTime(-1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5291            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 3, SysTime(DateTime(-1999, 7, 6, 15, 30, 33), FracSec.from!"msecs"(45))); 
     5292            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 4, SysTime(DateTime(-1999, 7, 6, 16, 30, 33), FracSec.from!"msecs"(45))); 
     5293            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 5, SysTime(DateTime(-1999, 7, 6, 17, 30, 33), FracSec.from!"msecs"(45))); 
     5294            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 6, SysTime(DateTime(-1999, 7, 6, 18, 30, 33), FracSec.from!"msecs"(45))); 
     5295            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 7, SysTime(DateTime(-1999, 7, 6, 19, 30, 33), FracSec.from!"msecs"(45))); 
     5296            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 8, SysTime(DateTime(-1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5297            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 9, SysTime(DateTime(-1999, 7, 6, 21, 30, 33), FracSec.from!"msecs"(45))); 
     5298            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 10, SysTime(DateTime(-1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5299            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 11, SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5300            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 12, SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5301            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 13, SysTime(DateTime(-1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5302            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 14, SysTime(DateTime(-1999, 7, 6, 2, 30, 33), FracSec.from!"msecs"(45))); 
     5303            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 15, SysTime(DateTime(-1999, 7, 6, 3, 30, 33), FracSec.from!"msecs"(45))); 
     5304            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 16, SysTime(DateTime(-1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5305            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 17, SysTime(DateTime(-1999, 7, 6, 5, 30, 33), FracSec.from!"msecs"(45))); 
     5306            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 18, SysTime(DateTime(-1999, 7, 6, 6, 30, 33), FracSec.from!"msecs"(45))); 
     5307            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 19, SysTime(DateTime(-1999, 7, 6, 7, 30, 33), FracSec.from!"msecs"(45))); 
     5308            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 20, SysTime(DateTime(-1999, 7, 6, 8, 30, 33), FracSec.from!"msecs"(45))); 
     5309            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 21, SysTime(DateTime(-1999, 7, 6, 9, 30, 33), FracSec.from!"msecs"(45))); 
     5310            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 22, SysTime(DateTime(-1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5311            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 23, SysTime(DateTime(-1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5312            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 24, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5313            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(-1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5314            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 50, SysTime(DateTime(-1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5315            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), 10_000, SysTime(DateTime(-1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5316 
     5317            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(-1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5318            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -2, SysTime(DateTime(-1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5319            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -3, SysTime(DateTime(-1999, 7, 6, 9, 30, 33), FracSec.from!"msecs"(45))); 
     5320            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -4, SysTime(DateTime(-1999, 7, 6, 8, 30, 33), FracSec.from!"msecs"(45))); 
     5321            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -5, SysTime(DateTime(-1999, 7, 6, 7, 30, 33), FracSec.from!"msecs"(45))); 
     5322            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -6, SysTime(DateTime(-1999, 7, 6, 6, 30, 33), FracSec.from!"msecs"(45))); 
     5323            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -7, SysTime(DateTime(-1999, 7, 6, 5, 30, 33), FracSec.from!"msecs"(45))); 
     5324            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -8, SysTime(DateTime(-1999, 7, 6, 4, 30, 33), FracSec.from!"msecs"(45))); 
     5325            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -9, SysTime(DateTime(-1999, 7, 6, 3, 30, 33), FracSec.from!"msecs"(45))); 
     5326            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -10, SysTime(DateTime(-1999, 7, 6, 2, 30, 33), FracSec.from!"msecs"(45))); 
     5327            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -11, SysTime(DateTime(-1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5328            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -12, SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5329            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -13, SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5330            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -14, SysTime(DateTime(-1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5331            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -15, SysTime(DateTime(-1999, 7, 6, 21, 30, 33), FracSec.from!"msecs"(45))); 
     5332            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -16, SysTime(DateTime(-1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5333            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -17, SysTime(DateTime(-1999, 7, 6, 19, 30, 33), FracSec.from!"msecs"(45))); 
     5334            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -18, SysTime(DateTime(-1999, 7, 6, 18, 30, 33), FracSec.from!"msecs"(45))); 
     5335            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -19, SysTime(DateTime(-1999, 7, 6, 17, 30, 33), FracSec.from!"msecs"(45))); 
     5336            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -20, SysTime(DateTime(-1999, 7, 6, 16, 30, 33), FracSec.from!"msecs"(45))); 
     5337            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -21, SysTime(DateTime(-1999, 7, 6, 15, 30, 33), FracSec.from!"msecs"(45))); 
     5338            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -22, SysTime(DateTime(-1999, 7, 6, 14, 30, 33), FracSec.from!"msecs"(45))); 
     5339            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -23, SysTime(DateTime(-1999, 7, 6, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5340            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -24, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45))); 
     5341            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(-1999, 7, 6, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5342            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -50, SysTime(DateTime(-1999, 7, 6, 10, 30, 33), FracSec.from!"msecs"(45))); 
     5343            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(45)), -10_000, SysTime(DateTime(-1999, 7, 6, 20, 30, 33), FracSec.from!"msecs"(45))); 
     5344 
     5345            TestST(SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(-1999, 7, 6, 1, 30, 33), FracSec.from!"msecs"(45))); 
     5346            TestST(SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5347            TestST(SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5348 
     5349            TestST(SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(-1999, 7, 6, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5350            TestST(SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), 0, SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5351            TestST(SysTime(DateTime(-1999, 7, 6, 23, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(-1999, 7, 6, 22, 30, 33), FracSec.from!"msecs"(45))); 
     5352 
     5353            TestST(SysTime(DateTime(-1999, 7, 31, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(-1999, 7, 31, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5354            TestST(SysTime(DateTime(-1999, 8, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(-1999, 8, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5355 
     5356            TestST(SysTime(DateTime(-2001, 12, 31, 23, 30, 33), FracSec.from!"msecs"(45)), 1, SysTime(DateTime(-2001, 12, 31, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5357            TestST(SysTime(DateTime(-2000, 1, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -1, SysTime(DateTime(-2000, 1, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5358 
     5359            TestST(SysTime(DateTime(-2001, 2, 28, 23, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(-2001, 2, 28, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5360            TestST(SysTime(DateTime(-2001, 3, 2, 0, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(-2001, 3, 2, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5361 
     5362            TestST(SysTime(DateTime(-2000, 2, 28, 23, 30, 33), FracSec.from!"msecs"(45)), 25, SysTime(DateTime(-2000, 2, 28, 0, 30, 33), FracSec.from!"msecs"(45))); 
     5363            TestST(SysTime(DateTime(-2000, 3, 1, 0, 30, 33), FracSec.from!"msecs"(45)), -25, SysTime(DateTime(-2000, 3, 1, 23, 30, 33), FracSec.from!"msecs"(45))); 
     5364 
     5365            //Test Both 
     5366            TestST(SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"msecs"(45)), 17_546, SysTime(DateTime(-1, 1, 1, 13, 30, 33), FracSec.from!"msecs"(45))); 
     5367            TestST(SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"msecs"(45)), -17_546, SysTime(DateTime(1, 1, 1, 11, 30, 33), FracSec.from!"msecs"(45))); 
     5368 
     5369            { 
     5370                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     5371                sysTime.roll!"hours"(-1); 
     5372                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 0, 0), FracSec.from!"hnsecs"(0))); 
     5373                sysTime.roll!"hours"(1); 
     5374                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5375            } 
     5376 
     5377            { 
     5378                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5379                sysTime.roll!"hours"(-1); 
     5380                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5381                sysTime.roll!"hours"(1); 
     5382                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5383            } 
     5384 
     5385            { 
     5386                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 0, 0), FracSec.from!"hnsecs"(0)); 
     5387                sysTime.roll!"hours"(1); 
     5388                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5389                sysTime.roll!"hours"(-1); 
     5390                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 0, 0), FracSec.from!"hnsecs"(0))); 
     5391            } 
     5392 
     5393            { 
     5394                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5395                sysTime.roll!"hours"(1); 
     5396                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 0, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5397                sysTime.roll!"hours"(-1); 
     5398                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5399            } 
     5400 
     5401            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5402            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5403            static assert(!__traits(compiles, cst.roll!"hours"(4))); 
     5404            //static assert(!__traits(compiles, ist.roll!"hours"(4))); 
     5405 
     5406            //Verify Examples. 
     5407            auto st1 = SysTime(DateTime(2010, 7, 4, 12, 0, 0)); 
     5408            st1.roll!"hours"(1); 
     5409            assert(st1 == SysTime(DateTime(2010, 7, 4, 13, 0, 0))); 
     5410 
     5411            auto st2 = SysTime(DateTime(2010, 2, 12, 12, 0, 0)); 
     5412            st2.roll!"hours"(-1); 
     5413            assert(st2 == SysTime(DateTime(2010, 2, 12, 11, 0, 0))); 
     5414 
     5415            auto st3 = SysTime(DateTime(2009, 12, 31, 0, 0, 0)); 
     5416            st3.roll!"minutes"(1); 
     5417            assert(st3 == SysTime(DateTime(2009, 12, 31, 0, 1, 0))); 
     5418 
     5419            auto st4 = SysTime(DateTime(2010, 1, 1, 0, 0, 0)); 
     5420            st4.roll!"minutes"(-1); 
     5421            assert(st4 == SysTime(DateTime(2010, 1, 1, 0, 59, 0))); 
     5422 
     5423            auto st5 = SysTime(DateTime(2009, 12, 31, 0, 0, 0)); 
     5424            st5.roll!"seconds"(1); 
     5425            assert(st5 == SysTime(DateTime(2009, 12, 31, 0, 0, 1))); 
     5426 
     5427            auto st6 = SysTime(DateTime(2010, 1, 1, 0, 0, 0)); 
     5428            st6.roll!"seconds"(-1); 
     5429            assert(st6 == SysTime(DateTime(2010, 1, 1, 0, 0, 59))); 
     5430        } 
     5431    } 
     5432 
     5433    //Test roll!"minutes"(). 
     5434    unittest 
     5435    { 
     5436        version(testStdDateTime) 
     5437        { 
     5438            static void TestST(SysTime orig, int minutes, in SysTime expected, size_t line = __LINE__) 
     5439            { 
     5440                orig.roll!"minutes"(minutes); 
     5441                assertPred!"=="(orig, expected, "", __FILE__, line); 
     5442            } 
     5443 
     5444            //Test A.D. 
     5445            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5446            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5447            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 2, SysTime(DateTime(1999, 7, 6, 12, 32, 33), FracSec.from!"usecs"(7203))); 
     5448            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 3, SysTime(DateTime(1999, 7, 6, 12, 33, 33), FracSec.from!"usecs"(7203))); 
     5449            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 4, SysTime(DateTime(1999, 7, 6, 12, 34, 33), FracSec.from!"usecs"(7203))); 
     5450            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 5, SysTime(DateTime(1999, 7, 6, 12, 35, 33), FracSec.from!"usecs"(7203))); 
     5451            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 10, SysTime(DateTime(1999, 7, 6, 12, 40, 33), FracSec.from!"usecs"(7203))); 
     5452            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 15, SysTime(DateTime(1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5453            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 29, SysTime(DateTime(1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5454            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 30, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5455            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 45, SysTime(DateTime(1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5456            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 60, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5457            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 75, SysTime(DateTime(1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5458            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 90, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5459            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 100, SysTime(DateTime(1999, 7, 6, 12, 10, 33), FracSec.from!"usecs"(7203))); 
     5460 
     5461            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 689, SysTime(DateTime(1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5462            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 690, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5463            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 691, SysTime(DateTime(1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5464            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 960, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5465            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1439, SysTime(DateTime(1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5466            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1440, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5467            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1441, SysTime(DateTime(1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5468            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 2880, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5469 
     5470            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5471            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -2, SysTime(DateTime(1999, 7, 6, 12, 28, 33), FracSec.from!"usecs"(7203))); 
     5472            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -3, SysTime(DateTime(1999, 7, 6, 12, 27, 33), FracSec.from!"usecs"(7203))); 
     5473            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -4, SysTime(DateTime(1999, 7, 6, 12, 26, 33), FracSec.from!"usecs"(7203))); 
     5474            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -5, SysTime(DateTime(1999, 7, 6, 12, 25, 33), FracSec.from!"usecs"(7203))); 
     5475            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -10, SysTime(DateTime(1999, 7, 6, 12, 20, 33), FracSec.from!"usecs"(7203))); 
     5476            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -15, SysTime(DateTime(1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5477            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -29, SysTime(DateTime(1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5478            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -30, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5479            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -45, SysTime(DateTime(1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5480            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -60, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5481            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -75, SysTime(DateTime(1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5482            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -90, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5483            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -100, SysTime(DateTime(1999, 7, 6, 12, 50, 33), FracSec.from!"usecs"(7203))); 
     5484 
     5485            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -749, SysTime(DateTime(1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5486            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -750, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5487            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -751, SysTime(DateTime(1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5488            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -960, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5489            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1439, SysTime(DateTime(1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5490            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1440, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5491            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1441, SysTime(DateTime(1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5492            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -2880, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5493 
     5494            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5495            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5496            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5497 
     5498            TestST(SysTime(DateTime(1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1999, 7, 6, 11, 0, 33), FracSec.from!"usecs"(7203))); 
     5499            TestST(SysTime(DateTime(1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203))); 
     5500            TestST(SysTime(DateTime(1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1999, 7, 6, 11, 58, 33), FracSec.from!"usecs"(7203))); 
     5501 
     5502            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1999, 7, 6, 0, 1, 33), FracSec.from!"usecs"(7203))); 
     5503            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203))); 
     5504            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1999, 7, 6, 0, 59, 33), FracSec.from!"usecs"(7203))); 
     5505 
     5506            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1999, 7, 5, 23, 0, 33), FracSec.from!"usecs"(7203))); 
     5507            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203))); 
     5508            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1999, 7, 5, 23, 58, 33), FracSec.from!"usecs"(7203))); 
     5509 
     5510            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(1998, 12, 31, 23, 0, 33), FracSec.from!"usecs"(7203))); 
     5511            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(1998, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203))); 
     5512            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(1998, 12, 31, 23, 58, 33), FracSec.from!"usecs"(7203))); 
     5513 
     5514            //Test B.C. 
     5515            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5516            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5517            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 2, SysTime(DateTime(-1999, 7, 6, 12, 32, 33), FracSec.from!"usecs"(7203))); 
     5518            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 3, SysTime(DateTime(-1999, 7, 6, 12, 33, 33), FracSec.from!"usecs"(7203))); 
     5519            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 4, SysTime(DateTime(-1999, 7, 6, 12, 34, 33), FracSec.from!"usecs"(7203))); 
     5520            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 5, SysTime(DateTime(-1999, 7, 6, 12, 35, 33), FracSec.from!"usecs"(7203))); 
     5521            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 10, SysTime(DateTime(-1999, 7, 6, 12, 40, 33), FracSec.from!"usecs"(7203))); 
     5522            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 15, SysTime(DateTime(-1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5523            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 29, SysTime(DateTime(-1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5524            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 30, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5525            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 45, SysTime(DateTime(-1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5526            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 60, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5527            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 75, SysTime(DateTime(-1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5528            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 90, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5529            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 100, SysTime(DateTime(-1999, 7, 6, 12, 10, 33), FracSec.from!"usecs"(7203))); 
     5530 
     5531            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 689, SysTime(DateTime(-1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5532            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 690, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5533            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 691, SysTime(DateTime(-1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5534            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 960, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5535            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1439, SysTime(DateTime(-1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5536            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1440, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5537            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 1441, SysTime(DateTime(-1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5538            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), 2880, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5539 
     5540            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5541            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -2, SysTime(DateTime(-1999, 7, 6, 12, 28, 33), FracSec.from!"usecs"(7203))); 
     5542            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -3, SysTime(DateTime(-1999, 7, 6, 12, 27, 33), FracSec.from!"usecs"(7203))); 
     5543            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -4, SysTime(DateTime(-1999, 7, 6, 12, 26, 33), FracSec.from!"usecs"(7203))); 
     5544            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -5, SysTime(DateTime(-1999, 7, 6, 12, 25, 33), FracSec.from!"usecs"(7203))); 
     5545            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -10, SysTime(DateTime(-1999, 7, 6, 12, 20, 33), FracSec.from!"usecs"(7203))); 
     5546            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -15, SysTime(DateTime(-1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5547            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -29, SysTime(DateTime(-1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5548            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -30, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5549            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -45, SysTime(DateTime(-1999, 7, 6, 12, 45, 33), FracSec.from!"usecs"(7203))); 
     5550            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -60, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5551            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -75, SysTime(DateTime(-1999, 7, 6, 12, 15, 33), FracSec.from!"usecs"(7203))); 
     5552            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -90, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5553            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -100, SysTime(DateTime(-1999, 7, 6, 12, 50, 33), FracSec.from!"usecs"(7203))); 
     5554 
     5555            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -749, SysTime(DateTime(-1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5556            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -750, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5557            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -751, SysTime(DateTime(-1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5558            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -960, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5559            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1439, SysTime(DateTime(-1999, 7, 6, 12, 31, 33), FracSec.from!"usecs"(7203))); 
     5560            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1440, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5561            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -1441, SysTime(DateTime(-1999, 7, 6, 12, 29, 33), FracSec.from!"usecs"(7203))); 
     5562            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203)), -2880, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7203))); 
     5563 
     5564            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-1999, 7, 6, 12, 1, 33), FracSec.from!"usecs"(7203))); 
     5565            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203))); 
     5566            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-1999, 7, 6, 12, 59, 33), FracSec.from!"usecs"(7203))); 
     5567 
     5568            TestST(SysTime(DateTime(-1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-1999, 7, 6, 11, 0, 33), FracSec.from!"usecs"(7203))); 
     5569            TestST(SysTime(DateTime(-1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203))); 
     5570            TestST(SysTime(DateTime(-1999, 7, 6, 11, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-1999, 7, 6, 11, 58, 33), FracSec.from!"usecs"(7203))); 
     5571 
     5572            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-1999, 7, 6, 0, 1, 33), FracSec.from!"usecs"(7203))); 
     5573            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203))); 
     5574            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-1999, 7, 6, 0, 59, 33), FracSec.from!"usecs"(7203))); 
     5575 
     5576            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-1999, 7, 5, 23, 0, 33), FracSec.from!"usecs"(7203))); 
     5577            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203))); 
     5578            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-1999, 7, 5, 23, 58, 33), FracSec.from!"usecs"(7203))); 
     5579 
     5580            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), 1, SysTime(DateTime(-2000, 12, 31, 23, 0, 33), FracSec.from!"usecs"(7203))); 
     5581            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), 0, SysTime(DateTime(-2000, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203))); 
     5582            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 33), FracSec.from!"usecs"(7203)), -1, SysTime(DateTime(-2000, 12, 31, 23, 58, 33), FracSec.from!"usecs"(7203))); 
     5583 
     5584            //Test Both 
     5585            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), -1, SysTime(DateTime(1, 1, 1, 0, 59, 0))); 
     5586            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 0)), 1, SysTime(DateTime(0, 12, 31, 23, 0, 0))); 
     5587 
     5588            TestST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), -1, SysTime(DateTime(0, 1, 1, 0, 59, 0))); 
     5589            TestST(SysTime(DateTime(-1, 12, 31, 23, 59, 0)), 1, SysTime(DateTime(-1, 12, 31, 23, 0, 0))); 
     5590 
     5591            TestST(SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"usecs"(7203)), 1_052_760, SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"usecs"(7203))); 
     5592            TestST(SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"usecs"(7203)), -1_052_760, SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"usecs"(7203))); 
     5593 
     5594            TestST(SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"usecs"(7203)), 1_052_782, SysTime(DateTime(-1, 1, 1, 11, 52, 33), FracSec.from!"usecs"(7203))); 
     5595            TestST(SysTime(DateTime(1, 1, 1, 13, 52, 33), FracSec.from!"usecs"(7203)), -1_052_782, SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"usecs"(7203))); 
     5596 
     5597            { 
     5598                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     5599                sysTime.roll!"minutes"(-1); 
     5600                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 59, 0), FracSec.from!"hnsecs"(0))); 
     5601                sysTime.roll!"minutes"(1); 
     5602                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5603            } 
     5604 
     5605            { 
     5606                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5607                sysTime.roll!"minutes"(-1); 
     5608                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5609                sysTime.roll!"minutes"(1); 
     5610                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5611            } 
     5612 
     5613            { 
     5614                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 0), FracSec.from!"hnsecs"(0)); 
     5615                sysTime.roll!"minutes"(1); 
     5616                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 0, 0), FracSec.from!"hnsecs"(0))); 
     5617                sysTime.roll!"minutes"(-1); 
     5618                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 0), FracSec.from!"hnsecs"(0))); 
     5619            } 
     5620 
     5621            { 
     5622                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5623                sysTime.roll!"minutes"(1); 
     5624                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 0, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5625                sysTime.roll!"minutes"(-1); 
     5626                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5627            } 
     5628 
     5629            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5630            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5631            static assert(!__traits(compiles, cst.roll!"minutes"(4))); 
     5632            //static assert(!__traits(compiles, ist.roll!"minutes"(4))); 
     5633        } 
     5634    } 
     5635 
     5636    //Test roll!"seconds"(). 
     5637    unittest 
     5638    { 
     5639        version(testStdDateTime) 
     5640        { 
     5641            static void TestST(SysTime orig, int seconds, in SysTime expected, size_t line = __LINE__) 
     5642            { 
     5643                orig.roll!"seconds"(seconds); 
     5644                assertPred!"=="(orig, expected, "", __FILE__, line); 
     5645            } 
     5646 
     5647            //Test A.D. 
     5648            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5649            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5650            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 35), FracSec.from!"msecs"(274))); 
     5651            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3, SysTime(DateTime(1999, 7, 6, 12, 30, 36), FracSec.from!"msecs"(274))); 
     5652            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 4, SysTime(DateTime(1999, 7, 6, 12, 30, 37), FracSec.from!"msecs"(274))); 
     5653            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 5, SysTime(DateTime(1999, 7, 6, 12, 30, 38), FracSec.from!"msecs"(274))); 
     5654            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 43), FracSec.from!"msecs"(274))); 
     5655            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 15, SysTime(DateTime(1999, 7, 6, 12, 30, 48), FracSec.from!"msecs"(274))); 
     5656            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26, SysTime(DateTime(1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5657            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 27, SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5658            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 30, SysTime(DateTime(1999, 7, 6, 12, 30, 3), FracSec.from!"msecs"(274))); 
     5659            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 59, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5660            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 60, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5661            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 61, SysTime(DateTime(1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5662 
     5663            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1766, SysTime(DateTime(1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5664            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1767, SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5665            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1768, SysTime(DateTime(1999, 7, 6, 12, 30, 1), FracSec.from!"msecs"(274))); 
     5666            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2007, SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5667            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3599, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5668            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3600, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5669            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3601, SysTime(DateTime(1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5670            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 7200, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5671 
     5672            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5673            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 31), FracSec.from!"msecs"(274))); 
     5674            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -3, SysTime(DateTime(1999, 7, 6, 12, 30, 30), FracSec.from!"msecs"(274))); 
     5675            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -4, SysTime(DateTime(1999, 7, 6, 12, 30, 29), FracSec.from!"msecs"(274))); 
     5676            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -5, SysTime(DateTime(1999, 7, 6, 12, 30, 28), FracSec.from!"msecs"(274))); 
     5677            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 23), FracSec.from!"msecs"(274))); 
     5678            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -15, SysTime(DateTime(1999, 7, 6, 12, 30, 18), FracSec.from!"msecs"(274))); 
     5679            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33, SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5680            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -34, SysTime(DateTime(1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5681            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -35, SysTime(DateTime(1999, 7, 6, 12, 30, 58), FracSec.from!"msecs"(274))); 
     5682            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -59, SysTime(DateTime(1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5683            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -60, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5684            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -61, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5685 
     5686            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 1), FracSec.from!"msecs"(274))); 
     5687            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5688            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5689 
     5690            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 0, 1), FracSec.from!"msecs"(274))); 
     5691            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274))); 
     5692            TestST(SysTime(DateTime(1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 0, 59), FracSec.from!"msecs"(274))); 
     5693 
     5694            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 0, 0, 1), FracSec.from!"msecs"(274))); 
     5695            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274))); 
     5696            TestST(SysTime(DateTime(1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 0, 0, 59), FracSec.from!"msecs"(274))); 
     5697 
     5698            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 5, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5699            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274))); 
     5700            TestST(SysTime(DateTime(1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 5, 23, 59, 58), FracSec.from!"msecs"(274))); 
     5701 
     5702            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1998, 12, 31, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5703            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1998, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274))); 
     5704            TestST(SysTime(DateTime(1998, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1998, 12, 31, 23, 59, 58), FracSec.from!"msecs"(274))); 
     5705 
     5706            //Test B.C. 
     5707            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5708            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5709            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 35), FracSec.from!"msecs"(274))); 
     5710            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3, SysTime(DateTime(-1999, 7, 6, 12, 30, 36), FracSec.from!"msecs"(274))); 
     5711            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 4, SysTime(DateTime(-1999, 7, 6, 12, 30, 37), FracSec.from!"msecs"(274))); 
     5712            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 5, SysTime(DateTime(-1999, 7, 6, 12, 30, 38), FracSec.from!"msecs"(274))); 
     5713            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 43), FracSec.from!"msecs"(274))); 
     5714            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 15, SysTime(DateTime(-1999, 7, 6, 12, 30, 48), FracSec.from!"msecs"(274))); 
     5715            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26, SysTime(DateTime(-1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5716            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 27, SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5717            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 30, SysTime(DateTime(-1999, 7, 6, 12, 30, 3), FracSec.from!"msecs"(274))); 
     5718            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 59, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5719            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 60, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5720            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 61, SysTime(DateTime(-1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5721 
     5722            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1766, SysTime(DateTime(-1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5723            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1767, SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5724            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1768, SysTime(DateTime(-1999, 7, 6, 12, 30, 1), FracSec.from!"msecs"(274))); 
     5725            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2007, SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5726            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3599, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5727            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3600, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5728            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 3601, SysTime(DateTime(-1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5729            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 7200, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5730 
     5731            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5732            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 31), FracSec.from!"msecs"(274))); 
     5733            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -3, SysTime(DateTime(-1999, 7, 6, 12, 30, 30), FracSec.from!"msecs"(274))); 
     5734            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -4, SysTime(DateTime(-1999, 7, 6, 12, 30, 29), FracSec.from!"msecs"(274))); 
     5735            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -5, SysTime(DateTime(-1999, 7, 6, 12, 30, 28), FracSec.from!"msecs"(274))); 
     5736            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 23), FracSec.from!"msecs"(274))); 
     5737            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -15, SysTime(DateTime(-1999, 7, 6, 12, 30, 18), FracSec.from!"msecs"(274))); 
     5738            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33, SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5739            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -34, SysTime(DateTime(-1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5740            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -35, SysTime(DateTime(-1999, 7, 6, 12, 30, 58), FracSec.from!"msecs"(274))); 
     5741            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -59, SysTime(DateTime(-1999, 7, 6, 12, 30, 34), FracSec.from!"msecs"(274))); 
     5742            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -60, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5743            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -61, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(274))); 
     5744 
     5745            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 1), FracSec.from!"msecs"(274))); 
     5746            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274))); 
     5747            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 59), FracSec.from!"msecs"(274))); 
     5748 
     5749            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 0, 1), FracSec.from!"msecs"(274))); 
     5750            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274))); 
     5751            TestST(SysTime(DateTime(-1999, 7, 6, 12, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 0, 59), FracSec.from!"msecs"(274))); 
     5752 
     5753            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 0, 0, 1), FracSec.from!"msecs"(274))); 
     5754            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274))); 
     5755            TestST(SysTime(DateTime(-1999, 7, 6, 0, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 0, 0, 59), FracSec.from!"msecs"(274))); 
     5756 
     5757            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 5, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5758            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274))); 
     5759            TestST(SysTime(DateTime(-1999, 7, 5, 23, 59, 59), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 5, 23, 59, 58), FracSec.from!"msecs"(274))); 
     5760 
     5761            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-2000, 12, 31, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5762            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-2000, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274))); 
     5763            TestST(SysTime(DateTime(-2000, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-2000, 12, 31, 23, 59, 58), FracSec.from!"msecs"(274))); 
     5764 
     5765            //Test Both 
     5766            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1, 1, 1, 0, 0, 59), FracSec.from!"msecs"(274))); 
     5767            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5768 
     5769            TestST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(0, 1, 1, 0, 0, 59), FracSec.from!"msecs"(274))); 
     5770            TestST(SysTime(DateTime(-1, 12, 31, 23, 59, 59), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1, 12, 31, 23, 59, 0), FracSec.from!"msecs"(274))); 
     5771 
     5772            TestST(SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"msecs"(274)), 63_165_600L, SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"msecs"(274))); 
     5773            TestST(SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"msecs"(274)), -63_165_600L, SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"msecs"(274))); 
     5774 
     5775            TestST(SysTime(DateTime(-1, 1, 1, 11, 30, 33), FracSec.from!"msecs"(274)), 63_165_617L, SysTime(DateTime(-1, 1, 1, 11, 30, 50), FracSec.from!"msecs"(274))); 
     5776            TestST(SysTime(DateTime(1, 1, 1, 13, 30, 50), FracSec.from!"msecs"(274)), -63_165_617L, SysTime(DateTime(1, 1, 1, 13, 30, 33), FracSec.from!"msecs"(274))); 
     5777 
     5778            { 
     5779                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
     5780                sysTime.roll!"seconds"(-1); 
     5781                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 59), FracSec.from!"hnsecs"(0))); 
     5782                sysTime.roll!"seconds"(1); 
     5783                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     5784            } 
     5785 
     5786            { 
     5787                auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)); 
     5788                sysTime.roll!"seconds"(-1); 
     5789                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5790                sysTime.roll!"seconds"(1); 
     5791                assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999))); 
     5792            } 
     5793 
     5794            { 
     5795                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)); 
     5796                sysTime.roll!"seconds"(1); 
     5797                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 0), FracSec.from!"hnsecs"(0))); 
     5798                sysTime.roll!"seconds"(-1); 
     5799                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     5800            } 
     5801 
     5802            { 
     5803                auto sysTime = SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     5804                sysTime.roll!"seconds"(1); 
     5805                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 0), FracSec.from!"hnsecs"(9_999_999))); 
     5806                sysTime.roll!"seconds"(-1); 
     5807                assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5808            } 
     5809 
     5810            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5811            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5812            static assert(!__traits(compiles, cst.roll!"seconds"(4))); 
     5813            //static assert(!__traits(compiles, ist.roll!"seconds"(4))); 
     5814        } 
     5815    } 
     5816 
     5817 
     5818    /++ 
     5819        Add to the fractional seconds of the time of day. Negative values will 
     5820        subtract. 
     5821 
     5822        The difference between rolling and adding is that rolling does not affect 
     5823        larger units. So, if you roll the SysTime 1 second, you get the exact same 
     5824        SysTime. 
     5825 
     5826        Note that SysTime has no $(D add!"msecs"()), $(D add!"usecs"()), or 
     5827        $(D add!"hnsecs"()) function because you can add those units to 
     5828        a SysTime by adding a duration to it. 
     5829 
     5830        Params: 
     5831            units = The units to add to this SysTime. 
     5832            value = The number of units to add to this SysTime. 
     5833      +/ 
     5834    /+ref SysTime+/ void roll(string units)(long value) nothrow 
     5835        if(units == "msecs" || 
     5836           units == "usecs" || 
     5837           units == "hnsecs") 
     5838    { 
     5839        auto hnsecs = adjTime; 
     5840        immutable days = splitUnitsFromHNSecs!"days"(hnsecs); 
     5841        immutable negative = hnsecs < 0; 
     5842 
     5843        if(negative) 
     5844            hnsecs += convert!("hours", "hnsecs")(24); 
     5845 
     5846        immutable seconds = splitUnitsFromHNSecs!"seconds"(hnsecs); 
     5847 
     5848        hnsecs += convert!(units, "hnsecs")(value); 
     5849        hnsecs %= convert!("seconds", "hnsecs")(1); 
     5850 
     5851        if(hnsecs < 0) 
     5852            hnsecs += convert!("seconds", "hnsecs")(1); 
     5853 
     5854        hnsecs += convert!("seconds", "hnsecs")(seconds); 
     5855 
     5856        if(negative) 
     5857            hnsecs -= convert!("hours", "hnsecs")(24); 
     5858 
     5859        immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
     5860 
     5861        adjTime = newDaysHNSecs + hnsecs; 
     5862    } 
     5863 
     5864 
     5865    //Test roll!"msecs"(). 
     5866    unittest 
     5867    { 
     5868        version(testStdDateTime) 
     5869        { 
     5870            static void TestST(SysTime orig, int milliseconds, in SysTime expected, size_t line = __LINE__) 
     5871            { 
     5872                orig.roll!"msecs"(milliseconds); 
     5873                assertPred!"=="(orig, expected, "", __FILE__, line); 
     5874            } 
     5875 
     5876            //Test A.D. 
     5877            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5878            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(275))); 
     5879            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(276))); 
     5880            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(284))); 
     5881            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(374))); 
     5882            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5883            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5884            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5885            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(275))); 
     5886            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5887            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5888            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5889            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_727, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(1))); 
     5890            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1_766_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5891            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1_766_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5892 
     5893            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(273))); 
     5894            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(272))); 
     5895            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(264))); 
     5896            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(174))); 
     5897            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5898            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5899            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5900            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(273))); 
     5901            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5902            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5903            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5904            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1_833_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5905            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1_833_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5906 
     5907            //Test B.C. 
     5908            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5909            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(275))); 
     5910            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(276))); 
     5911            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(284))); 
     5912            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(374))); 
     5913            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5914            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5915            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5916            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(275))); 
     5917            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5918            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5919            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5920            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 26_727, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(1))); 
     5921            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1_766_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5922            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), 1_766_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5923 
     5924            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(273))); 
     5925            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(272))); 
     5926            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(264))); 
     5927            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(174))); 
     5928            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5929            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5930            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5931            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(273))); 
     5932            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274))); 
     5933            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5934            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -33_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5935            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1_833_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(0))); 
     5936            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(274)), -1_833_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(999))); 
     5937 
     5938            //Test Both 
     5939            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(1))); 
     5940            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0))); 
     5941            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), -1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(999))); 
     5942            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), -2, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(998))); 
     5943            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), -1000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0))); 
     5944            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), -2000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0))); 
     5945            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(0)), -2555, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(445))); 
     5946 
     5947            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_989_999))); 
     5948            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5949            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9999))); 
     5950            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(19_999))); 
     5951            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5952            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     5953            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2555, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(5_549_999))); 
     5954 
     5955            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5956            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     5957            static assert(!__traits(compiles, cst.addMSecs(4))); 
     5958            //static assert(!__traits(compiles, ist.addMSecs(4))); 
     5959        } 
     5960    } 
     5961 
     5962    //Test roll!"usecs"(). 
     5963    unittest 
     5964    { 
     5965        version(testStdDateTime) 
     5966        { 
     5967            static void TestST(SysTime orig, long microseconds, in SysTime expected, size_t line = __LINE__) 
     5968            { 
     5969                orig.roll!"usecs"(microseconds); 
     5970                assertPred!"=="(orig, expected, "", __FILE__, line); 
     5971            } 
     5972 
     5973            //Test A.D. 
     5974            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     5975            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(275))); 
     5976            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(276))); 
     5977            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(284))); 
     5978            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(374))); 
     5979            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999))); 
     5980            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1000))); 
     5981            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1274))); 
     5982            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1275))); 
     5983            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(2274))); 
     5984            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(26_999))); 
     5985            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(27_000))); 
     5986            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_727, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(27_001))); 
     5987            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_766_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(766_999))); 
     5988            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_766_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(767_000))); 
     5989            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     5990            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     5991            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     5992 
     5993            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(273))); 
     5994            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(272))); 
     5995            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(264))); 
     5996            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(174))); 
     5997            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(0))); 
     5998            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_999))); 
     5999            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_274))); 
     6000            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_273))); 
     6001            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(998_274))); 
     6002            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -33_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(967_000))); 
     6003            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -33_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(966_999))); 
     6004            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_833_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(167_000))); 
     6005            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_833_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(166_999))); 
     6006            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6007            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6008            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6009 
     6010            //Test B.C. 
     6011            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6012            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(275))); 
     6013            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(276))); 
     6014            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(284))); 
     6015            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(374))); 
     6016            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999))); 
     6017            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1000))); 
     6018            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1274))); 
     6019            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(1275))); 
     6020            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(2274))); 
     6021            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(26_999))); 
     6022            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(27_000))); 
     6023            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 26_727, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(27_001))); 
     6024            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_766_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(766_999))); 
     6025            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_766_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(767_000))); 
     6026            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6027            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6028            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), 3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6029 
     6030            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(273))); 
     6031            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(272))); 
     6032            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(264))); 
     6033            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(174))); 
     6034            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(0))); 
     6035            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_999))); 
     6036            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_274))); 
     6037            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(999_273))); 
     6038            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(998_274))); 
     6039            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -33_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(967_000))); 
     6040            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -33_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(966_999))); 
     6041            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_833_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(167_000))); 
     6042            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_833_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(166_999))); 
     6043            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6044            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6045            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274)), -3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(274))); 
     6046 
     6047            //Test Both 
     6048            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(1))); 
     6049            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0))); 
     6050            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(999_999))); 
     6051            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -2, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(999_998))); 
     6052            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -1000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(999_000))); 
     6053            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -2000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(998_000))); 
     6054            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -2555, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(997_445))); 
     6055            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -1_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0))); 
     6056            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -2_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0))); 
     6057            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(0)), -2_333_333, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"usecs"(666_667))); 
     6058 
     6059            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_989))); 
     6060            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6061            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9))); 
     6062            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(19))); 
     6063            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9999))); 
     6064            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(19_999))); 
     6065            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2555, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(25_549))); 
     6066            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6067            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6068            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_333_333, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(3_333_329))); 
     6069 
     6070            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6071            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6072            static assert(!__traits(compiles, cst.roll!"usecs"(4))); 
     6073            //static assert(!__traits(compiles, ist.roll!"usecs"(4))); 
     6074        } 
     6075    } 
     6076 
     6077    //Test roll!"hnsecs"(). 
     6078    unittest 
     6079    { 
     6080        version(testStdDateTime) 
     6081        { 
     6082            static void TestST(SysTime orig, long hnsecs, in SysTime expected, size_t line = __LINE__) 
     6083            { 
     6084                orig.roll!"hnsecs"(hnsecs); 
     6085                assertPred!"=="(orig, expected, "", __FILE__, line); 
     6086            } 
     6087 
     6088            //Test A.D. 
     6089            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6090            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6091            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6092            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6093            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6094            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6095            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6096            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6097            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6098            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6099            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6100            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6101            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6102            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6103            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6104            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6105            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6106            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6107            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6108            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6109 
     6110            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6111            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6112            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6113            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6114            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6115            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_999))); 
     6116            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_274))); 
     6117            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_273))); 
     6118            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_998_274))); 
     6119            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_967_000))); 
     6120            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_966_999))); 
     6121            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(8_167_000))); 
     6122            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(8_166_999))); 
     6123            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_000_274))); 
     6124            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6125            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6126            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6127            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6128 
     6129            //Test B.C. 
     6130            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6131            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6132            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6133            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6134            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6135            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6136            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6137            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6138            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6139            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6140            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6141            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6142            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6143            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6144            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6145            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6146            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6147            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6148            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6149            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6150 
     6151            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6152            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6153            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6154            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6155            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6156            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_999))); 
     6157            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_274))); 
     6158            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_999_273))); 
     6159            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_998_274))); 
     6160            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_967_000))); 
     6161            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_966_999))); 
     6162            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(8_167_000))); 
     6163            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(8_166_999))); 
     6164            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(9_000_274))); 
     6165            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6166            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6167            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6168            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6169 
     6170            //Test Both 
     6171            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     6172            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6173            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999))); 
     6174            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_998))); 
     6175            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_000))); 
     6176            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_998_000))); 
     6177            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2555, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_997_445))); 
     6178            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_000_000))); 
     6179            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(8_000_000))); 
     6180            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_333_333, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7_666_667))); 
     6181            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -10_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6182            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6183            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_888_888, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_111_112))); 
     6184 
     6185            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998))); 
     6186            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6187            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     6188            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     6189            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(999))); 
     6190            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1999))); 
     6191            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2555, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(2554))); 
     6192            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(999_999))); 
     6193            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1_999_999))); 
     6194            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_333_333, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(2_333_332))); 
     6195            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 10_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6196            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6197            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_888_888, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(888_887))); 
     6198 
     6199            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6200            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6201            static assert(!__traits(compiles, cst.roll!"hnsecs"(4))); 
     6202            //static assert(!__traits(compiles, ist.roll!"hnsecs"(4))); 
     6203 
     6204            //Verify Examples. 
     6205            auto st1 = SysTime(DateTime(2010, 7, 4, 7, 32, 12)); 
     6206            st1.roll!"hnsecs"(1); 
     6207            assert(st1 == SysTime(DateTime(2010, 7, 4, 7, 32, 12), FracSec.from!"hnsecs"(1))); 
     6208 
     6209            auto st2 = SysTime(DateTime(2010, 7, 4, 7, 32, 12)); 
     6210            st2.roll!"hnsecs"(-1); 
     6211            assert(st2 == SysTime(DateTime(2010, 7, 4, 7, 32, 12), FracSec.from!"hnsecs"(9_999_999))); 
     6212 
     6213            auto st3 = SysTime(DateTime(2009, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     6214            st3.roll!"hnsecs"(1); 
     6215            assert(st3 == SysTime(DateTime(2009, 12, 31, 23, 59, 59))); 
     6216 
     6217            auto st4 = SysTime(DateTime(2010, 1, 1, 0, 0, 0)); 
     6218            st4.roll!"hnsecs"(-1); 
     6219            assert(st4 == SysTime(DateTime(2010, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999))); 
     6220 
     6221            auto st5 = SysTime(DateTime(2009, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
     6222            st5.roll!"hnsecs"(1); 
     6223            assert(st5 == SysTime(DateTime(2009, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     6224        } 
     6225    } 
     6226 
     6227 
     6228    /++ 
     6229        Gives the result of adding or subtracting a duration from this SysTime. 
     6230 
     6231        The legal types of arithmetic for SysTime using this operator are 
     6232 
     6233        $(TABLE 
     6234        $(TR $(TD SysTime) $(TD +) $(TD duration) $(TD -->) $(TD SysTime)) 
     6235        $(TR $(TD SysTime) $(TD -) $(TD duration) $(TD -->) $(TD SysTime)) 
     6236        ) 
     6237 
     6238        Params: 
     6239            duration = The duration to add to or subtract from this SysTime. 
     6240      +/ 
     6241    SysTime opBinary(string op, D)(in D duration) const pure nothrow 
     6242        if((op == "+" || op == "-") && 
     6243           (is(Unqual!D == Duration) || 
     6244            is(Unqual!D == TickDuration))) 
     6245    { 
     6246        SysTime retval = SysTime(this._stdTime, this._timezone.get); 
     6247 
     6248        static if(is(Unqual!D == Duration)) 
     6249            immutable hnsecs = duration.total!"hnsecs"; 
     6250        else static if(is(Unqual!D == TickDuration)) 
     6251            immutable hnsecs = duration.hnsecs; 
     6252 
     6253        //Ideally, this would just be 
     6254        //retval._stdTime += unaryFun!(op ~ "a")(hnsecs); 
     6255        //But there isn't currently a pure version of unaryFun!(). 
     6256 
     6257        static if(op == "+") 
     6258            immutable signedHNSecs = hnsecs; 
     6259        else static if(op == "-") 
     6260            immutable signedHNSecs = -hnsecs; 
     6261        else 
     6262            static assert(0); 
     6263 
     6264        retval._stdTime += signedHNSecs; 
     6265 
     6266        return retval; 
     6267    } 
     6268 
     6269    unittest 
     6270    { 
     6271        version(testStdDateTime) 
     6272        { 
     6273            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678)); 
     6274 
     6275            assertPred!"=="(st + dur!"weeks"(7), SysTime(DateTime(1999, 8, 24, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6276            assertPred!"=="(st + dur!"weeks"(-7), SysTime(DateTime(1999, 5, 18, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6277            assertPred!"=="(st + dur!"days"(7), SysTime(DateTime(1999, 7, 13, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6278            assertPred!"=="(st + dur!"days"(-7), SysTime(DateTime(1999, 6, 29, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6279            assertPred!"=="(st + dur!"hours"(7), SysTime(DateTime(1999, 7, 6, 19, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6280            assertPred!"=="(st + dur!"hours"(-7), SysTime(DateTime(1999, 7, 6, 5, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6281            assertPred!"=="(st + dur!"minutes"(7), SysTime(DateTime(1999, 7, 6, 12, 37, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6282            assertPred!"=="(st + dur!"minutes"(-7), SysTime(DateTime(1999, 7, 6, 12, 23, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6283            assertPred!"=="(st + dur!"seconds"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 40), FracSec.from!"hnsecs"(2_345_678))); 
     6284            assertPred!"=="(st + dur!"seconds"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 26), FracSec.from!"hnsecs"(2_345_678))); 
     6285            assertPred!"=="(st + dur!"msecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_415_678))); 
     6286            assertPred!"=="(st + dur!"msecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_275_678))); 
     6287            assertPred!"=="(st + dur!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_748))); 
     6288            assertPred!"=="(st + dur!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_608))); 
     6289            assertPred!"=="(st + dur!"hnsecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_685))); 
     6290            assertPred!"=="(st + dur!"hnsecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_671))); 
     6291 
     6292            //This probably only runs in cases where gettimeofday() is used, but it's 
     6293            //hard to do this test correctly with variable ticksPerSec. 
     6294            if(TickDuration.ticksPerSec == 1_000_000) 
     6295            { 
     6296                assertPred!"=="(st + TickDuration.from!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_748))); 
     6297                assertPred!"=="(st + TickDuration.from!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_608))); 
     6298            } 
     6299 
     6300            assertPred!"=="(st - dur!"weeks"(-7), SysTime(DateTime(1999, 8, 24, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6301            assertPred!"=="(st - dur!"weeks"(7), SysTime(DateTime(1999, 5, 18, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6302            assertPred!"=="(st - dur!"days"(-7), SysTime(DateTime(1999, 7, 13, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6303            assertPred!"=="(st - dur!"days"(7), SysTime(DateTime(1999, 6, 29, 12, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6304            assertPred!"=="(st - dur!"hours"(-7), SysTime(DateTime(1999, 7, 6, 19, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6305            assertPred!"=="(st - dur!"hours"(7), SysTime(DateTime(1999, 7, 6, 5, 30, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6306            assertPred!"=="(st - dur!"minutes"(-7), SysTime(DateTime(1999, 7, 6, 12, 37, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6307            assertPred!"=="(st - dur!"minutes"(7), SysTime(DateTime(1999, 7, 6, 12, 23, 33), FracSec.from!"hnsecs"(2_345_678))); 
     6308            assertPred!"=="(st - dur!"seconds"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 40), FracSec.from!"hnsecs"(2_345_678))); 
     6309            assertPred!"=="(st - dur!"seconds"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 26), FracSec.from!"hnsecs"(2_345_678))); 
     6310            assertPred!"=="(st - dur!"msecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_415_678))); 
     6311            assertPred!"=="(st - dur!"msecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_275_678))); 
     6312            assertPred!"=="(st - dur!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_748))); 
     6313            assertPred!"=="(st - dur!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_608))); 
     6314            assertPred!"=="(st - dur!"hnsecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_685))); 
     6315            assertPred!"=="(st - dur!"hnsecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_671))); 
     6316 
     6317            //This probably only runs in cases where gettimeofday() is used, but it's 
     6318            //hard to do this test correctly with variable ticksPerSec. 
     6319            if(TickDuration.ticksPerSec == 1_000_000) 
     6320            { 
     6321                assertPred!"=="(st - TickDuration.from!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_748))); 
     6322                assertPred!"=="(st - TickDuration.from!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2_345_608))); 
     6323            } 
     6324 
     6325            static void TestST(in SysTime orig, long hnsecs, in SysTime expected, size_t line = __LINE__) 
     6326            { 
     6327                assertPred!"=="(orig + dur!"hnsecs"(hnsecs), expected, "", __FILE__, line); 
     6328            } 
     6329 
     6330            //Test A.D. 
     6331            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6332            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6333            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6334            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6335            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6336            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6337            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6338            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6339            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6340            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6341            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6342            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6343            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6344            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6345            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6346            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6347            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 39), FracSec.from!"hnsecs"(274))); 
     6348            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 36, 33), FracSec.from!"hnsecs"(274))); 
     6349            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 31, 33), FracSec.from!"hnsecs"(274))); 
     6350            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(1999, 7, 6, 13, 30, 33), FracSec.from!"hnsecs"(274))); 
     6351 
     6352            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6353            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6354            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6355            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6356            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6357            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_999))); 
     6358            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_274))); 
     6359            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_273))); 
     6360            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_998_274))); 
     6361            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_967_000))); 
     6362            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_966_999))); 
     6363            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_167_000))); 
     6364            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_166_999))); 
     6365            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_000_274))); 
     6366            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 27), FracSec.from!"hnsecs"(274))); 
     6367            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 24, 33), FracSec.from!"hnsecs"(274))); 
     6368            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 29, 33), FracSec.from!"hnsecs"(274))); 
     6369            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(1999, 7, 6, 11, 30, 33), FracSec.from!"hnsecs"(274))); 
     6370 
     6371            //Test B.C. 
     6372            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6373            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6374            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6375            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6376            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6377            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6378            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6379            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6380            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6381            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6382            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6383            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6384            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6385            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6386            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6387            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6388            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 39), FracSec.from!"hnsecs"(274))); 
     6389            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 36, 33), FracSec.from!"hnsecs"(274))); 
     6390            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 31, 33), FracSec.from!"hnsecs"(274))); 
     6391            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 13, 30, 33), FracSec.from!"hnsecs"(274))); 
     6392 
     6393            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6394            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6395            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6396            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6397            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6398            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_999))); 
     6399            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_274))); 
     6400            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_273))); 
     6401            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_998_274))); 
     6402            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_967_000))); 
     6403            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_966_999))); 
     6404            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_167_000))); 
     6405            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_166_999))); 
     6406            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_000_274))); 
     6407            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 27), FracSec.from!"hnsecs"(274))); 
     6408            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 24, 33), FracSec.from!"hnsecs"(274))); 
     6409            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 29, 33), FracSec.from!"hnsecs"(274))); 
     6410            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 11, 30, 33), FracSec.from!"hnsecs"(274))); 
     6411 
     6412            //Test Both 
     6413            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     6414            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6415            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6416            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998))); 
     6417            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_000))); 
     6418            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_998_000))); 
     6419            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2555, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_997_445))); 
     6420            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_000_000))); 
     6421            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(8_000_000))); 
     6422            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_333_333, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7_666_667))); 
     6423            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -10_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     6424            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 58), FracSec.from!"hnsecs"(0))); 
     6425            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_888_888, SysTime(DateTime(0, 12, 31, 23, 59, 57), FracSec.from!"hnsecs"(9_111_112))); 
     6426 
     6427            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998))); 
     6428            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6429            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6430            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     6431            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(999))); 
     6432            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1999))); 
     6433            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2555, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(2554))); 
     6434            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(999_999))); 
     6435            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1_999_999))); 
     6436            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_333_333, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(2_333_332))); 
     6437            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 10_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999))); 
     6438            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(9_999_999))); 
     6439            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_888_888, SysTime(DateTime(1, 1, 1, 0, 0, 2), FracSec.from!"hnsecs"(888_887))); 
     6440 
     6441            auto duration = dur!"seconds"(12); 
     6442            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6443            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6444            static assert(__traits(compiles, cst + duration)); 
     6445            //static assert(__traits(compiles, ist + duration)); 
     6446            static assert(__traits(compiles, cst - duration)); 
     6447            //static assert(__traits(compiles, ist - duration)); 
     6448        } 
     6449    } 
     6450 
     6451 
     6452    /++ 
     6453        Gives the result of adding or subtracting a duration from this SysTime, 
     6454        as well as assigning the result to this SysTime. 
     6455 
     6456        The legal types of arithmetic for SysTime using this operator are 
     6457 
     6458        $(TABLE 
     6459        $(TR $(TD SysTime) $(TD +) $(TD duration) $(TD -->) $(TD SysTime)) 
     6460        $(TR $(TD SysTime) $(TD -) $(TD duration) $(TD -->) $(TD SysTime)) 
     6461        ) 
     6462 
     6463        Params: 
     6464            duration = The duration to add to or subtract from this SysTime. 
     6465      +/ 
     6466    /+ref+/ SysTime opOpAssign(string op, D)(in D duration) pure nothrow 
     6467        if((op == "+" || op == "-") && 
     6468           (is(Unqual!D == Duration) || 
     6469            is(Unqual!D == TickDuration))) 
     6470    { 
     6471        static if(is(Unqual!D == Duration)) 
     6472            auto hnsecs = duration.total!"hnsecs"; 
     6473        else static if(is(Unqual!D == TickDuration)) 
     6474            auto hnsecs = duration.hnsecs; 
     6475 
     6476        //Ideally, this would just be 
     6477        //_stdTime += unaryFun!(op ~ "a")(hnsecs); 
     6478        //But there isn't currently a pure version of unaryFun!(). 
     6479 
     6480        static if(op == "+") 
     6481            immutable signedHNSecs = hnsecs; 
     6482        else static if(op == "-") 
     6483            immutable signedHNSecs = -hnsecs; 
     6484        else 
     6485            static assert(0); 
     6486 
     6487        _stdTime += signedHNSecs; 
     6488 
     6489        return this; 
     6490    } 
     6491 
     6492    unittest 
     6493    { 
     6494        version(testStdDateTime) 
     6495        { 
     6496            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"weeks"(7), SysTime(DateTime(1999, 8, 24, 12, 30, 33))); 
     6497            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"weeks"(-7), SysTime(DateTime(1999, 5, 18, 12, 30, 33))); 
     6498            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"days"(7), SysTime(DateTime(1999, 7, 13, 12, 30, 33))); 
     6499            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"days"(-7), SysTime(DateTime(1999, 6, 29, 12, 30, 33))); 
     6500 
     6501            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hours"(7), SysTime(DateTime(1999, 7, 6, 19, 30, 33))); 
     6502            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hours"(-7), SysTime(DateTime(1999, 7, 6, 5, 30, 33))); 
     6503            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"minutes"(7), SysTime(DateTime(1999, 7, 6, 12, 37, 33))); 
     6504            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"minutes"(-7), SysTime(DateTime(1999, 7, 6, 12, 23, 33))); 
     6505            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"seconds"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 40))); 
     6506            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"seconds"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 26))); 
     6507            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"msecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(7))); 
     6508            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"msecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(993))); 
     6509            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7))); 
     6510            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"usecs"(999_993))); 
     6511            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hnsecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(7))); 
     6512            assertPred!"+="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hnsecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_993))); 
     6513 
     6514            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"weeks"(-7), SysTime(DateTime(1999, 8, 24, 12, 30, 33))); 
     6515            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"weeks"(7), SysTime(DateTime(1999, 5, 18, 12, 30, 33))); 
     6516            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"days"(-7), SysTime(DateTime(1999, 7, 13, 12, 30, 33))); 
     6517            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"days"(7), SysTime(DateTime(1999, 6, 29, 12, 30, 33))); 
     6518 
     6519            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hours"(-7), SysTime(DateTime(1999, 7, 6, 19, 30, 33))); 
     6520            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hours"(7), SysTime(DateTime(1999, 7, 6, 5, 30, 33))); 
     6521            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"minutes"(-7), SysTime(DateTime(1999, 7, 6, 12, 37, 33))); 
     6522            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"minutes"(7), SysTime(DateTime(1999, 7, 6, 12, 23, 33))); 
     6523            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"seconds"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 40))); 
     6524            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"seconds"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 26))); 
     6525            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"msecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(7))); 
     6526            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"msecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"msecs"(993))); 
     6527            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"usecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(7))); 
     6528            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"usecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"usecs"(999_993))); 
     6529            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hnsecs"(-7), SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(7))); 
     6530            assertPred!"-="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)), dur!"hnsecs"(7), SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_993))); 
     6531 
     6532            static void TestST(SysTime orig, long hnsecs, in SysTime expected, size_t line = __LINE__) 
     6533            { 
     6534                orig += dur!"hnsecs"(hnsecs); 
     6535                assertPred!"=="(orig, expected, "", __FILE__, line); 
     6536            } 
     6537 
     6538            //Test A.D. 
     6539            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6540            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6541            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6542            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6543            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6544            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6545            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6546            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6547            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6548            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6549            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6550            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6551            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6552            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6553            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6554            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6555            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 39), FracSec.from!"hnsecs"(274))); 
     6556            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 36, 33), FracSec.from!"hnsecs"(274))); 
     6557            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 31, 33), FracSec.from!"hnsecs"(274))); 
     6558            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(1999, 7, 6, 13, 30, 33), FracSec.from!"hnsecs"(274))); 
     6559 
     6560            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6561            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6562            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6563            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6564            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6565            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_999))); 
     6566            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_274))); 
     6567            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_273))); 
     6568            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_998_274))); 
     6569            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_967_000))); 
     6570            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_966_999))); 
     6571            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_167_000))); 
     6572            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_166_999))); 
     6573            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_000_274))); 
     6574            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(1999, 7, 6, 12, 30, 27), FracSec.from!"hnsecs"(274))); 
     6575            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 24, 33), FracSec.from!"hnsecs"(274))); 
     6576            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(1999, 7, 6, 12, 29, 33), FracSec.from!"hnsecs"(274))); 
     6577            TestST(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(1999, 7, 6, 11, 30, 33), FracSec.from!"hnsecs"(274))); 
     6578 
     6579            //Test B.C. 
     6580            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 0, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274))); 
     6581            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(275))); 
     6582            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(276))); 
     6583            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(284))); 
     6584            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(374))); 
     6585            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(999))); 
     6586            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1000))); 
     6587            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1274))); 
     6588            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1275))); 
     6589            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(2274))); 
     6590            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(26_999))); 
     6591            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_000))); 
     6592            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 26_727, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(27_001))); 
     6593            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_725, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_766_999))); 
     6594            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_766_726, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_767_000))); 
     6595            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_000_274))); 
     6596            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 39), FracSec.from!"hnsecs"(274))); 
     6597            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 36, 33), FracSec.from!"hnsecs"(274))); 
     6598            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 31, 33), FracSec.from!"hnsecs"(274))); 
     6599            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), 36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 13, 30, 33), FracSec.from!"hnsecs"(274))); 
     6600 
     6601            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(273))); 
     6602            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(272))); 
     6603            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -10, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(264))); 
     6604            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -100, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(174))); 
     6605            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -274, SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(0))); 
     6606            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_999))); 
     6607            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_274))); 
     6608            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1001, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_999_273))); 
     6609            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -2000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_998_274))); 
     6610            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_967_000))); 
     6611            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -33_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_966_999))); 
     6612            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_274, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_167_000))); 
     6613            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_833_275, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(8_166_999))); 
     6614            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -1_000_000, SysTime(DateTime(-1999, 7, 6, 12, 30, 32), FracSec.from!"hnsecs"(9_000_274))); 
     6615            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -60_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 30, 27), FracSec.from!"hnsecs"(274))); 
     6616            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -3_600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 24, 33), FracSec.from!"hnsecs"(274))); 
     6617            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -600_000_000L, SysTime(DateTime(-1999, 7, 6, 12, 29, 33), FracSec.from!"hnsecs"(274))); 
     6618            TestST(SysTime(DateTime(-1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(274)), -36_000_000_000L, SysTime(DateTime(-1999, 7, 6, 11, 30, 33), FracSec.from!"hnsecs"(274))); 
     6619 
     6620            //Test Both 
     6621            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     6622            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6623            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6624            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998))); 
     6625            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_000))); 
     6626            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_998_000))); 
     6627            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2555, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_997_445))); 
     6628            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -1_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_000_000))); 
     6629            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(8_000_000))); 
     6630            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -2_333_333, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7_666_667))); 
     6631            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -10_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     6632            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_000_000, SysTime(DateTime(0, 12, 31, 23, 59, 58), FracSec.from!"hnsecs"(0))); 
     6633            TestST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), -20_888_888, SysTime(DateTime(0, 12, 31, 23, 59, 57), FracSec.from!"hnsecs"(9_111_112))); 
     6634 
     6635            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), -1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998))); 
     6636            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     6637            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     6638            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     6639            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(999))); 
     6640            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1999))); 
     6641            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2555, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(2554))); 
     6642            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(999_999))); 
     6643            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1_999_999))); 
     6644            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 2_333_333, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(2_333_332))); 
     6645            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 10_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999))); 
     6646            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_000_000, SysTime(DateTime(1, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(9_999_999))); 
     6647            TestST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 20_888_888, SysTime(DateTime(1, 1, 1, 0, 0, 2), FracSec.from!"hnsecs"(888_887))); 
     6648 
     6649            auto duration = dur!"seconds"(12); 
     6650            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6651            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6652            static assert(!__traits(compiles, cst += duration)); 
     6653            //static assert(!__traits(compiles, ist += duration)); 
     6654            static assert(!__traits(compiles, cst -= duration)); 
     6655            //static assert(!__traits(compiles, ist -= duration)); 
     6656        } 
     6657    } 
     6658 
     6659 
     6660    /++ 
     6661        Gives the difference between two SysTimes. 
     6662 
     6663        The legal types of arithmetic for SysTime using this operator are 
     6664 
     6665        $(TABLE 
     6666        $(TR $(TD SysTime) $(TD -) $(TD SysTime) $(TD -->) $(TD duration)) 
     6667        ) 
     6668      +/ 
     6669    Duration opBinary(string op)(in SysTime rhs) const pure nothrow 
     6670        if(op == "-") 
     6671    { 
     6672        return dur!"hnsecs"(_stdTime - rhs._stdTime); 
     6673    } 
     6674 
     6675    unittest 
     6676    { 
     6677        version(testStdDateTime) 
     6678        { 
     6679            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1998, 7, 6, 12, 30, 33)), 
     6680                        dur!"seconds"(31_536_000)); 
     6681            assertPred!"=="(SysTime(DateTime(1998, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6682                        dur!"seconds"(-31_536_000)); 
     6683 
     6684            assertPred!"=="(SysTime(DateTime(1999, 8, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6685                        dur!"seconds"(26_78_400)); 
     6686            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 8, 6, 12, 30, 33)), 
     6687                        dur!"seconds"(-26_78_400)); 
     6688 
     6689            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 5, 12, 30, 33)), 
     6690                        dur!"seconds"(86_400)); 
     6691            assertPred!"=="(SysTime(DateTime(1999, 7, 5, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6692                        dur!"seconds"(-86_400)); 
     6693 
     6694            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 11, 30, 33)), 
     6695                        dur!"seconds"(3600)); 
     6696            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 11, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6697                        dur!"seconds"(-3600)); 
     6698 
     6699            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 31, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6700                        dur!"seconds"(60)); 
     6701            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 31, 33)), 
     6702                        dur!"seconds"(-60)); 
     6703 
     6704            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 34)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6705                        dur!"seconds"(1)); 
     6706            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 34)), 
     6707                        dur!"seconds"(-1)); 
     6708 
     6709            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(532)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6710                        dur!"msecs"(532)); 
     6711            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"msecs"(532)), 
     6712                        dur!"msecs"(-532)); 
     6713 
     6714            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(333_347)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6715                        dur!"usecs"(333_347)); 
     6716            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"usecs"(333_347)), 
     6717                        dur!"usecs"(-333_347)); 
     6718 
     6719            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_234_567)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33)), 
     6720                        dur!"hnsecs"(1_234_567)); 
     6721            assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)) - SysTime(DateTime(1999, 7, 6, 12, 30, 33), FracSec.from!"hnsecs"(1_234_567)), 
     6722                        dur!"hnsecs"(-1_234_567)); 
     6723 
     6724            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 30, 33)) - SysTime(DateTime(1, 1, 1, 0, 0, 0)), dur!"seconds"(45033)); 
     6725            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0)) - SysTime(DateTime(1, 1, 1, 12, 30, 33)), dur!"seconds"(-45033)); 
     6726            assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 30, 33)) - SysTime(DateTime(1, 1, 1, 0, 0, 0)), dur!"seconds"(-41367)); 
     6727            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0)) - SysTime(DateTime(0, 12, 31, 12, 30, 33)), dur!"seconds"(41367)); 
     6728 
     6729            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0)) - SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 
     6730                            dur!"hnsecs"(1)); 
     6731            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)) - SysTime(DateTime(1, 1, 1, 0, 0, 0)), 
     6732                            dur!"hnsecs"(-1)); 
     6733 
     6734            auto tz = TimeZone.getTimeZone("America/Los_Angeles"); 
     6735 
     6736            assertPred!"=="(SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), tz) - 
     6737                            SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), tz), 
     6738                            dur!"hnsecs"(0)); 
     6739 
     6740            assertPred!"=="(SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), tz) - 
     6741                            SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), UTC()), 
     6742                            dur!"hours"(8)); 
     6743 
     6744            assertPred!"=="(SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), UTC()) - 
     6745                            SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), tz), 
     6746                            dur!"hours"(-8)); 
     6747 
     6748            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6749            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6750            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6751            static assert(__traits(compiles, st - st)); 
     6752            static assert(__traits(compiles, cst - st)); 
     6753            //static assert(__traits(compiles, ist - st)); 
     6754 
     6755            static assert(__traits(compiles, st - cst)); 
     6756            static assert(__traits(compiles, cst - cst)); 
     6757            //static assert(__traits(compiles, ist - cst)); 
     6758 
     6759            //static assert(__traits(compiles, st - ist)); 
     6760            //static assert(__traits(compiles, cst - ist)); 
     6761            //static assert(__traits(compiles, ist - ist)); 
     6762        } 
     6763    } 
     6764 
     6765 
     6766    /++ 
     6767        Returns the difference between the two SysTimes in months. 
     6768 
     6769        You can get the difference in years by subtracting the year property 
     6770        of two SysTimes, and you can get the difference in days or weeks by 
     6771        subtracting the SysTimes themselves and using the Duration that results, 
     6772        but because you cannot convert between months and smaller units without 
     6773        a specific date (which the Duration from the subtraction of two SysTimes 
     6774        won't have), you cannot get the difference in months without doing some 
     6775        math using both the year and month properties, so this is a convenience 
     6776        function for getting the difference in months. 
     6777 
     6778        Note that the number of days in the months or how far into the month either 
     6779        date is is irrelevant. It is the difference in the month property combined 
     6780        with the difference in years * 12. So, for instance, December 31st and 
     6781        January 1st are one month apart just as December 1st and January 31st are 
     6782        one month apart. 
     6783 
     6784        Params: 
     6785            rhs = The SysTime to subtract from this one. 
     6786 
     6787        Examples: 
     6788-------------------- 
     6789assert(SysTime(Date(1999, 2, 1)).diffMonths(SysTime(Date(1999, 1, 31))) == 1); 
     6790assert(SysTime(Date(1999, 1, 31)).diffMonths(SysTime(Date(1999, 2, 1))) == -1); 
     6791assert(SysTime(Date(1999, 3, 1)).diffMonths(SysTime(Date(1999, 1, 1))) == 2); 
     6792assert(SysTime(Date(1999, 1, 1)).diffMonths(SysTime(Date(1999, 3, 31))) == -2); 
     6793-------------------- 
     6794      +/ 
     6795    int diffMonths(in SysTime rhs) const nothrow 
     6796    { 
     6797        return (cast(Date)this).diffMonths(cast(Date)rhs); 
     6798    } 
     6799 
     6800    unittest 
     6801    { 
     6802        version(testStdDateTime) 
     6803        { 
     6804            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6805            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6806            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6807            static assert(__traits(compiles, st.diffMonths(st))); 
     6808            static assert(__traits(compiles, cst.diffMonths(st))); 
     6809            //static assert(__traits(compiles, ist.diffMonths(st))); 
     6810 
     6811            static assert(__traits(compiles, st.diffMonths(cst))); 
     6812            static assert(__traits(compiles, cst.diffMonths(cst))); 
     6813            //static assert(__traits(compiles, ist.diffMonths(cst))); 
     6814 
     6815            //static assert(__traits(compiles, st.diffMonths(ist))); 
     6816            //static assert(__traits(compiles, cst.diffMonths(ist))); 
     6817            //static assert(__traits(compiles, ist.diffMonths(ist))); 
     6818 
     6819            //Verify Examples. 
     6820            assert(SysTime(Date(1999, 2, 1)).diffMonths(SysTime(Date(1999, 1, 31))) == 1); 
     6821            assert(SysTime(Date(1999, 1, 31)).diffMonths(SysTime(Date(1999, 2, 1))) == -1); 
     6822            assert(SysTime(Date(1999, 3, 1)).diffMonths(SysTime(Date(1999, 1, 1))) == 2); 
     6823            assert(SysTime(Date(1999, 1, 1)).diffMonths(SysTime(Date(1999, 3, 31))) == -2); 
     6824        } 
     6825    } 
     6826 
     6827 
     6828    /++ 
     6829        Whether this SysTime is in a leap year. 
     6830     +/ 
     6831    @property bool isLeapYear() const nothrow 
     6832    { 
     6833        return (cast(Date)this).isLeapYear; 
     6834    } 
     6835 
     6836    unittest 
     6837    { 
     6838        version(testStdDateTime) 
     6839        { 
     6840            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6841            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6842            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6843            static assert(__traits(compiles, st.isLeapYear)); 
     6844            static assert(__traits(compiles, cst.isLeapYear)); 
     6845            //static assert(__traits(compiles, ist.isLeapYear)); 
     6846        } 
     6847    } 
     6848 
     6849 
     6850    /++ 
     6851        Day of the week this SysTime is on. 
     6852      +/ 
     6853    @property DayOfWeek dayOfWeek() const nothrow 
     6854    { 
     6855        return getDayOfWeek(dayOfGregorianCal); 
     6856    } 
     6857 
     6858    unittest 
     6859    { 
     6860        version(testStdDateTime) 
     6861        { 
     6862            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6863            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6864            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6865            static assert(__traits(compiles, st.dayOfWeek)); 
     6866            static assert(__traits(compiles, cst.dayOfWeek)); 
     6867            //static assert(__traits(compiles, ist.dayOfWeek)); 
     6868        } 
     6869    } 
     6870 
     6871 
     6872    /++ 
     6873        Day of the year this SysTime is on. 
     6874 
     6875        Examples: 
     6876-------------------- 
     6877assert(SysTime(DateTime(1999, 1, 1, 12, 22, 7)).dayOfYear == 1); 
     6878assert(SysTime(DateTime(1999, 12, 31, 7, 2, 59)).dayOfYear == 365); 
     6879assert(SysTime(DateTime(2000, 12, 31, 21, 20, 0)).dayOfYear == 366); 
     6880-------------------- 
     6881      +/ 
     6882    @property ushort dayOfYear() const nothrow 
     6883    { 
     6884        return (cast(Date)this).dayOfYear; 
     6885    } 
     6886 
     6887    unittest 
     6888    { 
     6889        version(testStdDateTime) 
     6890        { 
     6891            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6892            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6893            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6894            static assert(__traits(compiles, st.dayOfYear)); 
     6895            static assert(__traits(compiles, cst.dayOfYear)); 
     6896            //static assert(__traits(compiles, ist.dayOfYear)); 
     6897 
     6898            //Verify Examples. 
     6899            assert(SysTime(DateTime(1999, 1, 1, 12, 22, 7)).dayOfYear == 1); 
     6900            assert(SysTime(DateTime(1999, 12, 31, 7, 2, 59)).dayOfYear == 365); 
     6901            assert(SysTime(DateTime(2000, 12, 31, 21, 20, 0)).dayOfYear == 366); 
     6902        } 
     6903    } 
     6904 
     6905 
     6906    /++ 
     6907        Day of the year. 
     6908 
     6909        Params: 
     6910            day = The day of the year to set which day of the year this SysTime is on. 
     6911      +/ 
     6912    @property void dayOfYear(int day) 
     6913    { 
     6914        immutable hnsecs = adjTime; 
     6915        immutable days = convert!("hnsecs", "days")(hnsecs); 
     6916        immutable theRest = hnsecs - convert!("days", "hnsecs")(days); 
     6917 
     6918        auto date = Date(cast(int)days); 
     6919        date.dayOfYear = day; 
     6920 
     6921        immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
     6922 
     6923        adjTime = newDaysHNSecs + theRest; 
     6924    } 
     6925 
     6926    unittest 
     6927    { 
     6928        version(testStdDateTime) 
     6929        { 
     6930            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6931            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6932            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     6933            static assert(__traits(compiles, st.dayOfYear = 12)); 
     6934            static assert(!__traits(compiles, cst.dayOfYear = 12)); 
     6935            //static assert(!__traits(compiles, ist.dayOfYear = 12)); 
     6936        } 
     6937    } 
     6938 
     6939 
     6940    /++ 
     6941        The Xth day of the Gregorian Calendar that this SysTime is on. 
     6942 
     6943        Examples: 
     6944-------------------- 
     6945assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).dayOfGregorianCal == 1); 
     6946assert(SysTime(DateTime(1, 12, 31, 23, 59, 59)).dayOfGregorianCal == 365); 
     6947assert(SysTime(DateTime(2, 1, 1, 2, 2, 2)).dayOfGregorianCal == 366); 
     6948 
     6949assert(SysTime(DateTime(0, 12, 31, 7, 7, 7)).dayOfGregorianCal == 0); 
     6950assert(SysTime(DateTime(0, 1, 1, 19, 30, 0)).dayOfGregorianCal == -365); 
     6951assert(SysTime(DateTime(-1, 12, 31, 4, 7, 0)).dayOfGregorianCal == -366); 
     6952 
     6953assert(SysTime(DateTime(2000, 1, 1, 9, 30, 20)).dayOfGregorianCal == 730_120); 
     6954assert(SysTime(DateTime(2010, 12, 31, 15, 45, 50)).dayOfGregorianCal == 734_137); 
     6955-------------------- 
     6956     +/ 
     6957    @property int dayOfGregorianCal() const nothrow 
     6958    { 
     6959        immutable adjustedTime = adjTime; 
     6960 
     6961        //We have to add one because 0 would be midnight, January 1st, 1 A.D., which would be 
     6962        //the 1st day of the Gregorian Calendar, not the 0th. So, simply casting to days 
     6963        //is one day off. 
     6964        if(adjustedTime > 0) 
     6965            return cast(int)getUnitsFromHNSecs!"days"(adjustedTime) + 1; 
     6966 
     6967        auto hnsecs = adjustedTime; 
     6968        immutable days = cast(int)splitUnitsFromHNSecs!"days"(hnsecs); 
     6969 
     6970        return hnsecs == 0 ? days + 1 : days; 
     6971    } 
     6972 
     6973    unittest 
     6974    { 
     6975        version(testStdDateTime) 
     6976        { 
     6977            //Test A.D. 
     6978            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal, 1); 
     6979            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)).dayOfGregorianCal, 1); 
     6980            assertPred!"=="(SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal, 1); 
     6981 
     6982            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 1); 
     6983            assertPred!"=="(SysTime(DateTime(1, 1, 2, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 2); 
     6984            assertPred!"=="(SysTime(DateTime(1, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 32); 
     6985            assertPred!"=="(SysTime(DateTime(2, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 366); 
     6986            assertPred!"=="(SysTime(DateTime(3, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 731); 
     6987            assertPred!"=="(SysTime(DateTime(4, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 1096); 
     6988            assertPred!"=="(SysTime(DateTime(5, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 1462); 
     6989            assertPred!"=="(SysTime(DateTime(50, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 17_898); 
     6990            assertPred!"=="(SysTime(DateTime(97, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 35_065); 
     6991            assertPred!"=="(SysTime(DateTime(100, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 36_160); 
     6992            assertPred!"=="(SysTime(DateTime(101, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 36_525); 
     6993            assertPred!"=="(SysTime(DateTime(105, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 37_986); 
     6994            assertPred!"=="(SysTime(DateTime(200, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 72_684); 
     6995            assertPred!"=="(SysTime(DateTime(201, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 73_049); 
     6996            assertPred!"=="(SysTime(DateTime(300, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 109_208); 
     6997            assertPred!"=="(SysTime(DateTime(301, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 109_573); 
     6998            assertPred!"=="(SysTime(DateTime(400, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 145_732); 
     6999            assertPred!"=="(SysTime(DateTime(401, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 146_098); 
     7000            assertPred!"=="(SysTime(DateTime(500, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 182_257); 
     7001            assertPred!"=="(SysTime(DateTime(501, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 182_622); 
     7002            assertPred!"=="(SysTime(DateTime(1000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 364_878); 
     7003            assertPred!"=="(SysTime(DateTime(1001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 365_243); 
     7004            assertPred!"=="(SysTime(DateTime(1600, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 584_023); 
     7005            assertPred!"=="(SysTime(DateTime(1601, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 584_389); 
     7006            assertPred!"=="(SysTime(DateTime(1900, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 693_596); 
     7007            assertPred!"=="(SysTime(DateTime(1901, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 693_961); 
     7008            assertPred!"=="(SysTime(DateTime(1945, 11, 12, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 710_347); 
     7009            assertPred!"=="(SysTime(DateTime(1999, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 729_755); 
     7010            assertPred!"=="(SysTime(DateTime(2000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 730_120); 
     7011            assertPred!"=="(SysTime(DateTime(2001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 730_486); 
     7012 
     7013            assertPred!"=="(SysTime(DateTime(2010, 1, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_773); 
     7014            assertPred!"=="(SysTime(DateTime(2010, 1, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_803); 
     7015            assertPred!"=="(SysTime(DateTime(2010, 2, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_804); 
     7016            assertPred!"=="(SysTime(DateTime(2010, 2, 28, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_831); 
     7017            assertPred!"=="(SysTime(DateTime(2010, 3, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_832); 
     7018            assertPred!"=="(SysTime(DateTime(2010, 3, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_862); 
     7019            assertPred!"=="(SysTime(DateTime(2010, 4, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_863); 
     7020            assertPred!"=="(SysTime(DateTime(2010, 4, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_892); 
     7021            assertPred!"=="(SysTime(DateTime(2010, 5, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_893); 
     7022            assertPred!"=="(SysTime(DateTime(2010, 5, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_923); 
     7023            assertPred!"=="(SysTime(DateTime(2010, 6, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_924); 
     7024            assertPred!"=="(SysTime(DateTime(2010, 6, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_953); 
     7025            assertPred!"=="(SysTime(DateTime(2010, 7, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_954); 
     7026            assertPred!"=="(SysTime(DateTime(2010, 7, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_984); 
     7027            assertPred!"=="(SysTime(DateTime(2010, 8, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 733_985); 
     7028            assertPred!"=="(SysTime(DateTime(2010, 8, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_015); 
     7029            assertPred!"=="(SysTime(DateTime(2010, 9, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_016); 
     7030            assertPred!"=="(SysTime(DateTime(2010, 9, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_045); 
     7031            assertPred!"=="(SysTime(DateTime(2010, 10, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_046); 
     7032            assertPred!"=="(SysTime(DateTime(2010, 10, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_076); 
     7033            assertPred!"=="(SysTime(DateTime(2010, 11, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_077); 
     7034            assertPred!"=="(SysTime(DateTime(2010, 11, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_106); 
     7035            assertPred!"=="(SysTime(DateTime(2010, 12, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_107); 
     7036            assertPred!"=="(SysTime(DateTime(2010, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, 734_137); 
     7037 
     7038            assertPred!"=="(SysTime(DateTime(2012, 2, 1, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, 734_534); 
     7039            assertPred!"=="(SysTime(DateTime(2012, 2, 28, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, 734_561); 
     7040            assertPred!"=="(SysTime(DateTime(2012, 2, 29, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, 734_562); 
     7041            assertPred!"=="(SysTime(DateTime(2012, 3, 1, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, 734_563); 
     7042 
     7043            //Test B.C. 
     7044            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal, 0); 
     7045            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998)).dayOfGregorianCal, 0); 
     7046            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal, 0); 
     7047            assertPred!"=="(SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(1)).dayOfGregorianCal, 0); 
     7048            assertPred!"=="(SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal, 0); 
     7049 
     7050            assertPred!"=="(SysTime(DateTime(-1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal, -366); 
     7051            assertPred!"=="(SysTime(DateTime(-1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_998)).dayOfGregorianCal, -366); 
     7052            assertPred!"=="(SysTime(DateTime(-1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal, -366); 
     7053            assertPred!"=="(SysTime(DateTime(-1, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal, -366); 
     7054 
     7055            assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, 0); 
     7056            assertPred!"=="(SysTime(DateTime(0, 12, 30, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1); 
     7057            assertPred!"=="(SysTime(DateTime(0, 12, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -30); 
     7058            assertPred!"=="(SysTime(DateTime(0, 11, 30, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -31); 
     7059 
     7060            assertPred!"=="(SysTime(DateTime(-1, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -366); 
     7061            assertPred!"=="(SysTime(DateTime(-1, 12, 30, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -367); 
     7062            assertPred!"=="(SysTime(DateTime(-1, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -730); 
     7063            assertPred!"=="(SysTime(DateTime(-2, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -731); 
     7064            assertPred!"=="(SysTime(DateTime(-2, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1095); 
     7065            assertPred!"=="(SysTime(DateTime(-3, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1096); 
     7066            assertPred!"=="(SysTime(DateTime(-3, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1460); 
     7067            assertPred!"=="(SysTime(DateTime(-4, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1461); 
     7068            assertPred!"=="(SysTime(DateTime(-4, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1826); 
     7069            assertPred!"=="(SysTime(DateTime(-5, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -1827); 
     7070            assertPred!"=="(SysTime(DateTime(-5, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -2191); 
     7071            assertPred!"=="(SysTime(DateTime(-9, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -3652); 
     7072 
     7073            assertPred!"=="(SysTime(DateTime(-49, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -18_262); 
     7074            assertPred!"=="(SysTime(DateTime(-50, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -18_627); 
     7075            assertPred!"=="(SysTime(DateTime(-97, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -35_794); 
     7076            assertPred!"=="(SysTime(DateTime(-99, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -36_160); 
     7077            assertPred!"=="(SysTime(DateTime(-99, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -36_524); 
     7078            assertPred!"=="(SysTime(DateTime(-100, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -36_889); 
     7079            assertPred!"=="(SysTime(DateTime(-101, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -37_254); 
     7080            assertPred!"=="(SysTime(DateTime(-105, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -38_715); 
     7081            assertPred!"=="(SysTime(DateTime(-200, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -73_413); 
     7082            assertPred!"=="(SysTime(DateTime(-201, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -73_778); 
     7083            assertPred!"=="(SysTime(DateTime(-300, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -109_937); 
     7084            assertPred!"=="(SysTime(DateTime(-301, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -110_302); 
     7085            assertPred!"=="(SysTime(DateTime(-400, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -146_097); 
     7086            assertPred!"=="(SysTime(DateTime(-400, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -146_462); 
     7087            assertPred!"=="(SysTime(DateTime(-401, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -146_827); 
     7088            assertPred!"=="(SysTime(DateTime(-499, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -182_621); 
     7089            assertPred!"=="(SysTime(DateTime(-500, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -182_986); 
     7090            assertPred!"=="(SysTime(DateTime(-501, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -183_351); 
     7091            assertPred!"=="(SysTime(DateTime(-1000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -365_607); 
     7092            assertPred!"=="(SysTime(DateTime(-1001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -365_972); 
     7093            assertPred!"=="(SysTime(DateTime(-1599, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -584_387); 
     7094            assertPred!"=="(SysTime(DateTime(-1600, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -584_388); 
     7095            assertPred!"=="(SysTime(DateTime(-1600, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -584_753); 
     7096            assertPred!"=="(SysTime(DateTime(-1601, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -585_118); 
     7097            assertPred!"=="(SysTime(DateTime(-1900, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -694_325); 
     7098            assertPred!"=="(SysTime(DateTime(-1901, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -694_690); 
     7099            assertPred!"=="(SysTime(DateTime(-1999, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -730_484); 
     7100            assertPred!"=="(SysTime(DateTime(-2000, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -730_485); 
     7101            assertPred!"=="(SysTime(DateTime(-2000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -730_850); 
     7102            assertPred!"=="(SysTime(DateTime(-2001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)).dayOfGregorianCal, -731_215); 
     7103 
     7104            assertPred!"=="(SysTime(DateTime(-2010, 1, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_502); 
     7105            assertPred!"=="(SysTime(DateTime(-2010, 1, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_472); 
     7106            assertPred!"=="(SysTime(DateTime(-2010, 2, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_471); 
     7107            assertPred!"=="(SysTime(DateTime(-2010, 2, 28, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_444); 
     7108            assertPred!"=="(SysTime(DateTime(-2010, 3, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_443); 
     7109            assertPred!"=="(SysTime(DateTime(-2010, 3, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_413); 
     7110            assertPred!"=="(SysTime(DateTime(-2010, 4, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_412); 
     7111            assertPred!"=="(SysTime(DateTime(-2010, 4, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_383); 
     7112            assertPred!"=="(SysTime(DateTime(-2010, 5, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_382); 
     7113            assertPred!"=="(SysTime(DateTime(-2010, 5, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_352); 
     7114            assertPred!"=="(SysTime(DateTime(-2010, 6, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_351); 
     7115            assertPred!"=="(SysTime(DateTime(-2010, 6, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_322); 
     7116            assertPred!"=="(SysTime(DateTime(-2010, 7, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_321); 
     7117            assertPred!"=="(SysTime(DateTime(-2010, 7, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_291); 
     7118            assertPred!"=="(SysTime(DateTime(-2010, 8, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_290); 
     7119            assertPred!"=="(SysTime(DateTime(-2010, 8, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_260); 
     7120            assertPred!"=="(SysTime(DateTime(-2010, 9, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_259); 
     7121            assertPred!"=="(SysTime(DateTime(-2010, 9, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_230); 
     7122            assertPred!"=="(SysTime(DateTime(-2010, 10, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_229); 
     7123            assertPred!"=="(SysTime(DateTime(-2010, 10, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_199); 
     7124            assertPred!"=="(SysTime(DateTime(-2010, 11, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_198); 
     7125            assertPred!"=="(SysTime(DateTime(-2010, 11, 30, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_169); 
     7126            assertPred!"=="(SysTime(DateTime(-2010, 12, 1, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_168); 
     7127            assertPred!"=="(SysTime(DateTime(-2010, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999)).dayOfGregorianCal, -734_138); 
     7128 
     7129            assertPred!"=="(SysTime(DateTime(-2012, 2, 1, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, -735_202); 
     7130            assertPred!"=="(SysTime(DateTime(-2012, 2, 28, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, -735_175); 
     7131            assertPred!"=="(SysTime(DateTime(-2012, 2, 29, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, -735_174); 
     7132            assertPred!"=="(SysTime(DateTime(-2012, 3, 1, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, -735_173); 
     7133 
     7134            assertPred!"=="(SysTime(DateTime(-3760, 9, 7, 0, 0, 0), FracSec.from!"msecs"(0)).dayOfGregorianCal, -1_373_427); //Start of Hebrew Calendar 
     7135 
     7136            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7137            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7138            static assert(__traits(compiles, cst.dayOfGregorianCal)); 
     7139            //static assert(__traits(compiles, ist.dayOfGregorianCal)); 
     7140 
     7141            //Verify Examples. 
     7142            assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).dayOfGregorianCal == 1); 
     7143            assert(SysTime(DateTime(1, 12, 31, 23, 59, 59)).dayOfGregorianCal == 365); 
     7144            assert(SysTime(DateTime(2, 1, 1, 2, 2, 2)).dayOfGregorianCal == 366); 
     7145 
     7146            assert(SysTime(DateTime(0, 12, 31, 7, 7, 7)).dayOfGregorianCal == 0); 
     7147            assert(SysTime(DateTime(0, 1, 1, 19, 30, 0)).dayOfGregorianCal == -365); 
     7148            assert(SysTime(DateTime(-1, 12, 31, 4, 7, 0)).dayOfGregorianCal == -366); 
     7149 
     7150            assert(SysTime(DateTime(2000, 1, 1, 9, 30, 20)).dayOfGregorianCal == 730_120); 
     7151            assert(SysTime(DateTime(2010, 12, 31, 15, 45, 50)).dayOfGregorianCal == 734_137); 
     7152        } 
     7153    } 
     7154 
     7155 
     7156    //Test that the logic for the day of the Gregorian Calendar is consistent 
     7157    //between Date and SysTime. 
     7158    unittest 
     7159    { 
     7160        version(testStdDateTime) 
     7161        { 
     7162            //Test A.D. 
     7163            assertPred!"=="(Date(1, 1, 1).dayOfGregorianCal, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7164            assertPred!"=="(Date(1, 1, 2).dayOfGregorianCal, SysTime(DateTime(1, 1, 2, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7165            assertPred!"=="(Date(1, 2, 1).dayOfGregorianCal, SysTime(DateTime(1, 2, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7166            assertPred!"=="(Date(2, 1, 1).dayOfGregorianCal, SysTime(DateTime(2, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7167            assertPred!"=="(Date(3, 1, 1).dayOfGregorianCal, SysTime(DateTime(3, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7168            assertPred!"=="(Date(4, 1, 1).dayOfGregorianCal, SysTime(DateTime(4, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7169            assertPred!"=="(Date(5, 1, 1).dayOfGregorianCal, SysTime(DateTime(5, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7170            assertPred!"=="(Date(50, 1, 1).dayOfGregorianCal, SysTime(DateTime(50, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7171            assertPred!"=="(Date(97, 1, 1).dayOfGregorianCal, SysTime(DateTime(97, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7172            assertPred!"=="(Date(100, 1, 1).dayOfGregorianCal, SysTime(DateTime(100, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7173            assertPred!"=="(Date(101, 1, 1).dayOfGregorianCal, SysTime(DateTime(101, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7174            assertPred!"=="(Date(105, 1, 1).dayOfGregorianCal, SysTime(DateTime(105, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7175            assertPred!"=="(Date(200, 1, 1).dayOfGregorianCal, SysTime(DateTime(200, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7176            assertPred!"=="(Date(201, 1, 1).dayOfGregorianCal, SysTime(DateTime(201, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7177            assertPred!"=="(Date(300, 1, 1).dayOfGregorianCal, SysTime(DateTime(300, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7178            assertPred!"=="(Date(301, 1, 1).dayOfGregorianCal, SysTime(DateTime(301, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7179            assertPred!"=="(Date(400, 1, 1).dayOfGregorianCal, SysTime(DateTime(400, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7180            assertPred!"=="(Date(401, 1, 1).dayOfGregorianCal, SysTime(DateTime(401, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7181            assertPred!"=="(Date(500, 1, 1).dayOfGregorianCal, SysTime(DateTime(500, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7182            assertPred!"=="(Date(501, 1, 1).dayOfGregorianCal, SysTime(DateTime(501, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7183            assertPred!"=="(Date(1000, 1, 1).dayOfGregorianCal, SysTime(DateTime(1000, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7184            assertPred!"=="(Date(1001, 1, 1).dayOfGregorianCal, SysTime(DateTime(1001, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7185            assertPred!"=="(Date(1600, 1, 1).dayOfGregorianCal, SysTime(DateTime(1600, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7186            assertPred!"=="(Date(1601, 1, 1).dayOfGregorianCal, SysTime(DateTime(1601, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7187            assertPred!"=="(Date(1900, 1, 1).dayOfGregorianCal, SysTime(DateTime(1900, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7188            assertPred!"=="(Date(1901, 1, 1).dayOfGregorianCal, SysTime(DateTime(1901, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7189            assertPred!"=="(Date(1945, 11, 12).dayOfGregorianCal, SysTime(DateTime(1945, 11, 12, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7190            assertPred!"=="(Date(1999, 1, 1).dayOfGregorianCal, SysTime(DateTime(1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7191            assertPred!"=="(Date(1999, 7, 6).dayOfGregorianCal, SysTime(DateTime(1999, 7, 6, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7192            assertPred!"=="(Date(2000, 1, 1).dayOfGregorianCal, SysTime(DateTime(2000, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7193            assertPred!"=="(Date(2001, 1, 1).dayOfGregorianCal, SysTime(DateTime(2001, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7194 
     7195            assertPred!"=="(Date(2010, 1, 1).dayOfGregorianCal, SysTime(DateTime(2010, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7196            assertPred!"=="(Date(2010, 1, 31).dayOfGregorianCal, SysTime(DateTime(2010, 1, 31, 23, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7197            assertPred!"=="(Date(2010, 2, 1).dayOfGregorianCal, SysTime(DateTime(2010, 2, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7198            assertPred!"=="(Date(2010, 2, 28).dayOfGregorianCal, SysTime(DateTime(2010, 2, 28, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7199            assertPred!"=="(Date(2010, 3, 1).dayOfGregorianCal, SysTime(DateTime(2010, 3, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7200            assertPred!"=="(Date(2010, 3, 31).dayOfGregorianCal, SysTime(DateTime(2010, 3, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7201            assertPred!"=="(Date(2010, 4, 1).dayOfGregorianCal, SysTime(DateTime(2010, 4, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7202            assertPred!"=="(Date(2010, 4, 30).dayOfGregorianCal, SysTime(DateTime(2010, 4, 30, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7203            assertPred!"=="(Date(2010, 5, 1).dayOfGregorianCal, SysTime(DateTime(2010, 5, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7204            assertPred!"=="(Date(2010, 5, 31).dayOfGregorianCal, SysTime(DateTime(2010, 5, 31, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7205            assertPred!"=="(Date(2010, 6, 1).dayOfGregorianCal, SysTime(DateTime(2010, 6, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7206            assertPred!"=="(Date(2010, 6, 30).dayOfGregorianCal, SysTime(DateTime(2010, 6, 30, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7207            assertPred!"=="(Date(2010, 7, 1).dayOfGregorianCal, SysTime(DateTime(2010, 7, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7208            assertPred!"=="(Date(2010, 7, 31).dayOfGregorianCal, SysTime(DateTime(2010, 7, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7209            assertPred!"=="(Date(2010, 8, 1).dayOfGregorianCal, SysTime(DateTime(2010, 8, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7210            assertPred!"=="(Date(2010, 8, 31).dayOfGregorianCal, SysTime(DateTime(2010, 8, 31, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7211            assertPred!"=="(Date(2010, 9, 1).dayOfGregorianCal, SysTime(DateTime(2010, 9, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7212            assertPred!"=="(Date(2010, 9, 30).dayOfGregorianCal, SysTime(DateTime(2010, 9, 30, 12, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7213            assertPred!"=="(Date(2010, 10, 1).dayOfGregorianCal, SysTime(DateTime(2010, 10, 1, 0, 12, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7214            assertPred!"=="(Date(2010, 10, 31).dayOfGregorianCal, SysTime(DateTime(2010, 10, 31, 0, 0, 12), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7215            assertPred!"=="(Date(2010, 11, 1).dayOfGregorianCal, SysTime(DateTime(2010, 11, 1, 23, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7216            assertPred!"=="(Date(2010, 11, 30).dayOfGregorianCal, SysTime(DateTime(2010, 11, 30, 0, 59, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7217            assertPred!"=="(Date(2010, 12, 1).dayOfGregorianCal, SysTime(DateTime(2010, 12, 1, 0, 0, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7218            assertPred!"=="(Date(2010, 12, 31).dayOfGregorianCal, SysTime(DateTime(2010, 12, 31, 0, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7219 
     7220            assertPred!"=="(Date(2012, 2, 1).dayOfGregorianCal, SysTime(DateTime(2012, 2, 1, 23, 0, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7221            assertPred!"=="(Date(2012, 2, 28).dayOfGregorianCal, SysTime(DateTime(2012, 2, 28, 23, 59, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7222            assertPred!"=="(Date(2012, 2, 29).dayOfGregorianCal, SysTime(DateTime(2012, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(7)).dayOfGregorianCal); 
     7223            assertPred!"=="(Date(2012, 3, 1).dayOfGregorianCal, SysTime(DateTime(2012, 3, 1, 7, 7, 7), FracSec.from!"hnsecs"(7)).dayOfGregorianCal); 
     7224 
     7225            //Test B.C. 
     7226            assertPred!"=="(Date(0, 12, 31).dayOfGregorianCal, SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7227            assertPred!"=="(Date(0, 12, 30).dayOfGregorianCal, SysTime(DateTime(0, 12, 30, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7228            assertPred!"=="(Date(0, 12, 1).dayOfGregorianCal, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7229            assertPred!"=="(Date(0, 11, 30).dayOfGregorianCal, SysTime(DateTime(0, 11, 30, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7230 
     7231            assertPred!"=="(Date(-1, 12, 31).dayOfGregorianCal, SysTime(DateTime(-1, 12, 31, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7232            assertPred!"=="(Date(-1, 12, 30).dayOfGregorianCal, SysTime(DateTime(-1, 12, 30, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7233            assertPred!"=="(Date(-1, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7234            assertPred!"=="(Date(-2, 12, 31).dayOfGregorianCal, SysTime(DateTime(-2, 12, 31, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7235            assertPred!"=="(Date(-2, 1, 1).dayOfGregorianCal, SysTime(DateTime(-2, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7236            assertPred!"=="(Date(-3, 12, 31).dayOfGregorianCal, SysTime(DateTime(-3, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7237            assertPred!"=="(Date(-3, 1, 1).dayOfGregorianCal, SysTime(DateTime(-3, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7238            assertPred!"=="(Date(-4, 12, 31).dayOfGregorianCal, SysTime(DateTime(-4, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7239            assertPred!"=="(Date(-4, 1, 1).dayOfGregorianCal, SysTime(DateTime(-4, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7240            assertPred!"=="(Date(-5, 12, 31).dayOfGregorianCal, SysTime(DateTime(-5, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7241            assertPred!"=="(Date(-5, 1, 1).dayOfGregorianCal, SysTime(DateTime(-5, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7242            assertPred!"=="(Date(-9, 1, 1).dayOfGregorianCal, SysTime(DateTime(-9, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7243 
     7244            assertPred!"=="(Date(-49, 1, 1).dayOfGregorianCal, SysTime(DateTime(-49, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7245            assertPred!"=="(Date(-50, 1, 1).dayOfGregorianCal, SysTime(DateTime(-50, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7246            assertPred!"=="(Date(-97, 1, 1).dayOfGregorianCal, SysTime(DateTime(-97, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7247            assertPred!"=="(Date(-99, 12, 31).dayOfGregorianCal, SysTime(DateTime(-99, 12, 31, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7248            assertPred!"=="(Date(-99, 1, 1).dayOfGregorianCal, SysTime(DateTime(-99, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7249            assertPred!"=="(Date(-100, 1, 1).dayOfGregorianCal, SysTime(DateTime(-100, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7250            assertPred!"=="(Date(-101, 1, 1).dayOfGregorianCal, SysTime(DateTime(-101, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7251            assertPred!"=="(Date(-105, 1, 1).dayOfGregorianCal, SysTime(DateTime(-105, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7252            assertPred!"=="(Date(-200, 1, 1).dayOfGregorianCal, SysTime(DateTime(-200, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7253            assertPred!"=="(Date(-201, 1, 1).dayOfGregorianCal, SysTime(DateTime(-201, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7254            assertPred!"=="(Date(-300, 1, 1).dayOfGregorianCal, SysTime(DateTime(-300, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7255            assertPred!"=="(Date(-301, 1, 1).dayOfGregorianCal, SysTime(DateTime(-301, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7256            assertPred!"=="(Date(-400, 12, 31).dayOfGregorianCal, SysTime(DateTime(-400, 12, 31, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7257            assertPred!"=="(Date(-400, 1, 1).dayOfGregorianCal, SysTime(DateTime(-400, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7258            assertPred!"=="(Date(-401, 1, 1).dayOfGregorianCal, SysTime(DateTime(-401, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7259            assertPred!"=="(Date(-499, 1, 1).dayOfGregorianCal, SysTime(DateTime(-499, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7260            assertPred!"=="(Date(-500, 1, 1).dayOfGregorianCal, SysTime(DateTime(-500, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7261            assertPred!"=="(Date(-501, 1, 1).dayOfGregorianCal, SysTime(DateTime(-501, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7262            assertPred!"=="(Date(-1000, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1000, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7263            assertPred!"=="(Date(-1001, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1001, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7264            assertPred!"=="(Date(-1599, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1599, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7265            assertPred!"=="(Date(-1600, 12, 31).dayOfGregorianCal, SysTime(DateTime(-1600, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7266            assertPred!"=="(Date(-1600, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1600, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7267            assertPred!"=="(Date(-1601, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1601, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7268            assertPred!"=="(Date(-1900, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1900, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7269            assertPred!"=="(Date(-1901, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1901, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7270            assertPred!"=="(Date(-1999, 1, 1).dayOfGregorianCal, SysTime(DateTime(-1999, 1, 1, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7271            assertPred!"=="(Date(-1999, 7, 6).dayOfGregorianCal, SysTime(DateTime(-1999, 7, 6, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7272            assertPred!"=="(Date(-2000, 12, 31).dayOfGregorianCal, SysTime(DateTime(-2000, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7273            assertPred!"=="(Date(-2000, 1, 1).dayOfGregorianCal, SysTime(DateTime(-2000, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7274            assertPred!"=="(Date(-2001, 1, 1).dayOfGregorianCal, SysTime(DateTime(-2001, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7275 
     7276            assertPred!"=="(Date(-2010, 1, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7277            assertPred!"=="(Date(-2010, 1, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 1, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7278            assertPred!"=="(Date(-2010, 2, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 2, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7279            assertPred!"=="(Date(-2010, 2, 28).dayOfGregorianCal, SysTime(DateTime(-2010, 2, 28, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7280            assertPred!"=="(Date(-2010, 3, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 3, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7281            assertPred!"=="(Date(-2010, 3, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 3, 31, 12, 13, 14), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7282            assertPred!"=="(Date(-2010, 4, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 4, 1, 12, 13, 14), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7283            assertPred!"=="(Date(-2010, 4, 30).dayOfGregorianCal, SysTime(DateTime(-2010, 4, 30, 12, 13, 14), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7284            assertPred!"=="(Date(-2010, 5, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 5, 1, 12, 13, 14), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7285            assertPred!"=="(Date(-2010, 5, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 5, 31, 23, 59, 59), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7286            assertPred!"=="(Date(-2010, 6, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 6, 1, 23, 59, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7287            assertPred!"=="(Date(-2010, 6, 30).dayOfGregorianCal, SysTime(DateTime(-2010, 6, 30, 23, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7288            assertPred!"=="(Date(-2010, 7, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 7, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7289            assertPred!"=="(Date(-2010, 7, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 7, 31, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7290            assertPred!"=="(Date(-2010, 8, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 8, 1, 0, 0, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7291            assertPred!"=="(Date(-2010, 8, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 8, 31, 0, 0, 0), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7292            assertPred!"=="(Date(-2010, 9, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 9, 1, 0, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7293            assertPred!"=="(Date(-2010, 9, 30).dayOfGregorianCal, SysTime(DateTime(-2010, 9, 30, 12, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7294            assertPred!"=="(Date(-2010, 10, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 10, 1, 0, 12, 0), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7295            assertPred!"=="(Date(-2010, 10, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 10, 31, 0, 0, 12), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7296            assertPred!"=="(Date(-2010, 11, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 11, 1, 23, 0, 0), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7297            assertPred!"=="(Date(-2010, 11, 30).dayOfGregorianCal, SysTime(DateTime(-2010, 11, 30, 0, 59, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7298            assertPred!"=="(Date(-2010, 12, 1).dayOfGregorianCal, SysTime(DateTime(-2010, 12, 1, 0, 0, 59), FracSec.from!"hnsecs"(500)).dayOfGregorianCal); 
     7299            assertPred!"=="(Date(-2010, 12, 31).dayOfGregorianCal, SysTime(DateTime(-2010, 12, 31, 0, 59, 59), FracSec.from!"hnsecs"(50_000)).dayOfGregorianCal); 
     7300 
     7301            assertPred!"=="(Date(-2012, 2, 1).dayOfGregorianCal, SysTime(DateTime(-2012, 2, 1, 23, 0, 59), FracSec.from!"hnsecs"(9_999_999)).dayOfGregorianCal); 
     7302            assertPred!"=="(Date(-2012, 2, 28).dayOfGregorianCal, SysTime(DateTime(-2012, 2, 28, 23, 59, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7303            assertPred!"=="(Date(-2012, 2, 29).dayOfGregorianCal, SysTime(DateTime(-2012, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(7)).dayOfGregorianCal); 
     7304            assertPred!"=="(Date(-2012, 3, 1).dayOfGregorianCal, SysTime(DateTime(-2012, 3, 1, 7, 7, 7), FracSec.from!"hnsecs"(7)).dayOfGregorianCal); 
     7305 
     7306            assertPred!"=="(Date(-3760, 9, 7).dayOfGregorianCal, SysTime(DateTime(-3760, 9, 7, 0, 0, 0), FracSec.from!"hnsecs"(0)).dayOfGregorianCal); 
     7307        } 
     7308    } 
     7309 
     7310 
     7311    /++ 
     7312        The Xth day of the Gregorian Calendar that this SysTime is on. Setting 
     7313        this property does not affect the time portion of SysTime. 
     7314 
     7315        Params: 
     7316            days = The day of the Gregorian Calendar to set this Date to. 
     7317 
     7318        Examples: 
     7319-------------------- 
     7320auto st = SysTime(DateTime(0, 0, 0, 12, 0, 0)); 
     7321st.dayOfGregorianCal = 1; 
     7322assert(st == SysTime(DateTime(1, 1, 1, 12, 0, 0))); 
     7323 
     7324st.dayOfGregorianCal = 365; 
     7325assert(st == SysTime(DateTime(1, 12, 31, 12, 0, 0))); 
     7326 
     7327st.dayOfGregorianCal = 366; 
     7328assert(st == SysTime(DateTime(2, 1, 1, 12, 0, 0))); 
     7329 
     7330st.dayOfGregorianCal = 0; 
     7331assert(st == SysTime(DateTime(0, 12, 31, 12, 0, 0))); 
     7332 
     7333st.dayOfGregorianCal = -365; 
     7334assert(st == SysTime(DateTime(-0, 1, 1, 12, 0, 0))); 
     7335 
     7336st.dayOfGregorianCal = -366; 
     7337assert(st == SysTime(DateTime(-1, 12, 31, 12, 0, 0))); 
     7338 
     7339st.dayOfGregorianCal = 730_120; 
     7340assert(st == SysTime(DateTime(2000, 1, 1, 12, 0, 0))); 
     7341 
     7342st.dayOfGregorianCal = 734_137; 
     7343assert(st == SysTime(DateTime(2010, 12, 31, 12, 0, 0))); 
     7344-------------------- 
     7345     +/ 
     7346    @property void dayOfGregorianCal(int days) nothrow 
     7347    { 
     7348        auto hnsecs = adjTime; 
     7349        hnsecs = removeUnitsFromHNSecs!"days"(hnsecs); 
     7350 
     7351        if(hnsecs < 0) 
     7352            hnsecs += convert!("hours", "hnsecs")(24); 
     7353 
     7354        if(--days < 0) 
     7355        { 
     7356            hnsecs -= convert!("hours", "hnsecs")(24); 
     7357            ++days; 
     7358        } 
     7359 
     7360        immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
     7361 
     7362        adjTime = newDaysHNSecs + hnsecs; 
     7363    } 
     7364 
     7365    unittest 
     7366    { 
     7367        version(testStdDateTime) 
     7368        { 
     7369            void testST(SysTime orig, int day, in SysTime expected, size_t line = __LINE__) 
     7370            { 
     7371                orig.dayOfGregorianCal = day; 
     7372                assertPred!"=="(orig, expected, "", __FILE__, line); 
     7373            } 
     7374 
     7375            //Test A.D. 
     7376            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     7377            testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     7378            testST(SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7379 
     7380            //Test B.C. 
     7381            testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     7382            testST(SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7383            testST(SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     7384            testST(SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     7385 
     7386            //Test Both. 
     7387            testST(SysTime(DateTime(-512, 7, 20, 0, 0, 0), FracSec.from!"hnsecs"(0)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     7388            testST(SysTime(DateTime(-513, 6, 6, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
     7389            testST(SysTime(DateTime(-511, 5, 7, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 1, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7390 
     7391            testST(SysTime(DateTime(1607, 4, 8, 0, 0, 0), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(0, 12, 31, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
     7392            testST(SysTime(DateTime(1500, 3, 9, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7393            testST(SysTime(DateTime(999, 2, 10, 23, 59, 59), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
     7394            testST(SysTime(DateTime(2007, 12, 11, 23, 59, 59), FracSec.from!"hnsecs"(0)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
     7395 
     7396 
     7397            auto sysTime = SysTime(DateTime(1, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212)); 
     7398 
     7399            void testST2(int day, in SysTime expected, size_t line = __LINE__) 
     7400            { 
     7401                sysTime.dayOfGregorianCal = day; 
     7402                assertPred!"=="(sysTime, expected, "", __FILE__, line); 
     7403            } 
     7404 
     7405            //Test A.D. 
     7406            testST2(1, SysTime(DateTime(1, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7407            testST2(2, SysTime(DateTime(1, 1, 2, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7408            testST2(32, SysTime(DateTime(1, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7409            testST2(366, SysTime(DateTime(2, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7410            testST2(731, SysTime(DateTime(3, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7411            testST2(1096, SysTime(DateTime(4, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7412            testST2(1462, SysTime(DateTime(5, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7413            testST2(17_898, SysTime(DateTime(50, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7414            testST2(35_065, SysTime(DateTime(97, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7415            testST2(36_160, SysTime(DateTime(100, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7416            testST2(36_525, SysTime(DateTime(101, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7417            testST2(37_986, SysTime(DateTime(105, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7418            testST2(72_684, SysTime(DateTime(200, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7419            testST2(73_049, SysTime(DateTime(201, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7420            testST2(109_208, SysTime(DateTime(300, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7421            testST2(109_573, SysTime(DateTime(301, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7422            testST2(145_732, SysTime(DateTime(400, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7423            testST2(146_098, SysTime(DateTime(401, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7424            testST2(182_257, SysTime(DateTime(500, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7425            testST2(182_622, SysTime(DateTime(501, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7426            testST2(364_878, SysTime(DateTime(1000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7427            testST2(365_243, SysTime(DateTime(1001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7428            testST2(584_023, SysTime(DateTime(1600, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7429            testST2(584_389, SysTime(DateTime(1601, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7430            testST2(693_596, SysTime(DateTime(1900, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7431            testST2(693_961, SysTime(DateTime(1901, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7432            testST2(729_755, SysTime(DateTime(1999, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7433            testST2(730_120, SysTime(DateTime(2000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7434            testST2(730_486, SysTime(DateTime(2001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7435 
     7436            testST2(733_773, SysTime(DateTime(2010, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7437            testST2(733_803, SysTime(DateTime(2010, 1, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7438            testST2(733_804, SysTime(DateTime(2010, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7439            testST2(733_831, SysTime(DateTime(2010, 2, 28, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7440            testST2(733_832, SysTime(DateTime(2010, 3, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7441            testST2(733_862, SysTime(DateTime(2010, 3, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7442            testST2(733_863, SysTime(DateTime(2010, 4, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7443            testST2(733_892, SysTime(DateTime(2010, 4, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7444            testST2(733_893, SysTime(DateTime(2010, 5, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7445            testST2(733_923, SysTime(DateTime(2010, 5, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7446            testST2(733_924, SysTime(DateTime(2010, 6, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7447            testST2(733_953, SysTime(DateTime(2010, 6, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7448            testST2(733_954, SysTime(DateTime(2010, 7, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7449            testST2(733_984, SysTime(DateTime(2010, 7, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7450            testST2(733_985, SysTime(DateTime(2010, 8, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7451            testST2(734_015, SysTime(DateTime(2010, 8, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7452            testST2(734_016, SysTime(DateTime(2010, 9, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7453            testST2(734_045, SysTime(DateTime(2010, 9, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7454            testST2(734_046, SysTime(DateTime(2010, 10, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7455            testST2(734_076, SysTime(DateTime(2010, 10, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7456            testST2(734_077, SysTime(DateTime(2010, 11, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7457            testST2(734_106, SysTime(DateTime(2010, 11, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7458            testST2(734_107, SysTime(DateTime(2010, 12, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7459            testST2(734_137, SysTime(DateTime(2010, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7460 
     7461            testST2(734_534, SysTime(DateTime(2012, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7462            testST2(734_561, SysTime(DateTime(2012, 2, 28, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7463            testST2(734_562, SysTime(DateTime(2012, 2, 29, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7464            testST2(734_563, SysTime(DateTime(2012, 3, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7465 
     7466            testST2(734_534,  SysTime(DateTime(2012, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7467 
     7468            testST2(734_561, SysTime(DateTime(2012, 2, 28, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7469            testST2(734_562, SysTime(DateTime(2012, 2, 29, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7470            testST2(734_563, SysTime(DateTime(2012, 3, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7471 
     7472            //Test B.C. 
     7473            testST2(0, SysTime(DateTime(0, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7474            testST2(-1, SysTime(DateTime(0, 12, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7475            testST2(-30, SysTime(DateTime(0, 12, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7476            testST2(-31, SysTime(DateTime(0, 11, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7477 
     7478            testST2(-366, SysTime(DateTime(-1, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7479            testST2(-367, SysTime(DateTime(-1, 12, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7480            testST2(-730, SysTime(DateTime(-1, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7481            testST2(-731, SysTime(DateTime(-2, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7482            testST2(-1095, SysTime(DateTime(-2, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7483            testST2(-1096, SysTime(DateTime(-3, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7484            testST2(-1460, SysTime(DateTime(-3, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7485            testST2(-1461, SysTime(DateTime(-4, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7486            testST2(-1826, SysTime(DateTime(-4, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7487            testST2(-1827, SysTime(DateTime(-5, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7488            testST2(-2191, SysTime(DateTime(-5, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7489            testST2(-3652, SysTime(DateTime(-9, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7490 
     7491            testST2(-18_262, SysTime(DateTime(-49, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7492            testST2(-18_627, SysTime(DateTime(-50, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7493            testST2(-35_794, SysTime(DateTime(-97, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7494            testST2(-36_160, SysTime(DateTime(-99, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7495            testST2(-36_524, SysTime(DateTime(-99, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7496            testST2(-36_889, SysTime(DateTime(-100, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7497            testST2(-37_254, SysTime(DateTime(-101, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7498            testST2(-38_715, SysTime(DateTime(-105, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7499            testST2(-73_413, SysTime(DateTime(-200, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7500            testST2(-73_778, SysTime(DateTime(-201, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7501            testST2(-109_937, SysTime(DateTime(-300, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7502            testST2(-110_302, SysTime(DateTime(-301, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7503            testST2(-146_097, SysTime(DateTime(-400, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7504            testST2(-146_462, SysTime(DateTime(-400, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7505            testST2(-146_827, SysTime(DateTime(-401, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7506            testST2(-182_621, SysTime(DateTime(-499, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7507            testST2(-182_986, SysTime(DateTime(-500, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7508            testST2(-183_351, SysTime(DateTime(-501, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7509            testST2(-365_607, SysTime(DateTime(-1000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7510            testST2(-365_972, SysTime(DateTime(-1001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7511            testST2(-584_387, SysTime(DateTime(-1599, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7512            testST2(-584_388, SysTime(DateTime(-1600, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7513            testST2(-584_753, SysTime(DateTime(-1600, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7514            testST2(-585_118, SysTime(DateTime(-1601, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7515            testST2(-694_325, SysTime(DateTime(-1900, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7516            testST2(-694_690, SysTime(DateTime(-1901, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7517            testST2(-730_484, SysTime(DateTime(-1999, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7518            testST2(-730_485, SysTime(DateTime(-2000, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7519            testST2(-730_850, SysTime(DateTime(-2000, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7520            testST2(-731_215, SysTime(DateTime(-2001, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7521 
     7522            testST2(-734_502, SysTime(DateTime(-2010, 1, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7523            testST2(-734_472, SysTime(DateTime(-2010, 1, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7524            testST2(-734_471, SysTime(DateTime(-2010, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7525            testST2(-734_444, SysTime(DateTime(-2010, 2, 28, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7526            testST2(-734_443, SysTime(DateTime(-2010, 3, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7527            testST2(-734_413, SysTime(DateTime(-2010, 3, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7528            testST2(-734_412, SysTime(DateTime(-2010, 4, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7529            testST2(-734_383, SysTime(DateTime(-2010, 4, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7530            testST2(-734_382, SysTime(DateTime(-2010, 5, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7531            testST2(-734_352, SysTime(DateTime(-2010, 5, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7532            testST2(-734_351, SysTime(DateTime(-2010, 6, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7533            testST2(-734_322, SysTime(DateTime(-2010, 6, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7534            testST2(-734_321, SysTime(DateTime(-2010, 7, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7535            testST2(-734_291, SysTime(DateTime(-2010, 7, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7536            testST2(-734_290, SysTime(DateTime(-2010, 8, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7537            testST2(-734_260, SysTime(DateTime(-2010, 8, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7538            testST2(-734_259, SysTime(DateTime(-2010, 9, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7539            testST2(-734_230, SysTime(DateTime(-2010, 9, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7540            testST2(-734_229, SysTime(DateTime(-2010, 10, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7541            testST2(-734_199, SysTime(DateTime(-2010, 10, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7542            testST2(-734_198, SysTime(DateTime(-2010, 11, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7543            testST2(-734_169, SysTime(DateTime(-2010, 11, 30, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7544            testST2(-734_168, SysTime(DateTime(-2010, 12, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7545            testST2(-734_138, SysTime(DateTime(-2010, 12, 31, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7546 
     7547            testST2(-735_202, SysTime(DateTime(-2012, 2, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7548            testST2(-735_175, SysTime(DateTime(-2012, 2, 28, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7549            testST2(-735_174, SysTime(DateTime(-2012, 2, 29, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7550            testST2(-735_173, SysTime(DateTime(-2012, 3, 1, 12, 2, 9), FracSec.from!"msecs"(212))); 
     7551 
     7552            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7553            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7554            static assert(!__traits(compiles, cst.dayOfGregorianCal = 7)); 
     7555            //static assert(!__traits(compiles, ist.dayOfGregorianCal = 7)); 
     7556 
     7557            //Verify Examples. 
     7558            auto st = SysTime(DateTime(0, 1, 1, 12, 0, 0)); 
     7559            st.dayOfGregorianCal = 1; 
     7560            assert(st == SysTime(DateTime(1, 1, 1, 12, 0, 0))); 
     7561 
     7562            st.dayOfGregorianCal = 365; 
     7563            assert(st == SysTime(DateTime(1, 12, 31, 12, 0, 0))); 
     7564 
     7565            st.dayOfGregorianCal = 366; 
     7566            assert(st == SysTime(DateTime(2, 1, 1, 12, 0, 0))); 
     7567 
     7568            st.dayOfGregorianCal = 0; 
     7569            assert(st == SysTime(DateTime(0, 12, 31, 12, 0, 0))); 
     7570 
     7571            st.dayOfGregorianCal = -365; 
     7572            assert(st == SysTime(DateTime(-0, 1, 1, 12, 0, 0))); 
     7573 
     7574            st.dayOfGregorianCal = -366; 
     7575            assert(st == SysTime(DateTime(-1, 12, 31, 12, 0, 0))); 
     7576 
     7577            st.dayOfGregorianCal = 730_120; 
     7578            assert(st == SysTime(DateTime(2000, 1, 1, 12, 0, 0))); 
     7579 
     7580            st.dayOfGregorianCal = 734_137; 
     7581            assert(st == SysTime(DateTime(2010, 12, 31, 12, 0, 0))); 
     7582        } 
     7583    } 
     7584 
     7585 
     7586    /++ 
     7587        The ISO 8601 week of the year that this SysTime is in. 
     7588 
     7589        See_Also: 
     7590            $(WEB en.wikipedia.org/wiki/ISO_week_date, ISO Week Date</a> 
     7591      +/ 
     7592    @property ubyte isoWeek() const nothrow 
     7593    { 
     7594        return (cast(Date)this).isoWeek; 
     7595    } 
     7596 
     7597    unittest 
     7598    { 
     7599        version(testStdDateTime) 
     7600        { 
     7601            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7602            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7603            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7604            static assert(__traits(compiles, st.isoWeek)); 
     7605            static assert(__traits(compiles, cst.isoWeek)); 
     7606            //static assert(__traits(compiles, ist.isoWeek)); 
     7607        } 
     7608    } 
     7609 
     7610 
     7611    /++ 
     7612        SysTime for the last day in the month that this Date is in. 
     7613        The time portion of endOfMonth is always 23:59:59.9999999. 
     7614 
     7615        Examples: 
     7616-------------------- 
     7617assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).endOfMonth == SysTime(DateTime(1999, 1, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7618assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0), FracSec.from!"msecs"(24)).endOfMonth == SysTime(DateTime(1999, 2, 28, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7619assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27), FracSec.from!"usecs"(5203)).endOfMonth == SysTime(DateTime(2000, 2, 29, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7620assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9), FracSec.from!"hnsecs"(12345)).endOfMonth == SysTime(DateTime(2000, 6, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7621-------------------- 
     7622      +/ 
     7623    @property SysTime endOfMonth() const nothrow 
     7624    { 
     7625        immutable hnsecs = adjTime; 
     7626        immutable days = getUnitsFromHNSecs!"days"(hnsecs); 
     7627 
     7628        auto date = Date(cast(int)days + 1).endOfMonth; 
     7629        auto newDays = date.dayOfGregorianCal - 1; 
     7630        long theTimeHNSecs; 
     7631 
     7632        if(newDays < 0) 
     7633        { 
     7634            theTimeHNSecs = -1; 
     7635            ++newDays; 
     7636        } 
     7637        else 
     7638            theTimeHNSecs = convert!("days", "hnsecs")(1) - 1; 
     7639 
     7640        immutable newDaysHNSecs = convert!("days", "hnsecs")(newDays); 
     7641 
     7642        auto retval = SysTime(this._stdTime, this._timezone.get); 
     7643        retval.adjTime = newDaysHNSecs + theTimeHNSecs; 
     7644 
     7645        return retval; 
     7646    } 
     7647 
     7648    unittest 
     7649    { 
     7650        version(testStdDateTime) 
     7651        { 
     7652            //Test A.D. 
     7653            assertPred!"=="(SysTime(Date(1999, 1, 1)).endOfMonth, SysTime(DateTime(1999, 1, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7654            assertPred!"=="(SysTime(Date(1999, 2, 1)).endOfMonth, SysTime(DateTime(1999, 2, 28, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7655            assertPred!"=="(SysTime(Date(2000, 2, 1)).endOfMonth, SysTime(DateTime(2000, 2, 29, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7656            assertPred!"=="(SysTime(Date(1999, 3, 1)).endOfMonth, SysTime(DateTime(1999, 3, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7657            assertPred!"=="(SysTime(Date(1999, 4, 1)).endOfMonth, SysTime(DateTime(1999, 4, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7658            assertPred!"=="(SysTime(Date(1999, 5, 1)).endOfMonth, SysTime(DateTime(1999, 5, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7659            assertPred!"=="(SysTime(Date(1999, 6, 1)).endOfMonth, SysTime(DateTime(1999, 6, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7660            assertPred!"=="(SysTime(Date(1999, 7, 1)).endOfMonth, SysTime(DateTime(1999, 7, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7661            assertPred!"=="(SysTime(Date(1999, 8, 1)).endOfMonth, SysTime(DateTime(1999, 8, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7662            assertPred!"=="(SysTime(Date(1999, 9, 1)).endOfMonth, SysTime(DateTime(1999, 9, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7663            assertPred!"=="(SysTime(Date(1999, 10, 1)).endOfMonth, SysTime(DateTime(1999, 10, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7664            assertPred!"=="(SysTime(Date(1999, 11, 1)).endOfMonth, SysTime(DateTime(1999, 11, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7665            assertPred!"=="(SysTime(Date(1999, 12, 1)).endOfMonth, SysTime(DateTime(1999, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7666 
     7667            //Test B.C. 
     7668            assertPred!"=="(SysTime(Date(-1999, 1, 1)).endOfMonth, SysTime(DateTime(-1999, 1, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7669            assertPred!"=="(SysTime(Date(-1999, 2, 1)).endOfMonth, SysTime(DateTime(-1999, 2, 28, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7670            assertPred!"=="(SysTime(Date(-2000, 2, 1)).endOfMonth, SysTime(DateTime(-2000, 2, 29, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7671            assertPred!"=="(SysTime(Date(-1999, 3, 1)).endOfMonth, SysTime(DateTime(-1999, 3, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7672            assertPred!"=="(SysTime(Date(-1999, 4, 1)).endOfMonth, SysTime(DateTime(-1999, 4, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7673            assertPred!"=="(SysTime(Date(-1999, 5, 1)).endOfMonth, SysTime(DateTime(-1999, 5, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7674            assertPred!"=="(SysTime(Date(-1999, 6, 1)).endOfMonth, SysTime(DateTime(-1999, 6, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7675            assertPred!"=="(SysTime(Date(-1999, 7, 1)).endOfMonth, SysTime(DateTime(-1999, 7, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7676            assertPred!"=="(SysTime(Date(-1999, 8, 1)).endOfMonth, SysTime(DateTime(-1999, 8, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7677            assertPred!"=="(SysTime(Date(-1999, 9, 1)).endOfMonth, SysTime(DateTime(-1999, 9, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7678            assertPred!"=="(SysTime(Date(-1999, 10, 1)).endOfMonth, SysTime(DateTime(-1999, 10, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7679            assertPred!"=="(SysTime(Date(-1999, 11, 1)).endOfMonth, SysTime(DateTime(-1999, 11, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7680            assertPred!"=="(SysTime(Date(-1999, 12, 1)).endOfMonth, SysTime(DateTime(-1999, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7681 
     7682            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7683            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7684            static assert(__traits(compiles, cst.endOfMonth)); 
     7685            //static assert(__traits(compiles, ist.endOfMonth)); 
     7686 
     7687            //Verify Examples. 
     7688            assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).endOfMonth == SysTime(DateTime(1999, 1, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7689            assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0), FracSec.from!"msecs"(24)).endOfMonth == SysTime(DateTime(1999, 2, 28, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7690            assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27), FracSec.from!"usecs"(5203)).endOfMonth == SysTime(DateTime(2000, 2, 29, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7691            assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9), FracSec.from!"hnsecs"(12345)).endOfMonth == SysTime(DateTime(2000, 6, 30, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
     7692        } 
     7693    } 
     7694 
     7695 
     7696    /++ 
     7697        The last day in the month that this SysTime is in. 
     7698 
     7699        Examples: 
     7700-------------------- 
     7701assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).endOfMonthDay == 31); 
     7702assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0)).endOfMonthDay == 28); 
     7703assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27)).endOfMonthDay == 29); 
     7704assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9)).endOfMonthDay == 30); 
     7705-------------------- 
     7706      +/ 
     7707    @property ubyte endOfMonthDay() const nothrow 
     7708    { 
     7709        return Date(dayOfGregorianCal).endOfMonthDay; 
     7710    } 
     7711 
     7712    unittest 
     7713    { 
     7714        version(testStdDateTime) 
     7715        { 
     7716            //Test A.D. 
     7717            assertPred!"=="(SysTime(DateTime(1999, 1, 1, 12, 1, 13)).endOfMonthDay, 31); 
     7718            assertPred!"=="(SysTime(DateTime(1999, 2, 1, 17, 13, 12)).endOfMonthDay, 28); 
     7719            assertPred!"=="(SysTime(DateTime(2000, 2, 1, 13, 2, 12)).endOfMonthDay, 29); 
     7720            assertPred!"=="(SysTime(DateTime(1999, 3, 1, 12, 13, 12)).endOfMonthDay, 31); 
     7721            assertPred!"=="(SysTime(DateTime(1999, 4, 1, 12, 6, 13)).endOfMonthDay, 30); 
     7722            assertPred!"=="(SysTime(DateTime(1999, 5, 1, 15, 13, 12)).endOfMonthDay, 31); 
     7723            assertPred!"=="(SysTime(DateTime(1999, 6, 1, 13, 7, 12)).endOfMonthDay, 30); 
     7724            assertPred!"=="(SysTime(DateTime(1999, 7, 1, 12, 13, 17)).endOfMonthDay, 31); 
     7725            assertPred!"=="(SysTime(DateTime(1999, 8, 1, 12, 3, 13)).endOfMonthDay, 31); 
     7726            assertPred!"=="(SysTime(DateTime(1999, 9, 1, 12, 13, 12)).endOfMonthDay, 30); 
     7727            assertPred!"=="(SysTime(DateTime(1999, 10, 1, 13, 19, 12)).endOfMonthDay, 31); 
     7728            assertPred!"=="(SysTime(DateTime(1999, 11, 1, 12, 13, 17)).endOfMonthDay, 30); 
     7729            assertPred!"=="(SysTime(DateTime(1999, 12, 1, 12, 52, 13)).endOfMonthDay, 31); 
     7730 
     7731            //Test B.C. 
     7732            assertPred!"=="(SysTime(DateTime(-1999, 1, 1, 12, 1, 13)).endOfMonthDay, 31); 
     7733            assertPred!"=="(SysTime(DateTime(-1999, 2, 1, 7, 13, 12)).endOfMonthDay, 28); 
     7734            assertPred!"=="(SysTime(DateTime(-2000, 2, 1, 13, 2, 12)).endOfMonthDay, 29); 
     7735            assertPred!"=="(SysTime(DateTime(-1999, 3, 1, 12, 13, 12)).endOfMonthDay, 31); 
     7736            assertPred!"=="(SysTime(DateTime(-1999, 4, 1, 12, 6, 13)).endOfMonthDay, 30); 
     7737            assertPred!"=="(SysTime(DateTime(-1999, 5, 1, 5, 13, 12)).endOfMonthDay, 31); 
     7738            assertPred!"=="(SysTime(DateTime(-1999, 6, 1, 13, 7, 12)).endOfMonthDay, 30); 
     7739            assertPred!"=="(SysTime(DateTime(-1999, 7, 1, 12, 13, 17)).endOfMonthDay, 31); 
     7740            assertPred!"=="(SysTime(DateTime(-1999, 8, 1, 12, 3, 13)).endOfMonthDay, 31); 
     7741            assertPred!"=="(SysTime(DateTime(-1999, 9, 1, 12, 13, 12)).endOfMonthDay, 30); 
     7742            assertPred!"=="(SysTime(DateTime(-1999, 10, 1, 13, 19, 12)).endOfMonthDay, 31); 
     7743            assertPred!"=="(SysTime(DateTime(-1999, 11, 1, 12, 13, 17)).endOfMonthDay, 30); 
     7744            assertPred!"=="(SysTime(DateTime(-1999, 12, 1, 12, 52, 13)).endOfMonthDay, 31); 
     7745 
     7746            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7747            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7748            static assert(__traits(compiles, cst.endOfMonthDay)); 
     7749            //static assert(__traits(compiles, ist.endOfMonthDay)); 
     7750 
     7751            //Verify Examples. 
     7752            assert(SysTime(DateTime(1999, 1, 6, 0, 0, 0)).endOfMonthDay == 31); 
     7753            assert(SysTime(DateTime(1999, 2, 7, 19, 30, 0)).endOfMonthDay == 28); 
     7754            assert(SysTime(DateTime(2000, 2, 7, 5, 12, 27)).endOfMonthDay == 29); 
     7755            assert(SysTime(DateTime(2000, 6, 4, 12, 22, 9)).endOfMonthDay == 30); 
     7756        } 
     7757    } 
     7758 
     7759 
     7760    /++ 
     7761        Whether the current year is a date in A.D. 
     7762 
     7763        Examples: 
     7764-------------------- 
     7765assert(SysTime(DateTime(1, 1, 1, 12, 7, 0)).isAD); 
     7766assert(SysTime(DateTime(2010, 12, 31, 0, 0, 0)).isAD); 
     7767assert(!SysTime(DateTime(0, 12, 31, 23, 59, 59)).isAD); 
     7768assert(!SysTime(DateTime(-2010, 1, 1, 2, 2, 2)).isAD); 
     7769-------------------- 
     7770      +/ 
     7771    @property bool isAD() const nothrow 
     7772    { 
     7773        return adjTime >= 0; 
     7774    } 
     7775 
     7776    unittest 
     7777    { 
     7778        version(testStdDateTime) 
     7779        { 
     7780            assert(SysTime(DateTime(2010, 7, 4, 12, 0, 9)).isAD); 
     7781            assert(SysTime(DateTime(1, 1, 1, 0, 0, 0)).isAD); 
     7782            assert(!SysTime(DateTime(0, 12, 31, 23, 59, 59)).isAD); 
     7783            assert(!SysTime(DateTime(0, 1, 1, 23, 59, 59)).isAD); 
     7784            assert(!SysTime(DateTime(-1, 1, 1, 23 ,59 ,59)).isAD); 
     7785            assert(!SysTime(DateTime(-2010, 7, 4, 12, 2, 2)).isAD); 
     7786 
     7787            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7788            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7789            static assert(__traits(compiles, cst.isAD)); 
     7790            //static assert(__traits(compiles, ist.isAD)); 
     7791 
     7792            //Verify Examples. 
     7793            assert(SysTime(DateTime(1, 1, 1, 12, 7, 0)).isAD); 
     7794            assert(SysTime(DateTime(2010, 12, 31, 0, 0, 0)).isAD); 
     7795            assert(!SysTime(DateTime(0, 12, 31, 23, 59, 59)).isAD); 
     7796            assert(!SysTime(DateTime(-2010, 1, 1, 2, 2, 2)).isAD); 
     7797        } 
     7798    } 
     7799 
     7800 
     7801    /++ 
     7802        The julian day for this SysTime at the given time. For example, prior 
     7803        to noon, 1996-03-31 would be the julian day number 2_450_173, so this 
     7804        function returns 2_450_173, while from noon onward, it the julian day 
     7805        number would be 2_450_174, so this function returns 2_450_174. 
     7806      +/ 
     7807    @property long julianDay() const nothrow 
     7808    { 
     7809        immutable jd = dayOfGregorianCal + 1_721_425; 
     7810 
     7811        return hour < 12 ? jd - 1 : jd; 
     7812    } 
     7813 
     7814    unittest 
     7815    { 
     7816        version(testStdDateTime) 
     7817        { 
     7818            assertPred!"=="(SysTime(DateTime(-4713, 11, 24, 0, 0, 0)).julianDay, -1); 
     7819            assertPred!"=="(SysTime(DateTime(-4713, 11, 24, 12, 0, 0)).julianDay, 0); 
     7820 
     7821            assertPred!"=="(SysTime(DateTime(0, 12, 31, 0, 0, 0)).julianDay, 1_721_424); 
     7822            assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 0, 0)).julianDay, 1_721_425); 
     7823 
     7824            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0)).julianDay, 1_721_425); 
     7825            assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 0, 0)).julianDay, 1_721_426); 
     7826 
     7827            assertPred!"=="(SysTime(DateTime(1582, 10, 15, 0, 0, 0)).julianDay, 2_299_160); 
     7828            assertPred!"=="(SysTime(DateTime(1582, 10, 15, 12, 0, 0)).julianDay, 2_299_161); 
     7829 
     7830            assertPred!"=="(SysTime(DateTime(1858, 11, 17, 0, 0, 0)).julianDay, 2_400_000); 
     7831            assertPred!"=="(SysTime(DateTime(1858, 11, 17, 12, 0, 0)).julianDay, 2_400_001); 
     7832 
     7833            assertPred!"=="(SysTime(DateTime(1982, 1, 4, 0, 0, 0)).julianDay, 2_444_973); 
     7834            assertPred!"=="(SysTime(DateTime(1982, 1, 4, 12, 0, 0)).julianDay, 2_444_974); 
     7835 
     7836            assertPred!"=="(SysTime(DateTime(1996, 3, 31, 0, 0, 0)).julianDay, 2_450_173); 
     7837            assertPred!"=="(SysTime(DateTime(1996, 3, 31, 12, 0, 0)).julianDay, 2_450_174); 
     7838 
     7839            assertPred!"=="(SysTime(DateTime(2010, 8, 24, 0, 0, 0)).julianDay, 2_455_432); 
     7840            assertPred!"=="(SysTime(DateTime(2010, 8, 24, 12, 0, 0)).julianDay, 2_455_433); 
     7841 
     7842            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7843            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7844            static assert(__traits(compiles, cst.julianDay)); 
     7845            //static assert(__traits(compiles, ist.julianDay)); 
     7846        } 
     7847    } 
     7848 
     7849 
     7850    /++ 
     7851        The modified julian day for any time on this Date (since, the modified 
     7852        julian day changes at midnight). 
     7853      +/ 
     7854    @property long modJulianDay() const nothrow 
     7855    { 
     7856        return (dayOfGregorianCal + 1_721_425) - 2_400_001; 
     7857    } 
     7858 
     7859    unittest 
     7860    { 
     7861        version(testStdDateTime) 
     7862        { 
     7863            assertPred!"=="(SysTime(DateTime(1858, 11, 17, 0, 0, 0)).modJulianDay, 0); 
     7864            assertPred!"=="(SysTime(DateTime(1858, 11, 17, 12, 0, 0)).modJulianDay, 0); 
     7865 
     7866            assertPred!"=="(SysTime(DateTime(2010, 8, 24, 0, 0, 0)).modJulianDay, 55_432); 
     7867            assertPred!"=="(SysTime(DateTime(2010, 8, 24, 12, 0, 0)).modJulianDay, 55_432); 
     7868 
     7869            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7870            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7871            static assert(__traits(compiles, cst.modJulianDay)); 
     7872            //static assert(__traits(compiles, ist.modJulianDay)); 
     7873        } 
     7874    } 
     7875 
     7876 
     7877    /++ 
     7878        Returns a Date equivalent to this SysTime. 
     7879      +/ 
     7880    Date opCast(T)() const nothrow 
     7881        if(is(Unqual!T == Date)) 
     7882    { 
     7883        return Date(dayOfGregorianCal); 
     7884    } 
     7885 
     7886    unittest 
     7887    { 
     7888        version(testStdDateTime) 
     7889        { 
     7890            assertPred!"=="(cast(Date)SysTime(Date(1999, 7, 6)), Date(1999, 7, 6)); 
     7891            assertPred!"=="(cast(Date)SysTime(Date(2000, 12, 31)), Date(2000, 12, 31)); 
     7892            assertPred!"=="(cast(Date)SysTime(Date(2001, 1, 1)), Date(2001, 1, 1)); 
     7893 
     7894            assertPred!"=="(cast(Date)SysTime(DateTime(1999, 7, 6, 12, 10, 9)), Date(1999, 7, 6)); 
     7895            assertPred!"=="(cast(Date)SysTime(DateTime(2000, 12, 31, 13, 11, 10)), Date(2000, 12, 31)); 
     7896            assertPred!"=="(cast(Date)SysTime(DateTime(2001, 1, 1, 14, 12, 11)), Date(2001, 1, 1)); 
     7897 
     7898            assertPred!"=="(cast(Date)SysTime(Date(-1999, 7, 6)), Date(-1999, 7, 6)); 
     7899            assertPred!"=="(cast(Date)SysTime(Date(-2000, 12, 31)), Date(-2000, 12, 31)); 
     7900            assertPred!"=="(cast(Date)SysTime(Date(-2001, 1, 1)), Date(-2001, 1, 1)); 
     7901 
     7902            assertPred!"=="(cast(Date)SysTime(DateTime(-1999, 7, 6, 12, 10, 9)), Date(-1999, 7, 6)); 
     7903            assertPred!"=="(cast(Date)SysTime(DateTime(-2000, 12, 31, 13, 11, 10)), Date(-2000, 12, 31)); 
     7904            assertPred!"=="(cast(Date)SysTime(DateTime(-2001, 1, 1, 14, 12, 11)), Date(-2001, 1, 1)); 
     7905 
     7906            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7907            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7908            static assert(__traits(compiles, cast(Date)cst)); 
     7909            //static assert(__traits(compiles, cast(Date)ist)); 
     7910        } 
     7911    } 
     7912 
     7913 
     7914    /++ 
     7915        Returns a DateTime equivalent to this SysTime. 
     7916      +/ 
     7917    DateTime opCast(T)() const nothrow 
     7918        if(is(Unqual!T == DateTime)) 
     7919    { 
     7920        try 
     7921        { 
     7922            auto hnsecs = adjTime; 
     7923            auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     7924 
     7925            if(hnsecs < 0) 
     7926            { 
     7927                hnsecs += convert!("hours", "hnsecs")(24); 
     7928                --days; 
     7929            } 
     7930 
     7931            immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     7932            immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     7933            immutable second = getUnitsFromHNSecs!"seconds"(hnsecs); 
     7934 
     7935            return DateTime(Date(cast(int)days), TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second)); 
     7936        } 
     7937        catch(Exception e) 
     7938            assert(0, "Either DateTime's constructor or TimeOfDay's constructor threw."); 
     7939    } 
     7940 
     7941    unittest 
     7942    { 
     7943        version(testStdDateTime) 
     7944        { 
     7945            assertPred!"=="(cast(DateTime)SysTime(DateTime(1, 1, 6, 7, 12, 22)), DateTime(1, 1, 6, 7, 12, 22)); 
     7946            assertPred!"=="(cast(DateTime)SysTime(DateTime(1, 1, 6, 7, 12, 22), FracSec.from!"msecs"(22)), DateTime(1, 1, 6, 7, 12, 22)); 
     7947            assertPred!"=="(cast(DateTime)SysTime(Date(1999, 7, 6)), DateTime(1999, 7, 6, 0, 0, 0)); 
     7948            assertPred!"=="(cast(DateTime)SysTime(Date(2000, 12, 31)), DateTime(2000, 12, 31, 0, 0, 0)); 
     7949            assertPred!"=="(cast(DateTime)SysTime(Date(2001, 1, 1)), DateTime(2001, 1, 1, 0, 0, 0)); 
     7950 
     7951            assertPred!"=="(cast(DateTime)SysTime(DateTime(1999, 7, 6, 12, 10, 9)), DateTime(1999, 7, 6, 12, 10, 9)); 
     7952            assertPred!"=="(cast(DateTime)SysTime(DateTime(2000, 12, 31, 13, 11, 10)), DateTime(2000, 12, 31, 13, 11, 10)); 
     7953            assertPred!"=="(cast(DateTime)SysTime(DateTime(2001, 1, 1, 14, 12, 11)), DateTime(2001, 1, 1, 14, 12, 11)); 
     7954 
     7955            assertPred!"=="(cast(DateTime)SysTime(DateTime(-1, 1, 6, 7, 12, 22)), DateTime(-1, 1, 6, 7, 12, 22)); 
     7956            assertPred!"=="(cast(DateTime)SysTime(DateTime(-1, 1, 6, 7, 12, 22), FracSec.from!"msecs"(22)), DateTime(-1, 1, 6, 7, 12, 22)); 
     7957            assertPred!"=="(cast(DateTime)SysTime(Date(-1999, 7, 6)), DateTime(-1999, 7, 6, 0, 0, 0)); 
     7958            assertPred!"=="(cast(DateTime)SysTime(Date(-2000, 12, 31)), DateTime(-2000, 12, 31, 0, 0, 0)); 
     7959            assertPred!"=="(cast(DateTime)SysTime(Date(-2001, 1, 1)), DateTime(-2001, 1, 1, 0, 0, 0)); 
     7960 
     7961            assertPred!"=="(cast(DateTime)SysTime(DateTime(-1999, 7, 6, 12, 10, 9)), DateTime(-1999, 7, 6, 12, 10, 9)); 
     7962            assertPred!"=="(cast(DateTime)SysTime(DateTime(-2000, 12, 31, 13, 11, 10)), DateTime(-2000, 12, 31, 13, 11, 10)); 
     7963            assertPred!"=="(cast(DateTime)SysTime(DateTime(-2001, 1, 1, 14, 12, 11)), DateTime(-2001, 1, 1, 14, 12, 11)); 
     7964 
     7965            assertPred!"=="(cast(DateTime)SysTime(DateTime(2011, 1, 13, 8, 17, 2), FracSec.from!"msecs"(296), LocalTime()), 
     7966                            DateTime(2011, 1, 13, 8, 17, 2)); 
     7967 
     7968            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7969            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     7970            static assert(__traits(compiles, cast(DateTime)cst)); 
     7971            //static assert(__traits(compiles, cast(DateTime)ist)); 
     7972        } 
     7973    } 
     7974 
     7975 
     7976    /++ 
     7977        Returns a TimeOfDay equivalent to this SysTime. 
     7978      +/ 
     7979    TimeOfDay opCast(T)() const nothrow 
     7980        if(is(Unqual!T == TimeOfDay)) 
     7981    { 
     7982        try 
     7983        { 
     7984            auto hnsecs = adjTime; 
     7985            hnsecs = removeUnitsFromHNSecs!"days"(hnsecs); 
     7986 
     7987            if(hnsecs < 0) 
     7988                hnsecs += convert!("hours", "hnsecs")(24); 
     7989 
     7990            immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     7991            immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     7992            immutable second = getUnitsFromHNSecs!"seconds"(hnsecs); 
     7993 
     7994            return TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second); 
     7995        } 
     7996        catch(Exception e) 
     7997            assert(0, "TimeOfDay's constructor threw."); 
     7998    } 
     7999 
     8000    unittest 
     8001    { 
     8002        version(testStdDateTime) 
     8003        { 
     8004            assertPred!"=="(cast(TimeOfDay)SysTime(Date(1999, 7, 6)), TimeOfDay(0, 0, 0)); 
     8005            assertPred!"=="(cast(TimeOfDay)SysTime(Date(2000, 12, 31)), TimeOfDay(0, 0, 0)); 
     8006            assertPred!"=="(cast(TimeOfDay)SysTime(Date(2001, 1, 1)), TimeOfDay(0, 0, 0)); 
     8007 
     8008            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(1999, 7, 6, 12, 10, 9)), TimeOfDay(12, 10, 9)); 
     8009            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(2000, 12, 31, 13, 11, 10)), TimeOfDay(13, 11, 10)); 
     8010            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(2001, 1, 1, 14, 12, 11)), TimeOfDay(14, 12, 11)); 
     8011 
     8012            assertPred!"=="(cast(TimeOfDay)SysTime(Date(-1999, 7, 6)), TimeOfDay(0, 0, 0)); 
     8013            assertPred!"=="(cast(TimeOfDay)SysTime(Date(-2000, 12, 31)), TimeOfDay(0, 0, 0)); 
     8014            assertPred!"=="(cast(TimeOfDay)SysTime(Date(-2001, 1, 1)), TimeOfDay(0, 0, 0)); 
     8015 
     8016            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(-1999, 7, 6, 12, 10, 9)), TimeOfDay(12, 10, 9)); 
     8017            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(-2000, 12, 31, 13, 11, 10)), TimeOfDay(13, 11, 10)); 
     8018            assertPred!"=="(cast(TimeOfDay)SysTime(DateTime(-2001, 1, 1, 14, 12, 11)), TimeOfDay(14, 12, 11)); 
     8019 
     8020            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8021            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8022            static assert(__traits(compiles, cast(TimeOfDay)cst)); 
     8023            //static assert(__traits(compiles, cast(TimeOfDay)ist)); 
     8024        } 
     8025    } 
     8026 
     8027 
     8028    //Temporary hack until bug http://d.puremagic.com/issues/show_bug.cgi?id=4867 is fixed. 
     8029    //This allows assignment from const(SysTime) to SysTime. 
     8030    //It may be a good idea to keep it though, since casting from a type to itself 
     8031    //should be allowed, and it doesn't work without this opCast() since opCast() 
     8032    //has already been defined for other types. 
     8033    SysTime opCast(T)() const pure nothrow 
     8034        if(is(Unqual!T == SysTime)) 
     8035    { 
     8036        return SysTime(_stdTime, _timezone.get); 
     8037    } 
     8038 
     8039 
     8040    /++ 
     8041        Converts this SysTime to a string with the format YYYYMMDDTHHMMSS.FFFFFFFTZ 
     8042        (where F is fractional seconds and TZ is time zone). 
     8043 
     8044        Note that the number of digits in the fractional seconds varies with the 
     8045        number of fractional seconds. It's a maximum of 7 (which would be hnsecs), 
     8046        but only has as many as are necessary to hold the correct value (so no 
     8047        trailing zeroes), and if there are no fractional seconds, then there is 
     8048        no decimal point. 
     8049 
     8050        If this SysTime's time zone is LocalTime, then TZ is empty. If the time zone 
     8051        is UTC, then it is "Z". Otherwise, it is the offset from UTC (e.g. +1:00 or -7:00). 
     8052        Note that the offset from UTC is $(I not) enough to uniquely identify the time zone. 
     8053 
     8054        Time zone offsets will be in the form +HH:MM or -HH:MM. 
     8055 
     8056        Examples: 
     8057-------------------- 
     8058assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOString() == 
     8059       "20100704T070612"); 
     8060assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toISOString() == 
     8061       "19981225T021500.024"); 
     8062assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOString() == 
     8063       "00000105T230959"); 
     8064assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toISOString() == 
     8065       "-00040105T000002.052092"); 
     8066-------------------- 
     8067      +/ 
     8068    string toISOString() const nothrow 
     8069    { 
     8070        try 
     8071        { 
     8072            immutable adjustedTime = adjTime; 
     8073            long hnsecs = adjustedTime; 
     8074 
     8075            auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     8076 
     8077            if(hnsecs < 0) 
     8078            { 
     8079                hnsecs += convert!("hours", "hnsecs")(24); 
     8080                --days; 
     8081            } 
     8082 
     8083            auto hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     8084            auto minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     8085            auto second = splitUnitsFromHNSecs!"seconds"(hnsecs); 
     8086 
     8087            auto dateTime = DateTime(Date(cast(int)days), TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second)); 
     8088            auto fracSecStr = fracSecToISOString(cast(int)hnsecs); 
     8089 
     8090            if(_timezone.get is LocalTime()) 
     8091                return dateTime.toISOString() ~ fracSecToISOString(cast(int)hnsecs); 
     8092 
     8093            if(_timezone.get is UTC()) 
     8094                return dateTime.toISOString() ~ fracSecToISOString(cast(int)hnsecs) ~ "Z"; 
     8095 
     8096            immutable utcOffset = cast(int)convert!("hnsecs", "minutes")(stdTime - adjustedTime); 
     8097 
     8098            return dateTime.toISOString() ~ fracSecToISOString(cast(int)hnsecs) ~ SimpleTimeZone.toISOString(utcOffset); 
     8099        } 
     8100        catch(Exception e) 
     8101            assert(0, "format() threw."); 
     8102    } 
     8103 
     8104    unittest 
     8105    { 
     8106        version(testStdDateTime) 
     8107        { 
     8108            //Test A.D. 
     8109            assertPred!"=="(SysTime(DateTime.init, UTC()).toISOString(), "00010101T000000Z"); 
     8110            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1), UTC()).toISOString(), "00010101T000000.0000001Z"); 
     8111 
     8112            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0)).toISOString(), "00091204T000000"); 
     8113            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12)).toISOString(), "00991204T050612"); 
     8114            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59)).toISOString(), "09991204T134459"); 
     8115            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59)).toISOString(), "99990704T235959"); 
     8116            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1)).toISOString(), "+100001020T010101"); 
     8117 
     8118            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toISOString(), "00091204T000000.042"); 
     8119            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toISOString(), "00991204T050612.1"); 
     8120            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toISOString(), "09991204T134459.04502"); 
     8121            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toISOString(), "99990704T235959.0000012"); 
     8122            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOString(), "+100001020T010101.050789"); 
     8123 
     8124            //Test B.C. 
     8125            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toISOString(), "00001231T235959.9999999Z"); 
     8126            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1), UTC()).toISOString(), "00001231T235959.0000001Z"); 
     8127            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), UTC()).toISOString(), "00001231T235959Z"); 
     8128 
     8129            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 12, 4)).toISOString(), "00001204T001204"); 
     8130            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0)).toISOString(), "-00091204T000000"); 
     8131            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12)).toISOString(), "-00991204T050612"); 
     8132            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59)).toISOString(), "-09991204T134459"); 
     8133            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59)).toISOString(), "-99990704T235959"); 
     8134            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1)).toISOString(), "-100001020T010101"); 
     8135 
     8136            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 0, 0), FracSec.from!"msecs"(7)).toISOString(), "00001204T000000.007"); 
     8137            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toISOString(), "-00091204T000000.042"); 
     8138            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toISOString(), "-00991204T050612.1"); 
     8139            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toISOString(), "-09991204T134459.04502"); 
     8140            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toISOString(), "-99990704T235959.0000012"); 
     8141            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOString(), "-100001020T010101.050789"); 
     8142 
     8143            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8144            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8145            static assert(__traits(compiles, cast(TimeOfDay)cst)); 
     8146            //static assert(__traits(compiles, cast(TimeOfDay)ist)); 
     8147 
     8148            //Verify Examples. 
     8149            assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOString() == "20100704T070612"); 
     8150            assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toISOString() == "19981225T021500.024"); 
     8151            assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOString() == "00000105T230959"); 
     8152            assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toISOString() == "-00040105T000002.052092"); 
     8153        } 
     8154    } 
     8155 
     8156 
     8157 
     8158    /++ 
     8159        Converts this SysTime to a string with the format YYYY-MM-DDTHH:MM:SS.FFFFFFFTZ 
     8160        (where F is fractional seconds and TZ is time zone). 
     8161 
     8162        Note that the number of digits in the fractional seconds varies with the 
     8163        number of fractional seconds. It's a maximum of 7 (which would be hnsecs), 
     8164        but only has as many as are necessary to hold the correct value (so no 
     8165        trailing zeroes), and if there are no fractional seconds, then there is 
     8166        no decimal point. 
     8167 
     8168        If this SysTime's time zone is LocalTime, then TZ is empty. If the time 
     8169        zone is UTC, then it is "Z". Otherwise, it is the offset from UTC 
     8170        (e.g. +1:00 or -7:00). Note that the offset from UTC is $(I not) enough 
     8171        to uniquely identify the time zone. 
     8172 
     8173        Time zone offsets will be in the form +HH:MM or -HH:MM. 
     8174 
     8175        Examples: 
     8176-------------------- 
     8177assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOExtendedString() == 
     8178       "2010-07-04T07:06:12"); 
     8179assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toISOExtendedString() == 
     8180       "1998-12-25T02:15:00.024"); 
     8181assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOExtendedString() == 
     8182       "0000-01-05T23:09:59"); 
     8183assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toISOExtendedString() == 
     8184       "-0004-01-05T00:00:02.052092"); 
     8185-------------------- 
     8186      +/ 
     8187    string toISOExtendedString() const nothrow 
     8188    { 
     8189        try 
     8190        { 
     8191            immutable adjustedTime = adjTime; 
     8192            long hnsecs = adjustedTime; 
     8193 
     8194            auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     8195 
     8196            if(hnsecs < 0) 
     8197            { 
     8198                hnsecs += convert!("hours", "hnsecs")(24); 
     8199                --days; 
     8200            } 
     8201 
     8202            auto hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     8203            auto minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     8204            auto second = splitUnitsFromHNSecs!"seconds"(hnsecs); 
     8205 
     8206            auto dateTime = DateTime(Date(cast(int)days), TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second)); 
     8207            auto fracSecStr = fracSecToISOString(cast(int)hnsecs); 
     8208 
     8209            if(_timezone.get is LocalTime()) 
     8210                return dateTime.toISOExtendedString() ~ fracSecToISOString(cast(int)hnsecs); 
     8211 
     8212            if(_timezone.get is UTC()) 
     8213                return dateTime.toISOExtendedString() ~ fracSecToISOString(cast(int)hnsecs) ~ "Z"; 
     8214 
     8215            immutable utcOffset = cast(int)convert!("hnsecs", "minutes")(stdTime - adjustedTime); 
     8216 
     8217            return dateTime.toISOExtendedString() ~ fracSecToISOString(cast(int)hnsecs) ~ SimpleTimeZone.toISOString(utcOffset); 
     8218        } 
     8219        catch(Exception e) 
     8220            assert(0, "format() threw."); 
     8221    } 
     8222 
     8223    unittest 
     8224    { 
     8225        version(testStdDateTime) 
     8226        { 
     8227            //Test A.D. 
     8228            assertPred!"=="(SysTime(DateTime.init, UTC()).toISOExtendedString(), "0001-01-01T00:00:00Z"); 
     8229            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1), UTC()).toISOExtendedString(), "0001-01-01T00:00:00.0000001Z"); 
     8230 
     8231            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0)).toISOExtendedString(), "0009-12-04T00:00:00"); 
     8232            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12)).toISOExtendedString(), "0099-12-04T05:06:12"); 
     8233            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59)).toISOExtendedString(), "0999-12-04T13:44:59"); 
     8234            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59)).toISOExtendedString(), "9999-07-04T23:59:59"); 
     8235            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1)).toISOExtendedString(), "+10000-10-20T01:01:01"); 
     8236 
     8237            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toISOExtendedString(), "0009-12-04T00:00:00.042"); 
     8238            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toISOExtendedString(), "0099-12-04T05:06:12.1"); 
     8239            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toISOExtendedString(), "0999-12-04T13:44:59.04502"); 
     8240            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toISOExtendedString(), "9999-07-04T23:59:59.0000012"); 
     8241            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOExtendedString(), "+10000-10-20T01:01:01.050789"); 
     8242 
     8243            //Test B.C. 
     8244            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toISOExtendedString(), "0000-12-31T23:59:59.9999999Z"); 
     8245            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1), UTC()).toISOExtendedString(), "0000-12-31T23:59:59.0000001Z"); 
     8246            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), UTC()).toISOExtendedString(), "0000-12-31T23:59:59Z"); 
     8247 
     8248            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 12, 4)).toISOExtendedString(), "0000-12-04T00:12:04"); 
     8249            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0)).toISOExtendedString(), "-0009-12-04T00:00:00"); 
     8250            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12)).toISOExtendedString(), "-0099-12-04T05:06:12"); 
     8251            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59)).toISOExtendedString(), "-0999-12-04T13:44:59"); 
     8252            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59)).toISOExtendedString(), "-9999-07-04T23:59:59"); 
     8253            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1)).toISOExtendedString(), "-10000-10-20T01:01:01"); 
     8254 
     8255            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 0, 0), FracSec.from!"msecs"(7)).toISOExtendedString(), "0000-12-04T00:00:00.007"); 
     8256            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toISOExtendedString(), "-0009-12-04T00:00:00.042"); 
     8257            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toISOExtendedString(), "-0099-12-04T05:06:12.1"); 
     8258            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toISOExtendedString(), "-0999-12-04T13:44:59.04502"); 
     8259            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toISOExtendedString(), "-9999-07-04T23:59:59.0000012"); 
     8260            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toISOExtendedString(), "-10000-10-20T01:01:01.050789"); 
     8261 
     8262            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8263            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8264            static assert(__traits(compiles, cast(TimeOfDay)cst)); 
     8265            //static assert(__traits(compiles, cast(TimeOfDay)ist)); 
     8266 
     8267            //Verify Examples. 
     8268            assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toISOExtendedString() == "2010-07-04T07:06:12"); 
     8269            assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toISOExtendedString() == "1998-12-25T02:15:00.024"); 
     8270            assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toISOExtendedString() == "0000-01-05T23:09:59"); 
     8271            assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toISOExtendedString() == "-0004-01-05T00:00:02.052092"); 
     8272        } 
     8273    } 
     8274 
     8275    /++ 
     8276        Converts this SysTime to a string with the format YYYY-Mon-DD HH:MM:SS.FFFFFFFTZ 
     8277        (where F is fractional seconds and TZ is time zone). 
     8278 
     8279        Note that the number of digits in the fractional seconds varies with the 
     8280        number of fractional seconds. It's a maximum of 7 (which would be hnsecs), 
     8281        but only has as many as are necessary to hold the correct value (so no 
     8282        trailing zeroes), and if there are no fractional seconds, then there is 
     8283        no decimal point. 
     8284 
     8285        If this SysTime's time zone is LocalTime, then TZ is empty. If the time 
     8286        zone is UTC, then it is "Z". Otherwise, it is the offset from UTC 
     8287        (e.g. +1:00 or -7:00). Note that the offset from UTC is $(I not) enough 
     8288        to uniquely identify the time zone. 
     8289 
     8290        Time zone offsets will be in the form +HH:MM or -HH:MM. 
     8291 
     8292        Examples: 
     8293-------------------- 
     8294assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toSimpleString() == 
     8295       "2010-Jul-04 07:06:12"); 
     8296assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toSimpleString() == 
     8297       "1998-Dec-25 02:15:00.024"); 
     8298assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toSimpleString() == 
     8299       "0000-Jan-05 23:09:59"); 
     8300assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toSimpleString() == 
     8301        "-0004-Jan-05 00:00:02.052092"); 
     8302-------------------- 
     8303      +/ 
     8304    string toSimpleString() const nothrow 
     8305    { 
     8306        try 
     8307        { 
     8308            immutable adjustedTime = adjTime; 
     8309            long hnsecs = adjustedTime; 
     8310 
     8311            auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
     8312 
     8313            if(hnsecs < 0) 
     8314            { 
     8315                hnsecs += convert!("hours", "hnsecs")(24); 
     8316                --days; 
     8317            } 
     8318 
     8319            auto hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
     8320            auto minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
     8321            auto second = splitUnitsFromHNSecs!"seconds"(hnsecs); 
     8322 
     8323            auto dateTime = DateTime(Date(cast(int)days), TimeOfDay(cast(int)hour, cast(int)minute, cast(int)second)); 
     8324            auto fracSecStr = fracSecToISOString(cast(int)hnsecs); 
     8325 
     8326            if(_timezone.get is LocalTime()) 
     8327                return dateTime.toSimpleString() ~ fracSecToISOString(cast(int)hnsecs); 
     8328 
     8329            if(_timezone.get is UTC()) 
     8330                return dateTime.toSimpleString() ~ fracSecToISOString(cast(int)hnsecs) ~ "Z"; 
     8331 
     8332            immutable utcOffset = cast(int)convert!("hnsecs", "minutes")(stdTime - adjustedTime); 
     8333 
     8334            return dateTime.toSimpleString() ~ fracSecToISOString(cast(int)hnsecs) ~ SimpleTimeZone.toISOString(utcOffset); 
     8335        } 
     8336        catch(Exception e) 
     8337            assert(0, "format() threw."); 
     8338    } 
     8339 
     8340    unittest 
     8341    { 
     8342        version(testStdDateTime) 
     8343        { 
     8344            //Test A.D. 
     8345            assertPred!"=="(SysTime(DateTime.init, UTC()).toString(), "0001-Jan-01 00:00:00Z"); 
     8346            assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1), UTC()).toString(), "0001-Jan-01 00:00:00.0000001Z"); 
     8347 
     8348            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0)).toSimpleString(), "0009-Dec-04 00:00:00"); 
     8349            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12)).toSimpleString(), "0099-Dec-04 05:06:12"); 
     8350            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59)).toSimpleString(), "0999-Dec-04 13:44:59"); 
     8351            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59)).toSimpleString(), "9999-Jul-04 23:59:59"); 
     8352            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1)).toSimpleString(), "+10000-Oct-20 01:01:01"); 
     8353 
     8354            assertPred!"=="(SysTime(DateTime(9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toSimpleString(), "0009-Dec-04 00:00:00.042"); 
     8355            assertPred!"=="(SysTime(DateTime(99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toSimpleString(), "0099-Dec-04 05:06:12.1"); 
     8356            assertPred!"=="(SysTime(DateTime(999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toSimpleString(), "0999-Dec-04 13:44:59.04502"); 
     8357            assertPred!"=="(SysTime(DateTime(9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toSimpleString(), "9999-Jul-04 23:59:59.0000012"); 
     8358            assertPred!"=="(SysTime(DateTime(10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toSimpleString(), "+10000-Oct-20 01:01:01.050789"); 
     8359 
     8360            //Test B.C. 
     8361            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toSimpleString(), "0000-Dec-31 23:59:59.9999999Z"); 
     8362            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1), UTC()).toSimpleString(), "0000-Dec-31 23:59:59.0000001Z"); 
     8363            assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), UTC()).toSimpleString(), "0000-Dec-31 23:59:59Z"); 
     8364 
     8365            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 12, 4)).toSimpleString(), "0000-Dec-04 00:12:04"); 
     8366            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0)).toSimpleString(), "-0009-Dec-04 00:00:00"); 
     8367            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12)).toSimpleString(), "-0099-Dec-04 05:06:12"); 
     8368            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59)).toSimpleString(), "-0999-Dec-04 13:44:59"); 
     8369            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59)).toSimpleString(), "-9999-Jul-04 23:59:59"); 
     8370            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1)).toSimpleString(), "-10000-Oct-20 01:01:01"); 
     8371 
     8372            assertPred!"=="(SysTime(DateTime(0, 12, 4, 0, 0, 0), FracSec.from!"msecs"(7)).toSimpleString(), "0000-Dec-04 00:00:00.007"); 
     8373            assertPred!"=="(SysTime(DateTime(-9, 12, 4, 0, 0, 0), FracSec.from!"msecs"(42)).toSimpleString(), "-0009-Dec-04 00:00:00.042"); 
     8374            assertPred!"=="(SysTime(DateTime(-99, 12, 4, 5, 6, 12), FracSec.from!"msecs"(100)).toSimpleString(), "-0099-Dec-04 05:06:12.1"); 
     8375            assertPred!"=="(SysTime(DateTime(-999, 12, 4, 13, 44, 59), FracSec.from!"usecs"(45020)).toSimpleString(), "-0999-Dec-04 13:44:59.04502"); 
     8376            assertPred!"=="(SysTime(DateTime(-9999, 7, 4, 23, 59, 59), FracSec.from!"hnsecs"(12)).toSimpleString(), "-9999-Jul-04 23:59:59.0000012"); 
     8377            assertPred!"=="(SysTime(DateTime(-10000, 10, 20, 1, 1, 1), FracSec.from!"hnsecs"(507890)).toSimpleString(), "-10000-Oct-20 01:01:01.050789"); 
     8378 
     8379            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8380            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8381            static assert(__traits(compiles, cast(TimeOfDay)cst)); 
     8382            //static assert(__traits(compiles, cast(TimeOfDay)ist)); 
     8383 
     8384            //Verify Examples. 
     8385            assert(SysTime(DateTime(2010, 7, 4, 7, 6, 12)).toSimpleString() == "2010-Jul-04 07:06:12"); 
     8386            assert(SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(24)).toSimpleString() == "1998-Dec-25 02:15:00.024"); 
     8387            assert(SysTime(DateTime(0, 1, 5, 23, 9, 59)).toSimpleString() == "0000-Jan-05 23:09:59"); 
     8388            assert(SysTime(DateTime(-4, 1, 5, 0, 0, 2), FracSec.from!"hnsecs"(520920)).toSimpleString() == "-0004-Jan-05 00:00:02.052092"); 
     8389        } 
     8390    } 
     8391 
     8392 
     8393    /+ 
     8394        Converts this SysTime to a string. 
     8395      +/ 
     8396    //Due to bug http://d.puremagic.com/issues/show_bug.cgi?id=3715 , we can't 
     8397    //have versions of toString() with extra modifiers, so we define one version 
     8398    //with modifiers and one without. 
     8399    string toString() 
     8400    { 
     8401        return toSimpleString(); 
     8402    } 
     8403 
     8404    /++ 
     8405        Converts this SysTime to a string. 
     8406      +/ 
     8407    //Due to bug http://d.puremagic.com/issues/show_bug.cgi?id=3715 , we can't 
     8408    //have versions of toString() with extra modifiers, so we define one version 
     8409    //with modifiers and one without. 
     8410    string toString() const nothrow 
     8411    { 
     8412        return toSimpleString(); 
     8413    } 
     8414 
     8415    unittest 
     8416    { 
     8417        version(testStdDateTime) 
     8418        { 
     8419            auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8420            const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8421            //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
     8422            static assert(__traits(compiles, st.toString())); 
     8423            static assert(__traits(compiles, cst.toString())); 
     8424            //static assert(__traits(compiles, ist.toString())); 
     8425        } 
     8426    } 
     8427 
     8428 
     8429    /++ 
     8430        Creates a SysTime from a string with the format YYYYMMDDTHHMMSS.FFFFFFFTZ 
     8431        (where F is fractional seconds is time zone). Whitespace is stripped from 
     8432        the given string. 
     8433 
     8434        The exact format is exactly as described in toISOString() except that 
     8435        trailing zeroes are permitted - including having fractional seconds with 
     8436        all zeroes. However, a decimal point with nothing following it is invalid. 
     8437 
     8438        If there is no time zone in the string, then LocalTime is used. If the 
     8439        time zone is "Z", then UTC is used. Otherwise, a SimpleTimeZone which 
     8440        corresponds to the given offset from UTC is used. If you wish the 
     8441        returned SysTime to be a particular time zone, then pass in that time 
     8442        zone and the SysTime to be returned will be converted to that time zone 
     8443        (though it will still be read in as whatever time zone is in its string). 
     8444 
     8445        The accepted formats for time zone offsets are +H, -H, +HH, -HH, +H:MM, 
     8446        -H:MM, +HH:MM, and -HH:MM. 
     8447 
     8448        Params: 
     8449            isoString = A string formatted in the ISO format for dates and times. 
     8450            tz        = The time zone to convert the given time to (no conversion 
     8451                        occurs if null). 
     8452 
     8453        Throws: 
     8454            DateTimeException if the given string is not in the ISO format or if 
     8455            the resulting SysTime would not be valid. 
     8456 
     8457        Examples: 
     8458-------------------- 
     8459assert(SysTime.fromISOString("20100704T070612") == 
     8460       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8461assert(SysTime.fromISOString("19981225T021500.007") == 
     8462       SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     8463assert(SysTime.fromISOString("00000105T230959.00002") == 
     8464       SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     8465assert(SysTime.fromISOString("-00040105T000002") == 
     8466       SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     8467assert(SysTime.fromISOString(" 20100704T070612 ") == 
     8468       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8469 
     8470assert(SysTime.fromISOString("20100704T070612Z") == 
     8471       SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     8472assert(SysTime.fromISOString("20100704T070612-8:00") == 
     8473       SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     8474assert(SysTime.fromISOString("20100704T070612+8:00") == 
     8475       SysTime(DateTime(2010, 7, 3, 7, 6, 12), new SimpleTimeZone(480))); 
     8476-------------------- 
     8477      +/ 
     8478    static SysTime fromISOString(S)(in S isoString, immutable TimeZone tz = null) 
     8479        if(isSomeString!S) 
     8480    { 
     8481        auto dstr = to!dstring(strip(isoString)); 
     8482        immutable skipFirst = dstr.startsWith("+", "-") != 0; 
     8483 
     8484        auto found = (skipFirst ? dstr[1..$] : dstr).find(".", "Z", "+", "-"); 
     8485        auto dateTimeStr = dstr[0 .. $ - found[0].length]; 
     8486 
     8487        dstring fracSecStr; 
     8488        dstring zoneStr; 
     8489 
     8490        if(found[1] != 0) 
     8491        { 
     8492            if(found[1] == 1) 
     8493            { 
     8494                auto foundTZ = found[0].find("Z", "+", "-"); 
     8495 
     8496                if(foundTZ[1] != 0) 
     8497                { 
     8498                    fracSecStr = found[0][0 .. $ - foundTZ[0].length]; 
     8499                    zoneStr = foundTZ[0]; 
     8500                } 
     8501                else 
     8502                    fracSecStr = found[0]; 
     8503            } 
     8504            else 
     8505                zoneStr = found[0]; 
     8506        } 
     8507 
     8508        try 
     8509        { 
     8510            auto dateTime = DateTime.fromISOString(dateTimeStr); 
     8511            auto fracSec = fracSecFromISOString(fracSecStr); 
     8512            DTRebindable!(immutable TimeZone) parsedZone; 
     8513 
     8514            if(zoneStr.empty) 
     8515                parsedZone = LocalTime(); 
     8516            else if(zoneStr == "Z") 
     8517                parsedZone = UTC(); 
     8518            else 
     8519                parsedZone = SimpleTimeZone.fromISOString(zoneStr); 
     8520 
     8521            auto retval = SysTime(dateTime, fracSec, parsedZone.get); 
     8522 
     8523            if(tz !is null) 
     8524                retval.timezone = tz; 
     8525 
     8526            return retval; 
     8527        } 
     8528        catch(DateTimeException dte) 
     8529            throw new DateTimeException(format("Invalid ISO String: %s", isoString)); 
     8530    } 
     8531 
     8532    unittest 
     8533    { 
     8534        version(testStdDateTime) 
     8535        { 
     8536            assertThrown!DateTimeException(SysTime.fromISOString("")); 
     8537            assertThrown!DateTimeException(SysTime.fromISOString("20100704000000")); 
     8538            assertThrown!DateTimeException(SysTime.fromISOString("20100704 000000")); 
     8539            assertThrown!DateTimeException(SysTime.fromISOString("20100704t000000")); 
     8540            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000.")); 
     8541            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000.A")); 
     8542            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000.Z")); 
     8543            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000.00000000")); 
     8544            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000.00000000")); 
     8545            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000+")); 
     8546            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000-")); 
     8547            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000:")); 
     8548            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000-:")); 
     8549            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000+:")); 
     8550            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000-1:")); 
     8551            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000+1:")); 
     8552            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000+1:0")); 
     8553            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000-24.00")); 
     8554            assertThrown!DateTimeException(SysTime.fromISOString("20100704T000000+24.00")); 
     8555 
     8556            assertThrown!DateTimeException(SysTime.fromISOString("2010-07-0400:00:00")); 
     8557            assertThrown!DateTimeException(SysTime.fromISOString("2010-07-04 00:00:00")); 
     8558            assertThrown!DateTimeException(SysTime.fromISOString("2010-07-04t00:00:00")); 
     8559            assertThrown!DateTimeException(SysTime.fromISOString("2010-07-04T00:00:00.")); 
     8560 
     8561            assertThrown!DateTimeException(SysTime.fromISOString("2010-Jul-0400:00:00")); 
     8562            assertThrown!DateTimeException(SysTime.fromISOString("2010-Jul-04 00:00:00")); 
     8563            assertThrown!DateTimeException(SysTime.fromISOString("2010-Jul-04t00:00:00")); 
     8564            assertThrown!DateTimeException(SysTime.fromISOString("2010-Jul-04T00:00:00")); 
     8565            assertThrown!DateTimeException(SysTime.fromISOString("2010-Jul-04 00:00:00.")); 
     8566 
     8567            assertThrown!DateTimeException(SysTime.fromISOString("2010-12-22T172201")); 
     8568            assertThrown!DateTimeException(SysTime.fromISOString("2010-Dec-22 17:22:01")); 
     8569 
     8570            assertPred!"=="(SysTime.fromISOString("20101222T172201"), SysTime(DateTime(2010, 12, 22, 17, 22, 01))); 
     8571            assertPred!"=="(SysTime.fromISOString("19990706T123033"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8572            assertPred!"=="(SysTime.fromISOString("-19990706T123033"), SysTime(DateTime(-1999, 7, 6, 12, 30, 33))); 
     8573            assertPred!"=="(SysTime.fromISOString("+019990706T123033"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8574            assertPred!"=="(SysTime.fromISOString("19990706T123033 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8575            assertPred!"=="(SysTime.fromISOString(" 19990706T123033"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8576            assertPred!"=="(SysTime.fromISOString(" 19990706T123033 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8577 
     8578            assertPred!"=="(SysTime.fromISOString("19070707T121212.0"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8579            assertPred!"=="(SysTime.fromISOString("19070707T121212.0000000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8580            assertPred!"=="(SysTime.fromISOString("19070707T121212.0000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"hnsecs"(1))); 
     8581            assertPred!"=="(SysTime.fromISOString("19070707T121212.000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8582            assertPred!"=="(SysTime.fromISOString("19070707T121212.0000010"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8583            assertPred!"=="(SysTime.fromISOString("19070707T121212.001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8584            assertPred!"=="(SysTime.fromISOString("19070707T121212.0010000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8585 
     8586            assertPred!"=="(SysTime.fromISOString("20101222T172201Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); 
     8587            assertPred!"=="(SysTime.fromISOString("20101222T172201-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8588            assertPred!"=="(SysTime.fromISOString("20101222T172201-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8589            assertPred!"=="(SysTime.fromISOString("20101222T172201-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-90))); 
     8590            assertPred!"=="(SysTime.fromISOString("20101222T172201-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-480))); 
     8591            assertPred!"=="(SysTime.fromISOString("20101222T172201+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8592            assertPred!"=="(SysTime.fromISOString("20101222T172201+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8593            assertPred!"=="(SysTime.fromISOString("20101222T172201+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(90))); 
     8594            assertPred!"=="(SysTime.fromISOString("20101222T172201+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(480))); 
     8595 
     8596            assertPred!"=="(SysTime.fromISOString("20101103T065106.57159Z"), SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); 
     8597 
     8598            assertPred!"=="(SysTime.fromISOString("20101222T172201.23412Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); 
     8599            assertPred!"=="(SysTime.fromISOString("20101222T172201.23112-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), new SimpleTimeZone(-60))); 
     8600            assertPred!"=="(SysTime.fromISOString("20101222T172201.45-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(-60))); 
     8601            assertPred!"=="(SysTime.fromISOString("20101222T172201.1-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), new SimpleTimeZone(-90))); 
     8602            assertPred!"=="(SysTime.fromISOString("20101222T172201.55-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), new SimpleTimeZone(-480))); 
     8603            assertPred!"=="(SysTime.fromISOString("20101222T172201.1234567+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), new SimpleTimeZone(60))); 
     8604            assertPred!"=="(SysTime.fromISOString("20101222T172201.0+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(60))); 
     8605            assertPred!"=="(SysTime.fromISOString("20101222T172201.0000000+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(90))); 
     8606            assertPred!"=="(SysTime.fromISOString("20101222T172201.45+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(480))); 
     8607 
     8608            //Verify Examples. 
     8609            assert(SysTime.fromISOString("20100704T070612") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8610            assert(SysTime.fromISOString("19981225T021500.007") == SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     8611            assert(SysTime.fromISOString("00000105T230959.00002") == SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     8612            assert(SysTime.fromISOString("-00040105T000002") == SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     8613            assert(SysTime.fromISOString(" 20100704T070612 ") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8614 
     8615            assert(SysTime.fromISOString("20100704T070612Z") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     8616            assert(SysTime.fromISOString("20100704T070612-8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     8617            assert(SysTime.fromISOString("20100704T070612+8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(480))); 
     8618        } 
     8619    } 
     8620 
     8621 
     8622    /++ 
     8623        Creates a SysTime from a string with the format YYYY-MM-DDTHH:MM:SS.FFFFFFFTZ 
     8624        (where F is fractional seconds is time zone). Whitespace is stripped from the 
     8625        given string. 
     8626 
     8627        The exact format is exactly as described in toISOExtendedString() except 
     8628        that trailing zeroes are permitted - including having fractional seconds 
     8629        with all zeroes. However, a decimal point with nothing following it is 
     8630        invalid. 
     8631 
     8632        If there is no time zone in the string, then LocalTime is used. If the 
     8633        time zone is "Z", then UTC is used. Otherwise, a SimpleTimeZone which 
     8634        corresponds to the given offset from UTC is used. If you wish the 
     8635        returned SysTime to be a particular time zone, then pass in that time 
     8636        zone and the SysTime to be returned will be converted to that time zone 
     8637        (though it will still be read in as whatever time zone is in its string). 
     8638 
     8639        The accepted formats for time zone offsets are +H, -H, +HH, -HH, +H:MM, 
     8640        -H:MM, +HH:MM, and -HH:MM. 
     8641 
     8642        Params: 
     8643            isoString = A string formatted in the ISO Extended format for dates 
     8644                        and times. 
     8645            tz        = The time zone to convert the given time to (no conversion 
     8646                        occurs if null). 
     8647 
     8648        Throws: 
     8649            DateTimeException if the given string is not in the ISO format or if 
     8650            the resulting SysTime would not be valid. 
     8651 
     8652        Examples: 
     8653-------------------- 
     8654assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12") == 
     8655       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8656assert(SysTime.fromISOExtendedString("1998-12-25T02:15:00.007") == 
     8657       SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     8658assert(SysTime.fromISOExtendedString("0000-01-05T23:09:59.00002") == 
     8659       SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     8660assert(SysTime.fromISOExtendedString("-0004-01-05T00:00:02") == 
     8661       SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     8662assert(SysTime.fromISOExtendedString(" 2010-07-04T07:06:12 ") == 
     8663       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8664 
     8665assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12Z") == 
     8666       SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     8667assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12-8:00") == 
     8668       SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     8669assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12+8:00") == 
     8670       SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(480))); 
     8671-------------------- 
     8672      +/ 
     8673    static SysTime fromISOExtendedString(S)(in S isoExtString, immutable TimeZone tz = null) 
     8674        if(isSomeString!(S)) 
     8675    { 
     8676        auto dstr = to!dstring(strip(isoExtString)); 
     8677 
     8678        auto tIndex = dstr.indexOf("T"); 
     8679        enforce(tIndex != -1, new DateTimeException(format("Invalid ISO Extended String: %s", isoExtString))); 
     8680 
     8681        auto found = dstr[tIndex + 1 .. $].find(".", "Z", "+", "-"); 
     8682        auto dateTimeStr = dstr[0 .. $ - found[0].length]; 
     8683 
     8684        dstring fracSecStr; 
     8685        dstring zoneStr; 
     8686 
     8687        if(found[1] != 0) 
     8688        { 
     8689            if(found[1] == 1) 
     8690            { 
     8691                auto foundTZ = found[0].find("Z", "+", "-"); 
     8692 
     8693                if(foundTZ[1] != 0) 
     8694                { 
     8695                    fracSecStr = found[0][0 .. $ - foundTZ[0].length]; 
     8696                    zoneStr = foundTZ[0]; 
     8697                } 
     8698                else 
     8699                    fracSecStr = found[0]; 
     8700            } 
     8701            else 
     8702                zoneStr = found[0]; 
     8703        } 
     8704 
     8705        try 
     8706        { 
     8707            auto dateTime = DateTime.fromISOExtendedString(dateTimeStr); 
     8708            auto fracSec = fracSecFromISOString(fracSecStr); 
     8709            DTRebindable!(immutable TimeZone) parsedZone; 
     8710 
     8711            if(zoneStr.empty) 
     8712                parsedZone = LocalTime(); 
     8713            else if(zoneStr == "Z") 
     8714                parsedZone = UTC(); 
     8715            else 
     8716                parsedZone = SimpleTimeZone.fromISOString(zoneStr); 
     8717 
     8718            auto retval = SysTime(dateTime, fracSec, parsedZone.get); 
     8719 
     8720            if(tz !is null) 
     8721                retval.timezone = tz; 
     8722 
     8723            return retval; 
     8724        } 
     8725        catch(DateTimeException dte) 
     8726            throw new DateTimeException(format("Invalid ISO Extended String: %s", isoExtString)); 
     8727    } 
     8728 
     8729    unittest 
     8730    { 
     8731        version(testStdDateTime) 
     8732        { 
     8733            assertThrown!DateTimeException(SysTime.fromISOExtendedString("")); 
     8734            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20100704000000")); 
     8735            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20100704 000000")); 
     8736            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20100704t000000")); 
     8737            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20100704T000000.")); 
     8738            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20100704T000000.0")); 
     8739 
     8740            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07:0400:00:00")); 
     8741            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04 00:00:00")); 
     8742            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04 00:00:00")); 
     8743            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04t00:00:00")); 
     8744            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00.")); 
     8745            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00.A")); 
     8746            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00.Z")); 
     8747            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00.00000000")); 
     8748            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00.00000000")); 
     8749            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00+")); 
     8750            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00-")); 
     8751            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00:")); 
     8752            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00-:")); 
     8753            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00+:")); 
     8754            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00-1:")); 
     8755            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00+1:")); 
     8756            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00+1:0")); 
     8757            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00-24.00")); 
     8758            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-07-04T00:00:00+24.00")); 
     8759 
     8760            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-Jul-0400:00:00")); 
     8761            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-Jul-04t00:00:00")); 
     8762            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-Jul-04 00:00:00.")); 
     8763            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-Jul-04 00:00:00.0")); 
     8764 
     8765            assertThrown!DateTimeException(SysTime.fromISOExtendedString("20101222T172201")); 
     8766            assertThrown!DateTimeException(SysTime.fromISOExtendedString("2010-Dec-22 17:22:01")); 
     8767 
     8768            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01"), SysTime(DateTime(2010, 12, 22, 17, 22, 01))); 
     8769            assertPred!"=="(SysTime.fromISOExtendedString("1999-07-06T12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8770            assertPred!"=="(SysTime.fromISOExtendedString("-1999-07-06T12:30:33"), SysTime(DateTime(-1999, 7, 6, 12, 30, 33))); 
     8771            assertPred!"=="(SysTime.fromISOExtendedString("+01999-07-06T12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8772            assertPred!"=="(SysTime.fromISOExtendedString("1999-07-06T12:30:33 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8773            assertPred!"=="(SysTime.fromISOExtendedString(" 1999-07-06T12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8774            assertPred!"=="(SysTime.fromISOExtendedString(" 1999-07-06T12:30:33 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8775 
     8776            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.0"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8777            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.0000000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8778            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.0000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"hnsecs"(1))); 
     8779            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8780            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.0000010"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8781            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8782            assertPred!"=="(SysTime.fromISOExtendedString("1907-07-07T12:12:12.0010000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8783 
     8784            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); 
     8785            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8786            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8787            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-90))); 
     8788            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-480))); 
     8789            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8790            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8791            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(90))); 
     8792            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(480))); 
     8793 
     8794            assertPred!"=="(SysTime.fromISOExtendedString("2010-11-03T06:51:06.57159Z"), SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); 
     8795 
     8796            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.23412Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); 
     8797            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.23112-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), new SimpleTimeZone(-60))); 
     8798            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.45-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(-60))); 
     8799            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.1-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), new SimpleTimeZone(-90))); 
     8800            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.55-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), new SimpleTimeZone(-480))); 
     8801            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.1234567+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), new SimpleTimeZone(60))); 
     8802            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.0+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(60))); 
     8803            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.0000000+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(90))); 
     8804            assertPred!"=="(SysTime.fromISOExtendedString("2010-12-22T17:22:01.45+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(480))); 
     8805 
     8806            //Verify Examples. 
     8807            assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8808            assert(SysTime.fromISOExtendedString("1998-12-25T02:15:00.007") == SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     8809            assert(SysTime.fromISOExtendedString("0000-01-05T23:09:59.00002") == SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     8810            assert(SysTime.fromISOExtendedString("-0004-01-05T00:00:02") == SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     8811            assert(SysTime.fromISOExtendedString(" 2010-07-04T07:06:12 ") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8812 
     8813            assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12Z") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     8814            assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12-8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     8815            assert(SysTime.fromISOExtendedString("2010-07-04T07:06:12+8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(480))); 
     8816        } 
     8817    } 
     8818 
     8819 
     8820    /++ 
     8821        Creates a SysTime from a string with the format YYYY-MM-DD HH:MM:SS.FFFFFFFTZ 
     8822        (where F is fractional seconds is time zone). Whitespace is stripped from the 
     8823        given string. 
     8824 
     8825        The exact format is exactly as described in toSimpleString() except that 
     8826        trailing zeroes are permitted - including having fractional seconds with 
     8827        all zeroes. However, a decimal point with nothing following it is invalid. 
     8828 
     8829        If there is no time zone in the string, then LocalTime is used. If the 
     8830        time zone is "Z", then UTC is used. Otherwise, a SimpleTimeZone which 
     8831        corresponds to the given offset from UTC is used. If you wish the 
     8832        returned SysTime to be a particular time zone, then pass in that time 
     8833        zone and the SysTime to be returned will be converted to that time zone 
     8834        (though it will still be read in as whatever time zone is in its string). 
     8835 
     8836        The accepted formats for time zone offsets are +H, -H, +HH, -HH, +H:MM, 
     8837            -H:MM, +HH:MM, and -HH:MM. 
     8838 
     8839 
     8840        Params: 
     8841            simpleString = A string formatted in the way that toSimpleString() 
     8842                           formats dates and times. 
     8843            tz           = The time zone to convert the given time to (no 
     8844                           conversion occurs if null). 
     8845 
     8846        Throws: 
     8847            DateTimeException if the given string is not in the ISO format or if 
     8848            the resulting SysTime would not be valid. 
     8849 
     8850        Examples: 
     8851-------------------- 
     8852assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12") == 
     8853       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8854assert(SysTime.fromSimpleString("1998-Dec-25 02:15:00.007") == 
     8855       SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     8856assert(SysTime.fromSimpleString("0000-Jan-05 23:09:59.00002") == 
     8857       SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     8858assert(SysTime.fromSimpleString("-0004-Jan-05 00:00:02") == 
     8859       SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     8860assert(SysTime.fromSimpleString(" 2010-Jul-04 07:06:12 ") == 
     8861       SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     8862 
     8863assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12Z") == 
     8864       SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     8865assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12-8:00") == 
     8866       SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     8867assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12+8:00") == 
     8868       SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(480))); 
     8869-------------------- 
     8870      +/ 
     8871    static SysTime fromSimpleString(S)(in S simpleString, immutable TimeZone tz = null) 
     8872        if(isSomeString!(S)) 
     8873    { 
     8874        auto dstr = to!dstring(strip(simpleString)); 
     8875 
     8876        auto spaceIndex = dstr.indexOf(" "); 
     8877        enforce(spaceIndex != -1, new DateTimeException(format("Invalid Simple String: %s", simpleString))); 
     8878 
     8879        auto found = dstr[spaceIndex + 1 .. $].find(".", "Z", "+", "-"); 
     8880        auto dateTimeStr = dstr[0 .. $ - found[0].length]; 
     8881 
     8882        dstring fracSecStr; 
     8883        dstring zoneStr; 
     8884 
     8885        if(found[1] != 0) 
     8886        { 
     8887            if(found[1] == 1) 
     8888            { 
     8889                auto foundTZ = found[0].find("Z", "+", "-"); 
     8890 
     8891                if(foundTZ[1] != 0) 
     8892                { 
     8893                    fracSecStr = found[0][0 .. $ - foundTZ[0].length]; 
     8894                    zoneStr = foundTZ[0]; 
     8895                } 
     8896                else 
     8897                    fracSecStr = found[0]; 
     8898            } 
     8899            else 
     8900                zoneStr = found[0]; 
     8901        } 
     8902 
     8903        try 
     8904        { 
     8905            auto dateTime = DateTime.fromSimpleString(dateTimeStr); 
     8906            auto fracSec = fracSecFromISOString(fracSecStr); 
     8907            DTRebindable!(immutable TimeZone) parsedZone; 
     8908 
     8909            if(zoneStr.empty) 
     8910                parsedZone = LocalTime(); 
     8911            else if(zoneStr == "Z") 
     8912                parsedZone = UTC(); 
     8913            else 
     8914                parsedZone = SimpleTimeZone.fromISOString(zoneStr); 
     8915 
     8916            auto retval = SysTime(dateTime, fracSec, parsedZone.get); 
     8917 
     8918            if(tz !is null) 
     8919                retval.timezone = tz; 
     8920 
     8921            return retval; 
     8922        } 
     8923        catch(DateTimeException dte) 
     8924            throw new DateTimeException(format("Invalid Simple String: %s", simpleString)); 
     8925    } 
     8926 
     8927    unittest 
     8928    { 
     8929        version(testStdDateTime) 
     8930        { 
     8931            assertThrown!DateTimeException(SysTime.fromSimpleString("")); 
     8932            assertThrown!DateTimeException(SysTime.fromSimpleString("20100704000000")); 
     8933            assertThrown!DateTimeException(SysTime.fromSimpleString("20100704 000000")); 
     8934            assertThrown!DateTimeException(SysTime.fromSimpleString("20100704t000000")); 
     8935            assertThrown!DateTimeException(SysTime.fromSimpleString("20100704T000000.")); 
     8936            assertThrown!DateTimeException(SysTime.fromSimpleString("20100704T000000.0")); 
     8937 
     8938            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-07-0400:00:00")); 
     8939            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-07-04 00:00:00")); 
     8940            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-07-04t00:00:00")); 
     8941            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-07-04T00:00:00.")); 
     8942            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-07-04T00:00:00.0")); 
     8943 
     8944            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-0400:00:00")); 
     8945            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04t00:00:00")); 
     8946            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04T00:00:00")); 
     8947            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00.")); 
     8948            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00.A")); 
     8949            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00.Z")); 
     8950            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00.00000000")); 
     8951            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00.00000000")); 
     8952            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00+")); 
     8953            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00-")); 
     8954            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00:")); 
     8955            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00-:")); 
     8956            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00+:")); 
     8957            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00-1:")); 
     8958            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00+1:")); 
     8959            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00+1:0")); 
     8960            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00-24.00")); 
     8961            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-Jul-04 00:00:00+24.00")); 
     8962 
     8963            assertThrown!DateTimeException(SysTime.fromSimpleString("20101222T172201")); 
     8964            assertThrown!DateTimeException(SysTime.fromSimpleString("2010-12-22T172201")); 
     8965 
     8966            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01"), SysTime(DateTime(2010, 12, 22, 17, 22, 01))); 
     8967            assertPred!"=="(SysTime.fromSimpleString("1999-Jul-06 12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8968            assertPred!"=="(SysTime.fromSimpleString("-1999-Jul-06 12:30:33"), SysTime(DateTime(-1999, 7, 6, 12, 30, 33))); 
     8969            assertPred!"=="(SysTime.fromSimpleString("+01999-Jul-06 12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8970            assertPred!"=="(SysTime.fromSimpleString("1999-Jul-06 12:30:33 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8971            assertPred!"=="(SysTime.fromSimpleString(" 1999-Jul-06 12:30:33"), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8972            assertPred!"=="(SysTime.fromSimpleString(" 1999-Jul-06 12:30:33 "), SysTime(DateTime(1999, 7, 6, 12, 30, 33))); 
     8973 
     8974            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.0"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8975            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.0000000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12))); 
     8976            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.0000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"hnsecs"(1))); 
     8977            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.000001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8978            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.0000010"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"usecs"(1))); 
     8979            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.001"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8980            assertPred!"=="(SysTime.fromSimpleString("1907-Jul-07 12:12:12.0010000"), SysTime(DateTime(1907, 07, 07, 12, 12, 12), FracSec.from!"msecs"(1))); 
     8981 
     8982            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), UTC())); 
     8983            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8984            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-60))); 
     8985            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-90))); 
     8986            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(-480))); 
     8987            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8988            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(60))); 
     8989            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(90))); 
     8990            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), new SimpleTimeZone(480))); 
     8991 
     8992            assertPred!"=="(SysTime.fromSimpleString("2010-Nov-03 06:51:06.57159Z"), SysTime(DateTime(2010, 11, 3, 6, 51, 6), FracSec.from!"hnsecs"(5715900), UTC())); 
     8993 
     8994            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.23412Z"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_341_200), UTC())); 
     8995            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.23112-1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(2_311_200), new SimpleTimeZone(-60))); 
     8996            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.45-1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(-60))); 
     8997            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.1-1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_000_000), new SimpleTimeZone(-90))); 
     8998            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.55-8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(5_500_000), new SimpleTimeZone(-480))); 
     8999            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.1234567+1:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(1_234_567), new SimpleTimeZone(60))); 
     9000            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.0+1"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(60))); 
     9001            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.0000000+1:30"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(0), new SimpleTimeZone(90))); 
     9002            assertPred!"=="(SysTime.fromSimpleString("2010-Dec-22 17:22:01.45+8:00"), SysTime(DateTime(2010, 12, 22, 17, 22, 01), FracSec.from!"hnsecs"(4_500_000), new SimpleTimeZone(480))); 
     9003 
     9004            //Verify Examples. 
     9005            assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     9006            assert(SysTime.fromSimpleString("1998-Dec-25 02:15:00.007") == SysTime(DateTime(1998, 12, 25, 2, 15, 0), FracSec.from!"msecs"(7))); 
     9007            assert(SysTime.fromSimpleString("0000-Jan-05 23:09:59.00002") == SysTime(DateTime(0, 1, 5, 23, 9, 59), FracSec.from!"usecs"(20))); 
     9008            assert(SysTime.fromSimpleString("-0004-Jan-05 00:00:02") == SysTime(DateTime(-4, 1, 5, 0, 0, 2))); 
     9009            assert(SysTime.fromSimpleString(" 2010-Jul-04 07:06:12 ") == SysTime(DateTime(2010, 7, 4, 7, 6, 12))); 
     9010 
     9011            assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12Z") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), UTC())); 
     9012            assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12-8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(-480))); 
     9013            assert(SysTime.fromSimpleString("2010-Jul-04 07:06:12+8:00") == SysTime(DateTime(2010, 7, 4, 7, 6, 12), new SimpleTimeZone(480))); 
     9014        } 
     9015    } 
     9016 
     9017 
     9018    //TODO Add function which takes a user-specified time format and produces a SysTime 
     9019 
     9020    //TODO Add function which takes pretty much any time-string and produces a SysTime. 
     9021    //     Obviously, it will be less efficient, and it probably won't manage _every_ 
     9022    //     possible date format, but a smart conversion function would be nice. 
     9023 
     9024 
     9025    /++ 
     9026        Returns the SysTime farthest in the past which is representable by SysTime. 
     9027 
     9028        The SysTime which is returned is in UTC. 
     9029      +/ 
     9030    @property static SysTime min() pure nothrow 
     9031    { 
     9032        return SysTime(long.min, UTC()); 
     9033    } 
     9034 
     9035    unittest 
     9036    { 
     9037        version(testStdDateTime) 
     9038        { 
     9039            assert(SysTime.min.year < 0); 
     9040            assert(SysTime.min < SysTime.max); 
     9041        } 
     9042    } 
     9043 
     9044 
     9045    /++ 
     9046        Returns the SysTime farthest in the future which is representable by SysTime. 
     9047 
     9048        The SysTime which is returned is in UTC. 
     9049      +/ 
     9050    @property static SysTime max() pure nothrow 
     9051    { 
     9052        return SysTime(long.max, UTC()); 
     9053    } 
     9054 
     9055    unittest 
     9056    { 
     9057        version(testStdDateTime) 
     9058        { 
     9059            assert(SysTime.max.year > 0); 
     9060            assert(SysTime.max > SysTime.min); 
     9061        } 
     9062    } 
     9063 
     9064 
     9065private: 
     9066 
     9067    /++ 
     9068        Returns stdTime converted to SysTime's time zone. 
     9069      +/ 
     9070    @property long adjTime() const nothrow 
     9071    { 
     9072        return _timezone.utcToTZ(_stdTime); 
     9073    } 
     9074 
     9075 
     9076    /++ 
     9077        Converts the given hnsecs from SysTime's time zone to std time. 
     9078      +/ 
     9079    @property void adjTime(long adjTime) nothrow 
     9080    { 
     9081        _stdTime = _timezone.tzToUTC(adjTime); 
     9082    } 
     9083 
     9084 
     9085    //Commented out due to bug http://d.puremagic.com/issues/show_bug.cgi?id=5058 
     9086    /+ 
     9087    invariant() 
     9088    { 
     9089        assert(_timezone.get !is null, "Invariant Failure: timezone is null. Were you foolish enough to use SysTime.init? (since timezone for SysTime.init can't be set at compile time)."); 
     9090    } 
     9091    +/ 
     9092 
     9093 
     9094    long  _stdTime; 
     9095    DTRebindable!(immutable TimeZone) _timezone; 
     9096} 
     9097 
    3109098 
    3119099/++ 
     
    420012988 
    420112989        See_Also: 
    4202             <a href="http://en.wikipedia.org/wiki/ISO_week_date">ISO Week Date</a> 
     12990            $(WEB en.wikipedia.org/wiki/ISO_week_date, ISO Week Date) 
    420312991      +/ 
    420412992    @property ubyte isoWeek() const pure nothrow 
     
    909017878 
    909117879        See_Also: 
    9092             <a href="http://en.wikipedia.org/wiki/ISO_week_date">ISO Week Date</a> 
     17880            $(WEB en.wikipedia.org/wiki/ISO_week_date, ISO Week Date) 
    909317881      +/ 
    909417882    @property ubyte isoWeek() const pure nothrow 
     
    1005318841    Date      _date; 
    1005418842    TimeOfDay _tod; 
    10055 } 
    10056  
    10057  
    10058  
    10059 /++ 
    10060     SysTime is the type used when you want to get the current time from the system 
    10061     or if you're doing anything that involves time zones. Unlike DateTime, time 
    10062     zone is an integral part of SysTime (though if all you care about is local 
    10063     time, you can pretty much ignore time zones, and it will work, since it 
    10064     defaults to using the local time zone). It holds its internal time in std time 
    10065     (hnsecs since midnight, January 1st, 1 A.D. UTC), so it interfaces well with the 
    10066     system time. However, that means that, unlike DateTime, it is not optimized 
    10067     for calendar operations, and getting individual units from it such as years 
    10068     or days is going to involve conversions and be less efficient. 
    10069  
    10070     Basically, if you care about calendar operations and don't necessarily care 
    10071     about time zones, then DateTime would be the type to use. However, if what 
    10072     you care about is the system time, then SysTime is the type to use. 
    10073  
    10074     $(D Clock.currTime()) will return the current time as a SysTime. If you want 
    10075     to convert a SysTime to a Date or DateTime, simply cast it. And if you ever 
    10076     want to convert a Date or DateTime to a SysTime, use SysTime's constructor, 
    10077     and you can pass in the intended time zone with it (or don't pass in a 
    10078     TimeZone, and the local time zone will be used). 
    10079  
    10080     If you care about using time zones other than local time or UTC, you can use 
    10081     PosixTimeZone on Posix systems (or on Windows, if you provide the TZ Database 
    10082     files), and you can use WindowsTimeZone on Windows systems. The time in SysTime 
    10083     is kept internally in hnsecs from midnight, January 1st, 1 A.D. UTC. So, you 
    10084     never get conversion errors when changing the time zone of a SysTime (since, 
    10085     if the hnecs were kept in local time, DST would cause problems with conversions). 
    10086     LocalTime is the TimeZone class which represents the local time, and UTC is the 
    10087     TimeZone class which represents UTC. SysTime uses LocalTime if no TimeZone is 
    10088     provided. For more details on time zones, look at the documentation for 
    10089     TimeZone, PosixTimeZone, and WindowsTimeZone. 
    10090  
    10091     SysTime's range is from approximately 29,000 B.C. to 29,000 A.D. 
    10092   +/ 
    10093 struct SysTime 
    10094 { 
    10095 public: 
    10096  
    10097     /++ 
    10098         Params: 
    10099             dateTime = The DateTime to use to set this SysTime's internal std 
    10100                        time. As DateTime has no concept of time zone, tz is used 
    10101                        as its time zone. 
    10102             tz       = The TimeZone to use for this SysTime. If null, LocalTime 
    10103                        will be used. The given DateTime is assumed to be in the 
    10104                        given time zone. 
    10105       +/ 
    10106     this(in DateTime dateTime, immutable TimeZone tz = null) nothrow 
    10107     { 
    10108         try 
    10109             this(dateTime, FracSec.from!"hnsecs"(0), tz); 
    10110         catch(Exception e) 
    10111             assert(0, "FracSec's constructor threw when it shouldn't have."); 
    10112     } 
    10113  
    10114     unittest 
    10115     { 
    10116         version(testStdDateTime) 
    10117         { 
    10118             assertPred!"=="(SysTime(DateTime.init, UTC())._stdTime, 0); 
    10119             assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 30, 33), UTC())._stdTime, 450_330_000_000L); 
    10120             assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 30, 33), UTC())._stdTime, -413_670_000_000L); 
    10121             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), UTC())._stdTime, 0); 
    10122             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 1), UTC())._stdTime, 10_000_000L); 
    10123             assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), UTC())._stdTime, -10_000_000L); 
    10124  
    10125             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(-60)).stdTime, 36_000_000_000L); 
    10126             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(0)).stdTime, 0); 
    10127             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), new SimpleTimeZone(60)).stdTime, -36_000_000_000L); 
    10128         } 
    10129     } 
    10130  
    10131  
    10132     /++ 
    10133         Params: 
    10134             dateTime = The DateTime to use to set this SysTime's internal std time. 
    10135                        As DateTime has no concept of time zone, tz is used as its 
    10136                        time zone. 
    10137             fsec     = The fractional seconds portion of the time. 
    10138             tz       = The TimeZone to use for this SysTime. If null, LocalTime will 
    10139                        be used. The given DateTime is assumed to be in the given 
    10140                        time zone. 
    10141       +/ 
    10142     this(in DateTime dateTime, in FracSec fsec, immutable TimeZone tz = null) nothrow 
    10143     { 
    10144         if(tz is null) 
    10145             _timezone = LocalTime(); 
    10146         else 
    10147             _timezone = tz; 
    10148  
    10149         try 
    10150         { 
    10151             immutable dateDiff = (dateTime.date - Date(1, 1, 1)).total!"hnsecs"; 
    10152             immutable todDiff = (dateTime.timeOfDay - TimeOfDay(0, 0, 0)).total!"hnsecs"; 
    10153  
    10154             immutable adjustedTime = dateDiff + todDiff + fsec.hnsecs; 
    10155             immutable standardTime = _timezone.tzToUTC(adjustedTime); 
    10156  
    10157             this(standardTime, _timezone.get); 
    10158         } 
    10159         catch(Exception e) 
    10160             assert(0, "Date, TimeOfDay, or DateTime's constructor threw when it shouldn't have."); 
    10161     } 
    10162  
    10163     unittest 
    10164     { 
    10165         version(testStdDateTime) 
    10166         { 
    10167             assertPred!"=="(SysTime(DateTime.init, FracSec.init, UTC())._stdTime, 0); 
    10168             assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 30, 33), FracSec.init, UTC())._stdTime, 450_330_000_000L); 
    10169             assertPred!"=="(SysTime(DateTime(0, 12, 31, 12, 30, 33), FracSec.init, UTC())._stdTime, -413_670_000_000L); 
    10170             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"msecs"(1), UTC())._stdTime, 10_000L); 
    10171             assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC())._stdTime, -10_000L); 
    10172  
    10173             assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).stdTime, -1); 
    10174             assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1), UTC()).stdTime, -9_999_999); 
    10175             assertPred!"=="(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0), UTC()).stdTime, -10_000_000); 
    10176         } 
    10177     } 
    10178  
    10179  
    10180     /++ 
    10181         Params: 
    10182             date = The Date to use to set this SysTime's internal std time. 
    10183                    As Date has no concept of time zone, tz is used as its 
    10184                    time zone. 
    10185             tz   = The TimeZone to use for this SysTime. If null, LocalTime will 
    10186                    be used. The given Date is assumed to be in the given time zone. 
    10187       +/ 
    10188     this(in Date date, immutable TimeZone tz = null) nothrow 
    10189     { 
    10190         if(tz is null) 
    10191             _timezone = LocalTime(); 
    10192         else 
    10193             _timezone = tz; 
    10194  
    10195         try 
    10196         { 
    10197             immutable adjustedTime = (date - Date(1, 1, 1)).total!"hnsecs"; 
    10198             immutable standardTime = _timezone.tzToUTC(adjustedTime); 
    10199  
    10200             this(standardTime, _timezone.get); 
    10201         } 
    10202         catch(Exception e) 
    10203             assert(0, "Date's constructor through when it shouldn't have"); 
    10204     } 
    10205  
    10206     unittest 
    10207     { 
    10208         version(testStdDateTime) 
    10209         { 
    10210             assertPred!"=="(SysTime(Date.init, UTC())._stdTime, 0); 
    10211             assertPred!"=="(SysTime(Date(1, 1, 1), UTC())._stdTime, 0); 
    10212             assertPred!"=="(SysTime(Date(1, 1, 2), UTC())._stdTime, 864000000000); 
    10213             assertPred!"=="(SysTime(Date(0, 12, 31), UTC())._stdTime, -864000000000); 
    10214         } 
    10215     } 
    10216  
    10217  
    10218     /++ 
    10219         Note: 
    10220             Whereas the other constructors take in the given date/time, assume 
    10221             that it's in the given time zone, and convert it to hnsecs in UTC 
    10222             since midnight, January 1st, 1 A.D. UTC - i.e. std time - this constructor 
    10223             takes a std time, which is specifically already in UTC, so no conversion 
    10224             takes place. Of course, the various getter properties and functions 
    10225             will use the given time zone's conversion function to convert the 
    10226             results to that time zone, but no conversion of the arguments to 
    10227             this constructor takes place. 
    10228  
    10229         Params: 
    10230             stdTime = The number of hnsecs since midnight, January 1st, 1 A.D. UTC. 
    10231             tz    = The TimeZone to use for this SysTime. If null, LocalTime will be used. 
    10232       +/ 
    10233     this(long stdTime, immutable TimeZone tz = null) pure nothrow 
    10234     { 
    10235         _stdTime = stdTime; 
    10236  
    10237         if(tz is null) 
    10238             _timezone = LocalTime(); 
    10239         else 
    10240             _timezone = tz; 
    10241     } 
    10242  
    10243     unittest 
    10244     { 
    10245         version(testStdDateTime) 
    10246         { 
    10247             assertPred!"=="(SysTime(0)._stdTime, 0); 
    10248         } 
    10249     } 
    10250  
    10251  
    10252     /++ 
    10253         Params: 
    10254             rhs = The SysTime to assign to this one. 
    10255       +/ 
    10256     ref SysTime opAssign(const ref SysTime rhs) pure nothrow 
    10257     { 
    10258         _stdTime = rhs._stdTime; 
    10259         _timezone = rhs._timezone.get; 
    10260  
    10261         return this; 
    10262     } 
    10263  
    10264  
    10265     /++ 
    10266         Params: 
    10267             rhs = The SysTime to assign to this one. 
    10268       +/ 
    10269     ref SysTime opAssign(SysTime rhs) pure nothrow 
    10270     { 
    10271         _stdTime = rhs._stdTime; 
    10272         _timezone = rhs._timezone.get; 
    10273  
    10274         return this; 
    10275     } 
    10276  
    10277  
    10278     /++ 
    10279         Checks for equality between this SysTime and the given 
    10280         SysTime. 
    10281  
    10282         Note that the time zone is ignored. Only the internal 
    10283         std times (which are in UTC) are compared. 
    10284      +/ 
    10285     bool opEquals(const ref SysTime rhs) const pure nothrow 
    10286     { 
    10287         return _stdTime == rhs._stdTime; 
    10288     } 
    10289  
    10290     unittest 
    10291     { 
    10292         version(testStdDateTime) 
    10293         { 
    10294             auto a = SysTime(DateTime.init, UTC()); 
    10295             auto b = SysTime(0, UTC()); 
    10296             assert(a == b); 
    10297             assertPred!"=="(a, b); 
    10298             assertPred!"=="(SysTime(DateTime.init, UTC()), SysTime(0, UTC())); 
    10299             assertPred!"=="(SysTime(Date.init, UTC()), SysTime(0, UTC())); 
    10300             assertPred!"=="(SysTime(0), SysTime(0)); 
    10301  
    10302             assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
    10303             assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
    10304             assertPred!"=="(SysTime(Date(1, 7, 1)), SysTime(Date(1, 7, 1))); 
    10305             assertPred!"=="(SysTime(Date(1, 1, 6)), SysTime(Date(1, 1, 6))); 
    10306  
    10307             assertPred!"=="(SysTime(Date(1999, 7, 1)), SysTime(Date(1999, 7, 1))); 
    10308             assertPred!"=="(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 6))); 
    10309  
    10310             assertPred!"=="(SysTime(Date(1, 7, 6)), SysTime(Date(1, 7, 6))); 
    10311  
    10312             assertPred!"=="(SysTime(DateTime(1999, 1, 1, 0, 0, 0)), SysTime(Date(1999, 1, 1))); 
    10313             assertPred!"=="(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 0, 0, 0))); 
    10314  
    10315             assertPred!"!="(SysTime(DateTime(1999, 1, 1, 11, 30, 20)), SysTime(Date(1999, 1, 1))); 
    10316             assertPred!"!="(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 11, 30, 20))); 
    10317  
    10318             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))), 
    10319                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)))); 
    10320             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0))), 
    10321                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0)))); 
    10322             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0))), 
    10323                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0)))); 
    10324             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
    10325                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
    10326  
    10327             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0))), 
    10328                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0)))); 
    10329             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10330                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10331  
    10332             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33))), 
    10333                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33)))); 
    10334             assertPred!"=="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
    10335                         SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
    10336  
    10337             { 
    10338                 auto sysUTC = SysTime(Date(1999, 1, 1)); 
    10339                 sysUTC.timezone = UTC(); 
    10340  
    10341                 auto sysLocal = SysTime(Date(1999, 1, 1)); 
    10342                 sysUTC.timezone = LocalTime(); 
    10343  
    10344                 assertPred!"=="(sysUTC, sysLocal); 
    10345                 assertPred!"=="(sysLocal, sysUTC); 
    10346  
    10347                 if(!localTimeIsUTC) 
    10348                 { 
    10349                     assertPred!"!="(SysTime(Date(1999, 1, 1), UTC()), SysTime(Date(1999, 1, 1), LocalTime())); 
    10350                     assertPred!"!="(SysTime(Date(1999, 7, 1), LocalTime()), SysTime(Date(1999, 7, 1), UTC())); 
    10351                 } 
    10352             } 
    10353  
    10354             { 
    10355                 auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
    10356                 sysUTC.timezone = UTC(); 
    10357  
    10358                 auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
    10359                 sysSimple.timezone = new SimpleTimeZone(-360); 
    10360  
    10361                 assertPred!"=="(sysUTC, sysSimple); 
    10362                 assertPred!"=="(sysSimple, sysUTC); 
    10363  
    10364                 assertPred!"!="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()), 
    10365                                SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone)); 
    10366                 assertPred!"!="(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone), 
    10367                                SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC())); 
    10368             } 
    10369  
    10370             { 
    10371                 auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()); 
    10372                 auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), new SimpleTimeZone(240)); 
    10373  
    10374                 assertPred!"!="(sysUTC, sysSimple); 
    10375                 assertPred!"!="(sysSimple, sysUTC); 
    10376  
    10377                 sysUTC = SysTime(DateTime(Date(1999, 7, 5), TimeOfDay(20, 0, 0)), UTC()); 
    10378  
    10379                 assertPred!"=="(sysUTC, sysSimple); 
    10380                 assertPred!"=="(sysSimple, sysUTC); 
    10381             } 
    10382  
    10383             auto st = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10384             const cst = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10385             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10386             static assert(__traits(compiles, st == st)); 
    10387             static assert(__traits(compiles, st == cst)); 
    10388             //static assert(__traits(compiles, st == ist)); 
    10389             static assert(__traits(compiles, cst == st)); 
    10390             static assert(__traits(compiles, cst == cst)); 
    10391             //static assert(__traits(compiles, cst == ist)); 
    10392             //static assert(__traits(compiles, ist == st)); 
    10393             //static assert(__traits(compiles, ist == cst)); 
    10394             //static assert(__traits(compiles, ist == ist)); 
    10395         } 
    10396     } 
    10397  
    10398  
    10399     /++ 
    10400         Compares this SysTime with the given SysTime. 
    10401  
    10402         Time zone is irrelevant to comparing SysTimes. 
    10403  
    10404         Returns: 
    10405             $(TABLE 
    10406             $(TR $(TD this &lt; rhs) $(TD &lt; 0)) 
    10407             $(TR $(TD this == rhs) $(TD 0)) 
    10408             $(TR $(TD this &gt; rhs) $(TD &gt; 0)) 
    10409             ) 
    10410      +/ 
    10411     int opCmp(in SysTime rhs) const pure nothrow 
    10412     { 
    10413         if(_stdTime < rhs._stdTime) 
    10414             return -1; 
    10415         if(_stdTime > rhs._stdTime) 
    10416             return 1; 
    10417  
    10418         return 0; 
    10419     } 
    10420  
    10421     unittest 
    10422     { 
    10423         version(testStdDateTime) 
    10424         { 
    10425             //Test A.D. 
    10426             assertPred!("opCmp", "==")(SysTime(DateTime.init, UTC()), SysTime(0)); 
    10427             assertPred!("opCmp", "==")(SysTime(Date.init, UTC()), SysTime(0)); 
    10428  
    10429             assertPred!("opCmp", "==")(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
    10430             assertPred!("opCmp", "==")(SysTime(Date(1999, 1, 1)), SysTime(Date(1999, 1, 1))); 
    10431             assertPred!("opCmp", "==")(SysTime(Date(1, 7, 1)), SysTime(Date(1, 7, 1))); 
    10432             assertPred!("opCmp", "==")(SysTime(Date(1, 1, 6)), SysTime(Date(1, 1, 6))); 
    10433  
    10434             assertPred!("opCmp", "==")(SysTime(Date(1999, 7, 1)), SysTime(Date(1999, 7, 1))); 
    10435             assertPred!("opCmp", "==")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 6))); 
    10436  
    10437             assertPred!("opCmp", "==")(SysTime(Date(1, 7, 6)), SysTime(Date(1, 7, 6))); 
    10438  
    10439             assertPred!("opCmp", ">")(SysTime(DateTime(1999, 1, 1, 11, 30, 20)), SysTime(Date(1999, 1, 1))); 
    10440             assertPred!("opCmp", "<")(SysTime(Date(1999, 1, 1)), SysTime(DateTime(1999, 1, 1, 11, 30, 20))); 
    10441  
    10442             assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(2000, 7, 6))); 
    10443             assertPred!("opCmp", ">")(SysTime(Date(2000, 7, 6)), SysTime(Date(1999, 7, 6))); 
    10444             assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 8, 6))); 
    10445             assertPred!("opCmp", ">")(SysTime(Date(1999, 8, 6)), SysTime(Date(1999, 7, 6))); 
    10446             assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 6)), SysTime(Date(1999, 7, 7))); 
    10447             assertPred!("opCmp", ">")(SysTime(Date(1999, 7, 7)), SysTime(Date(1999, 7, 6))); 
    10448  
    10449             assertPred!("opCmp", "<")(SysTime(Date(1999, 8, 7)), SysTime(Date(2000, 7, 6))); 
    10450             assertPred!("opCmp", ">")(SysTime(Date(2000, 8, 6)), SysTime(Date(1999, 7, 7))); 
    10451             assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 7)), SysTime(Date(2000, 7, 6))); 
    10452             assertPred!("opCmp", ">")(SysTime(Date(2000, 7, 6)), SysTime(Date(1999, 7, 7))); 
    10453             assertPred!("opCmp", "<")(SysTime(Date(1999, 7, 7)), SysTime(Date(1999, 8, 6))); 
    10454             assertPred!("opCmp", ">")(SysTime(Date(1999, 8, 6)), SysTime(Date(1999, 7, 7))); 
    10455  
    10456             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))), 
    10457                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)))); 
    10458             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0))), 
    10459                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 0, 0)))); 
    10460             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0))), 
    10461                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 0)))), 
    10462             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
    10463                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
    10464  
    10465             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0))), 
    10466                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 0)))); 
    10467             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10468                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10469  
    10470             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33))), 
    10471                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 30, 33)))); 
    10472             assertPred!("opCmp", "==")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33))), 
    10473                                        SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 33)))); 
    10474  
    10475             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10476                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10477             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10478                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10479             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10480                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
    10481             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10482                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10483             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10484                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10485             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10486                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10487  
    10488             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10489                                      SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10490             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10491                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10492             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10493                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
    10494             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10495                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10496  
    10497             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10498                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10499             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10500                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
    10501  
    10502             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10503                                       SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10504             assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
    10505                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10506             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10507                                       SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10508             assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
    10509                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
    10510             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10511                                       SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10512             assertPred!("opCmp", ">")(SysTime(DateTime(Date(2000, 7, 6), TimeOfDay(12, 30, 33))), 
    10513                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10514  
    10515             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10516                                       SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10517             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10518                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10519             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10520                                       SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10521             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10522                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33)))); 
    10523             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10524                                       SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10525             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10526                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10527  
    10528             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33))), 
    10529                                       SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10530             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10531                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(13, 30, 33)))); 
    10532             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 31, 33))), 
    10533                                       SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 31, 33)))); 
    10534             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10535                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10536             assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34))), 
    10537                                       SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10538             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10539                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 34)))); 
    10540  
    10541             //Test B.C. 
    10542             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 1, 1), TimeOfDay(12, 30, 33))), 
    10543                                        SysTime(DateTime(Date(-1, 1, 1), TimeOfDay(12, 30, 33)))); 
    10544             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 7, 1), TimeOfDay(12, 30, 33))), 
    10545                                        SysTime(DateTime(Date(-1, 7, 1), TimeOfDay(12, 30, 33)))); 
    10546             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 1, 6), TimeOfDay(12, 30, 33))), 
    10547                                        SysTime(DateTime(Date(-1, 1, 6), TimeOfDay(12, 30, 33)))); 
    10548  
    10549             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1999, 7, 1), TimeOfDay(12, 30, 33))), 
    10550                                        SysTime(DateTime(Date(-1999, 7, 1), TimeOfDay(12, 30, 33)))); 
    10551             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10552                                        SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10553  
    10554             assertPred!("opCmp", "==")(SysTime(DateTime(Date(-1, 7, 6), TimeOfDay(12, 30, 33))), 
    10555                                        SysTime(DateTime(Date(-1, 7, 6), TimeOfDay(12, 30, 33)))); 
    10556  
    10557             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33))), 
    10558                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10559             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10560                                       SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10561             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10562                                       SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10563             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10564                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10565             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10566                                       SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10567             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10568                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10569  
    10570             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 8, 6), TimeOfDay(12, 30, 33))), 
    10571                                       SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10572             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33))), 
    10573                                       SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10574             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33))), 
    10575                                       SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10576             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10577                                       SysTime(DateTime(Date(-2000, 7, 6), TimeOfDay(12, 30, 33)))); 
    10578             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10579                                       SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10580             assertPred!("opCmp", ">")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10581                                       SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10582  
    10583             //Test Both 
    10584             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10585                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10586             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10587                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10588  
    10589             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10590                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10591             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10592                                       SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33)))); 
    10593  
    10594             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33))), 
    10595                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10596             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10597                                       SysTime(DateTime(Date(-1999, 7, 7), TimeOfDay(12, 30, 33)))); 
    10598  
    10599             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33))), 
    10600                                       SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10601             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(12, 30, 33))), 
    10602                                       SysTime(DateTime(Date(-1999, 8, 7), TimeOfDay(12, 30, 33)))); 
    10603  
    10604             assertPred!("opCmp", "<")(SysTime(DateTime(Date(-1999, 8, 6), TimeOfDay(12, 30, 33))), 
    10605                                       SysTime(DateTime(Date(1999, 6, 6), TimeOfDay(12, 30, 33)))); 
    10606             assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 6, 8), TimeOfDay(12, 30, 33))), 
    10607                                       SysTime(DateTime(Date(-1999, 7, 6), TimeOfDay(12, 30, 33)))); 
    10608  
    10609             { 
    10610                 auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
    10611                 sysUTC.timezone = UTC(); 
    10612  
    10613                 auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0))); 
    10614                 sysSimple.timezone = new SimpleTimeZone(-360); 
    10615  
    10616                 assertPred!("opCmp", "==")(sysUTC, sysSimple); 
    10617                 assertPred!("opCmp", "==")(sysSimple, sysUTC); 
    10618  
    10619                 assertPred!("opCmp", "<")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()), 
    10620                                          SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone)); 
    10621                 assertPred!("opCmp", ">")(SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), sysSimple.timezone), 
    10622                                          SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC())); 
    10623             } 
    10624  
    10625             { 
    10626                 auto sysUTC = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), UTC()); 
    10627                 auto sysSimple = SysTime(DateTime(Date(1999, 7, 6), TimeOfDay(0, 0, 0)), new SimpleTimeZone(240)); 
    10628  
    10629                 assertPred!("opCmp", ">")(sysUTC, sysSimple); 
    10630                 assertPred!("opCmp", "<")(sysSimple, sysUTC); 
    10631  
    10632                 sysUTC = SysTime(DateTime(Date(1999, 7, 5), TimeOfDay(20, 0, 0)), UTC()); 
    10633  
    10634                 assertPred!("opCmp", "==")(sysUTC, sysSimple); 
    10635                 assertPred!("opCmp", "==")(sysSimple, sysUTC); 
    10636             } 
    10637  
    10638             auto st = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10639             const cst = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10640             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 33, 30)); 
    10641             static assert(__traits(compiles, st.opCmp(st))); 
    10642             static assert(__traits(compiles, st.opCmp(cst))); 
    10643             //static assert(__traits(compiles, st.opCmp(ist))); 
    10644             static assert(__traits(compiles, cst.opCmp(st))); 
    10645             static assert(__traits(compiles, cst.opCmp(cst))); 
    10646             //static assert(__traits(compiles, cst.opCmp(ist))); 
    10647             //static assert(__traits(compiles, ist.opCmp(st))); 
    10648             //static assert(__traits(compiles, ist.opCmp(cst))); 
    10649             //static assert(__traits(compiles, ist.opCmp(ist))); 
    10650         } 
    10651     } 
    10652  
    10653  
    10654     /++ 
    10655         Year of the Gregorian Calendar. Positive numbers are A.D. Non-positive 
    10656         are B.C. 
    10657      +/ 
    10658     @property short year() const nothrow 
    10659     { 
    10660         return (cast(Date)this).year; 
    10661     } 
    10662  
    10663     unittest 
    10664     { 
    10665         version(testStdDateTime) 
    10666         { 
    10667             assertPred!"=="(SysTime(0, UTC()).year, 1); 
    10668             assertPred!"=="(SysTime(1, UTC()).year, 1); 
    10669             assertPred!"=="(SysTime(-1, UTC()).year, 0); 
    10670             assertPred!"=="(SysTime(DateTime(12, 1, 1, 0, 0, 0)).year, 12); 
    10671             assertPred!"=="(SysTime(DateTime(-12, 1, 1, 0, 0, 0)).year, -12); 
    10672             assertPred!"=="(SysTime(Date(1999, 7, 6)).year, 1999); 
    10673             assertPred!"=="(SysTime(Date(-1999, 7, 6)).year, -1999); 
    10674  
    10675             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10676             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10677             static assert(__traits(compiles, cst.year)); 
    10678             //static assert(__traits(compiles, ist.year)); 
    10679         } 
    10680     } 
    10681  
    10682  
    10683     /++ 
    10684         Year of the Gregorian Calendar. Positive numbers are A.D. Non-positive 
    10685         are B.C. 
    10686  
    10687         Params: 
    10688             year = The year to set this SysTime's year to. 
    10689  
    10690         Throws: 
    10691             DateTimeException if the new year is not a leap year and the resulting 
    10692             date would be on February 29th. 
    10693  
    10694         Examples: 
    10695 -------------------- 
    10696 assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).year == 1999); 
    10697 assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).year == 2010); 
    10698 assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).year == -7); 
    10699 -------------------- 
    10700      +/ 
    10701     @property void year(int year) 
    10702     { 
    10703         auto hnsecs = adjTime; 
    10704         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    10705  
    10706         if(hnsecs < 0) 
    10707         { 
    10708             hnsecs += convert!("hours", "hnsecs")(24); 
    10709             --days; 
    10710         } 
    10711  
    10712         auto date = Date(cast(int)days); 
    10713         date.year = year; 
    10714  
    10715         immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
    10716  
    10717         adjTime = newDaysHNSecs + hnsecs; 
    10718     } 
    10719  
    10720     unittest 
    10721     { 
    10722         version(testStdDateTime) 
    10723         { 
    10724             static void testST(SysTime st, int year, in SysTime expected, size_t line = __LINE__) 
    10725             { 
    10726                 st.year = year; 
    10727                 assertPred!"=="(st, expected, "", __FILE__, line); 
    10728             } 
    10729  
    10730             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1999, SysTime(Date(1999, 1, 1))); 
    10731             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 0, SysTime(Date(0, 1, 1))); 
    10732             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), -1999, SysTime(Date(-1999, 1, 1))); 
    10733             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10734             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10735             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), -1999, SysTime(DateTime(-1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10736  
    10737             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 1999, SysTime(Date(1999, 1, 1))); 
    10738             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 0, SysTime(Date(0, 1, 1))); 
    10739             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), -1999, SysTime(Date(-1999, 1, 1))); 
    10740             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10741             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10742             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), -1999, SysTime(DateTime(-1999, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10743  
    10744             testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(12, 7, 2))); 
    10745             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(5, 7, 2))); 
    10746             testST(SysTime(Date(0, 7, 2)), 999, SysTime(Date(999, 7, 2))); 
    10747             testST(SysTime(Date(-1202, 7, 2)), 2300, SysTime(Date(2300, 7, 2))); 
    10748  
    10749             testST(SysTime(Date(1, 7, 2)), -12, SysTime(Date(-12, 7, 2))); 
    10750             testST(SysTime(Date(5007, 7, 2)), -5, SysTime(Date(-5, 7, 2))); 
    10751             testST(SysTime(Date(0, 7, 2)), -999, SysTime(Date(-999, 7, 2))); 
    10752             testST(SysTime(Date(-1202, 7, 2)), -2300, SysTime(Date(-2300, 7, 2))); 
    10753  
    10754             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10755             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10756             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10757             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -1, SysTime(DateTime(-1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10758             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10759             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(999, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10760             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(2010, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10761  
    10762             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10763             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10764             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10765             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -507, SysTime(DateTime(-507, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10766             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(2300, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10767             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10768  
    10769             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10770             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(12, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10771             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10772             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -1, SysTime(DateTime(-1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10773             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10774             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(999, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10775             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(2010, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10776  
    10777             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10778             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(5, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10779             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 0, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10780             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), -507, SysTime(DateTime(-507, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10781             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(2300, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10782             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10783  
    10784             testST(SysTime(0, UTC()), 12, SysTime(DateTime(12, 1, 1, 0, 0, 0), UTC())); 
    10785  
    10786             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10787             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10788             static assert(!__traits(compiles, cst.year = 7)); 
    10789             //static assert(!__traits(compiles, ist.year = 7)); 
    10790  
    10791             //Verify Examples. 
    10792             assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).year == 1999); 
    10793             assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).year == 2010); 
    10794             assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).year == -7); 
    10795         } 
    10796     } 
    10797  
    10798  
    10799     /++ 
    10800         Year B.C. of the Gregorian Calendar counting year 0 as 1 B.C. 
    10801  
    10802         Throws: 
    10803             DateTimeException if $(D isAD) is true. 
    10804  
    10805         Examples: 
    10806 -------------------- 
    10807 assert(SysTime(DateTime(0, 1, 1, 12, 30, 33)).yearBC == 1); 
    10808 assert(SysTime(DateTime(-1, 1, 1, 10, 7, 2)).yearBC == 2); 
    10809 assert(SysTime(DateTime(-100, 1, 1, 4, 59, 0)).yearBC == 101); 
    10810 -------------------- 
    10811      +/ 
    10812     @property ushort yearBC() const 
    10813     { 
    10814         return (cast(Date)this).yearBC; 
    10815     } 
    10816  
    10817     unittest 
    10818     { 
    10819         version(testStdDateTime) 
    10820         { 
    10821             assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(Date(1, 1, 1), UTC()))); 
    10822             assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(0, UTC()))); 
    10823             assertThrown!DateTimeException((in SysTime st){st.yearBC;}(SysTime(1, UTC()))); 
    10824  
    10825             assertPred!"=="(SysTime(-1, UTC()).yearBC, 1); 
    10826             assertPred!"=="(SysTime(DateTime(-12, 1, 1, 0, 0, 0)).yearBC, 13); 
    10827  
    10828             auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10829             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10830             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10831             static assert(__traits(compiles, st.year = 12)); 
    10832             static assert(!__traits(compiles, cst.year = 12)); 
    10833             //static assert(!__traits(compiles, ist.year = 12)); 
    10834  
    10835             //Verify Examples. 
    10836             assert(SysTime(DateTime(0, 1, 1, 12, 30, 33)).yearBC == 1); 
    10837             assert(SysTime(DateTime(-1, 1, 1, 10, 7, 2)).yearBC == 2); 
    10838             assert(SysTime(DateTime(-100, 1, 1, 4, 59, 0)).yearBC == 101); 
    10839         } 
    10840     } 
    10841  
    10842  
    10843     /++ 
    10844         Year B.C. of the Gregorian Calendar counting year 0 as 1 B.C. 
    10845  
    10846         Params: 
    10847             year = The year B.C. to set this SysTime's year to. 
    10848  
    10849         Throws: 
    10850             DateTimeException if a non-positive value is given. 
    10851  
    10852         Examples: 
    10853 -------------------- 
    10854 auto st = SysTime(DateTime(2010, 1, 1, 7, 30, 0)); 
    10855 st.yearBC = 1; 
    10856 assert(st == SysTime(DateTime(0, 1, 1, 7, 30, 0))); 
    10857  
    10858 st.yearBC = 10; 
    10859 assert(st == SysTime(DateTime(-9, 1, 1, 7, 30, 0))); 
    10860 -------------------- 
    10861      +/ 
    10862     @property void yearBC(int year) 
    10863     { 
    10864         auto hnsecs = adjTime; 
    10865         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    10866  
    10867         if(hnsecs < 0) 
    10868         { 
    10869             hnsecs += convert!("hours", "hnsecs")(24); 
    10870             --days; 
    10871         } 
    10872  
    10873         auto date = Date(cast(int)days); 
    10874         date.yearBC = year; 
    10875  
    10876         immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
    10877  
    10878         adjTime = newDaysHNSecs + hnsecs; 
    10879     } 
    10880  
    10881     unittest 
    10882     { 
    10883         version(testStdDateTime) 
    10884         { 
    10885             static void testSTInvalid(SysTime st, int year) 
    10886             { 
    10887                 st.yearBC = year; 
    10888             } 
    10889  
    10890             static void testST(SysTime st, int year, in SysTime expected, size_t line = __LINE__) 
    10891             { 
    10892                 st.yearBC = year; 
    10893                 assertPred!"=="(st, expected, "", __FILE__, line); 
    10894             } 
    10895  
    10896             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 0)); 
    10897             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), -1)); 
    10898             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), -1202)); 
    10899  
    10900             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1999, SysTime(Date(-1998, 1, 1))); 
    10901             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1, SysTime(Date(0, 1, 1))); 
    10902             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1999, SysTime(DateTime(-1998, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10903             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    10904  
    10905             testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(-11, 7, 2))); 
    10906             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(-4, 7, 2))); 
    10907             testST(SysTime(Date(0, 7, 2)), 999, SysTime(Date(-998, 7, 2))); 
    10908             testST(SysTime(Date(-1202, 7, 2)), 2300, SysTime(Date(-2299, 7, 2))); 
    10909  
    10910             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10911             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10912             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10913             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(-998, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10914             testST(SysTime(DateTime(1, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(-2009, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10915  
    10916             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10917             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10918             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(-2299, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10919             testST(SysTime(DateTime(5007, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(-5006, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10920  
    10921             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10922             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 12, SysTime(DateTime(-11, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10923             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 1, SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10924             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 999, SysTime(DateTime(-998, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10925             testST(SysTime(DateTime(0, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2010, SysTime(DateTime(-2009, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10926  
    10927             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(0))); 
    10928             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5, SysTime(DateTime(-4, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10929             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 2300, SysTime(DateTime(-2299, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10930             testST(SysTime(DateTime(-1202, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007)), 5007, SysTime(DateTime(-5006, 7, 2, 1, 3, 2), FracSec.from!"hnsecs"(5007))); 
    10931  
    10932             testST(SysTime(0, UTC()), 12, SysTime(DateTime(-11, 1, 1, 0, 0, 0), UTC())); 
    10933  
    10934             { 
    10935                 auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10936                 const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10937                 //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10938                 static assert(__traits(compiles, st.yearBC = 12)); 
    10939                 static assert(!__traits(compiles, cst.yearBC = 12)); 
    10940                 //static assert(!__traits(compiles, ist.yearBC = 12)); 
    10941             } 
    10942  
    10943             //Verify Examples. 
    10944             { 
    10945                 auto st = SysTime(DateTime(2010, 1, 1, 7, 30, 0)); 
    10946                 st.yearBC = 1; 
    10947                 assert(st == SysTime(DateTime(0, 1, 1, 7, 30, 0))); 
    10948  
    10949                 st.yearBC = 10; 
    10950                 assert(st == SysTime(DateTime(-9, 1, 1, 7, 30, 0))); 
    10951             } 
    10952         } 
    10953     } 
    10954  
    10955  
    10956     /++ 
    10957         Month of a Gregorian Year. 
    10958  
    10959         Examples: 
    10960 -------------------- 
    10961 assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).month == 7); 
    10962 assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).month == 10); 
    10963 assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).month == 4); 
    10964 -------------------- 
    10965      +/ 
    10966     @property Month month() const nothrow 
    10967     { 
    10968         return (cast(Date)this).month; 
    10969     } 
    10970  
    10971     unittest 
    10972     { 
    10973         version(testStdDateTime) 
    10974         { 
    10975             assertPred!"=="(SysTime(0, UTC()).month, 1); 
    10976             assertPred!"=="(SysTime(1, UTC()).month, 1); 
    10977             assertPred!"=="(SysTime(-1, UTC()).month, 12); 
    10978             assertPred!"=="(SysTime(DateTime(1, 12, 1, 0, 0, 0)).month, 12); 
    10979             assertPred!"=="(SysTime(DateTime(0, 12, 1, 0, 0, 0)).month, 12); 
    10980             assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)).month, 7); 
    10981             assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 12, 30, 33)).month, 7); 
    10982  
    10983             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10984             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    10985             static assert(__traits(compiles, cst.month)); 
    10986             //static assert(__traits(compiles, ist.month)); 
    10987  
    10988             //Verify Examples. 
    10989             assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).month == 7); 
    10990             assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).month == 10); 
    10991             assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).month == 4); 
    10992         } 
    10993     } 
    10994  
    10995  
    10996     /++ 
    10997         Month of a Gregorian Year. 
    10998  
    10999         Params: 
    11000             month = The month to set this SysTime's month to. 
    11001  
    11002         Throws: 
    11003             DateTimeException if the given month is not a valid month. 
    11004      +/ 
    11005     @property void month(Month month) 
    11006     { 
    11007         auto hnsecs = adjTime; 
    11008         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    11009  
    11010         if(hnsecs < 0) 
    11011         { 
    11012             hnsecs += convert!("hours", "hnsecs")(24); 
    11013             --days; 
    11014         } 
    11015  
    11016         auto date = Date(cast(int)days); 
    11017         date.month = month; 
    11018  
    11019         immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
    11020  
    11021         adjTime = newDaysHNSecs + hnsecs; 
    11022     } 
    11023  
    11024     unittest 
    11025     { 
    11026         version(testStdDateTime) 
    11027         { 
    11028             static void testSTInvalid(SysTime st, Month month) 
    11029             { 
    11030                 st.month = month; 
    11031             } 
    11032  
    11033             static void testST(SysTime st, Month month, in SysTime expected, size_t line = __LINE__) 
    11034             { 
    11035                 st.month = month; 
    11036                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11037             } 
    11038  
    11039             assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 1, 12, 30, 33)), cast(Month)0)); 
    11040             assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 1, 12, 30, 33)), cast(Month)13)); 
    11041             assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 1, 29, 12, 30, 33)), cast(Month)2)); 
    11042             assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(1, 7, 31, 12, 30, 33)), cast(Month)6)); 
    11043             assertThrown!DateTimeException(testSTInvalid(SysTime(DateTime(4, 7, 30, 12, 30, 33)), cast(Month)2)); 
    11044  
    11045             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)1, SysTime(Date(1, 1, 1))); 
    11046             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)7, SysTime(Date(1, 7, 1))); 
    11047             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), cast(Month)12, SysTime(Date(1, 12, 1))); 
    11048             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11049             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)7, SysTime(DateTime(1, 7, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11050             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11051  
    11052             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)1, SysTime(Date(0, 1, 1))); 
    11053             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)7, SysTime(Date(0, 7, 1))); 
    11054             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), cast(Month)12, SysTime(Date(0, 12, 1))); 
    11055             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11056             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)7, SysTime(DateTime(0, 7, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11057             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11058  
    11059             testST(SysTime(Date(1, 7, 2)), cast(Month)12, SysTime(Date(1, 12, 2))); 
    11060             testST(SysTime(Date(5007, 7, 2)), cast(Month)5, SysTime(Date(5007, 5, 2))); 
    11061             testST(SysTime(Date(0, 7, 2)), cast(Month)7, SysTime(Date(0, 7, 2))); 
    11062             testST(SysTime(Date(-1202, 7, 2)), cast(Month)1, SysTime(Date(-1202, 1, 2))); 
    11063  
    11064             testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0))); 
    11065             testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1))); 
    11066             testST(SysTime(DateTime(1, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(2)), cast(Month)7, SysTime(DateTime(1, 7, 29, 9, 13, 2), FracSec.from!"hnsecs"(2))); 
    11067             testST(SysTime(DateTime(1, 11, 28, 10, 13, 2), FracSec.from!"hnsecs"(3)), cast(Month)1, SysTime(DateTime(1, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(3))); 
    11068             testST(SysTime(DateTime(1, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(4)), cast(Month)2, SysTime(DateTime(1, 2, 28, 10, 13, 2), FracSec.from!"hnsecs"(4))); 
    11069             testST(SysTime(DateTime(1, 7, 28, 10, 13, 2), FracSec.from!"hnsecs"(5)),cast(Month) 6, SysTime(DateTime(1, 6, 28, 10, 13, 2), FracSec.from!"hnsecs"(5))); 
    11070             testST(SysTime(DateTime(4, 7, 29, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)2, SysTime(DateTime(4, 2, 29, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
    11071             testST(SysTime(DateTime(4, 7, 31, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)8, SysTime(DateTime(4, 8, 31, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
    11072  
    11073             testST(SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0))); 
    11074             testST(SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11)), cast(Month)12, SysTime(DateTime(1207, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11))); 
    11075             testST(SysTime(DateTime(1207, 12, 29, 9, 12, 3), FracSec.from!"hnsecs"(10)), cast(Month)7, SysTime(DateTime(1207, 7, 29, 9, 12, 3), FracSec.from!"hnsecs"(10))); 
    11076             testST(SysTime(DateTime(1207, 11, 28, 10, 12, 3), FracSec.from!"hnsecs"(9)), cast(Month)1, SysTime(DateTime(1207, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(9))); 
    11077             testST(SysTime(DateTime(1207, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(8)), cast(Month)2, SysTime(DateTime(1207, 2, 28, 10, 12, 3), FracSec.from!"hnsecs"(8))); 
    11078             testST(SysTime(DateTime(1207, 7, 28, 10, 12, 3), FracSec.from!"hnsecs"(7)), cast(Month)6, SysTime(DateTime(1207, 6, 28, 10, 12, 3), FracSec.from!"hnsecs"(7))); 
    11079  
    11080             testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(0))); 
    11081             testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1)), cast(Month)12, SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(1))); 
    11082             testST(SysTime(DateTime(0, 12, 29, 9, 13, 2), FracSec.from!"hnsecs"(2)), cast(Month)7, SysTime(DateTime(0, 7, 29, 9, 13, 2), FracSec.from!"hnsecs"(2))); 
    11083             testST(SysTime(DateTime(0, 11, 28, 10, 13, 2), FracSec.from!"hnsecs"(3)), cast(Month)1, SysTime(DateTime(0, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(3))); 
    11084             testST(SysTime(DateTime(0, 1, 28, 10, 13, 2), FracSec.from!"hnsecs"(4)), cast(Month)2, SysTime(DateTime(0, 2, 28, 10, 13, 2), FracSec.from!"hnsecs"(4))); 
    11085             testST(SysTime(DateTime(0, 7, 28, 10, 13, 2), FracSec.from!"hnsecs"(5)), cast(Month)6, SysTime(DateTime(0, 6, 28, 10, 13, 2), FracSec.from!"hnsecs"(5))); 
    11086  
    11087             testST(SysTime(DateTime(0, 12, 30, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)11, SysTime(DateTime(0, 11, 30, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11088             testST(SysTime(DateTime(-1, 7, 28, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)2, SysTime(DateTime(-1, 2, 28, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11089             testST(SysTime(DateTime(0, 7, 29, 0, 0, 0), FracSec.from!"hnsecs"(1)), cast(Month)2, SysTime(DateTime(0, 2, 29, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11090             testST(SysTime(DateTime(0, 7, 29, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)2, SysTime(DateTime(0, 2, 29, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
    11091             testST(SysTime(DateTime(0, 7, 31, 10, 13, 2), FracSec.from!"hnsecs"(6)), cast(Month)8, SysTime(DateTime(0, 8, 31, 10, 13, 2), FracSec.from!"hnsecs"(6))); 
    11092  
    11093             testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0)), cast(Month)12, SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(0))); 
    11094             testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11)), cast(Month)12, SysTime(DateTime(-9999, 12, 29, 9, 12, 2), FracSec.from!"hnsecs"(11))); 
    11095             testST(SysTime(DateTime(-9999, 12, 29, 9, 12, 3), FracSec.from!"hnsecs"(10)), cast(Month)7, SysTime(DateTime(-9999, 7, 29, 9, 12, 3), FracSec.from!"hnsecs"(10))); 
    11096             testST(SysTime(DateTime(-9999, 11, 28, 10, 12, 3), FracSec.from!"hnsecs"(9)), cast(Month)1, SysTime(DateTime(-9999, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(9))); 
    11097             testST(SysTime(DateTime(-9999, 1, 28, 10, 12, 3), FracSec.from!"hnsecs"(8)), cast(Month)2, SysTime(DateTime(-9999, 2, 28, 10, 12, 3), FracSec.from!"hnsecs"(8))); 
    11098             testST(SysTime(DateTime(-9999, 7, 28, 10, 12, 3), FracSec.from!"hnsecs"(7)), cast(Month)6, SysTime(DateTime(-9999, 6, 28, 10, 12, 3), FracSec.from!"hnsecs"(7))); 
    11099  
    11100             testST(SysTime(0, UTC()), cast(Month)12, SysTime(DateTime(1, 12, 1, 0, 0, 0), UTC())); 
    11101  
    11102             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11103             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11104             static assert(!__traits(compiles, cst.month = 12)); 
    11105             //static assert(!__traits(compiles, ist.month = 12)); 
    11106         } 
    11107     } 
    11108  
    11109  
    11110     /++ 
    11111         Day of a Gregorian Month. 
    11112  
    11113         Examples: 
    11114 -------------------- 
    11115 assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).day == 6); 
    11116 assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).day == 4); 
    11117 assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).day == 5); 
    11118 -------------------- 
    11119      +/ 
    11120     @property ubyte day() const nothrow 
    11121     { 
    11122         return (cast(Date)this).day; 
    11123     } 
    11124  
    11125     unittest 
    11126     { 
    11127         version(testStdDateTime) 
    11128         { 
    11129             assertPred!"=="(SysTime(0, UTC()).day, 1); 
    11130             assertPred!"=="(SysTime(1, UTC()).day, 1); 
    11131             assertPred!"=="(SysTime(-1, UTC()).day, 31); 
    11132             assertPred!"=="(SysTime(DateTime(50, 2, 4)).day, 4); 
    11133             assertPred!"=="(SysTime(DateTime(50, 2, 4, 0, 0, 1)).day, 4); 
    11134             assertPred!"=="(SysTime(DateTime(1999, 7, 6)).day, 6); 
    11135             assertPred!"=="(SysTime(DateTime(1999, 7, 6, 0, 0, 0)).day, 6); 
    11136             assertPred!"=="(SysTime(DateTime(1999, 7, 6, 12, 30, 33)).day, 6); 
    11137             assertPred!"=="(SysTime(DateTime(-50, 2, 4)).day, 4); 
    11138             assertPred!"=="(SysTime(DateTime(-50, 2, 4, 0, 0, 1)).day, 4); 
    11139             assertPred!"=="(SysTime(Date(-1999, 7, 6)).day, 6); 
    11140             assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 0, 0, 0)).day, 6); 
    11141             assertPred!"=="(SysTime(DateTime(-1999, 7, 6, 12, 30, 33)).day, 6); 
    11142  
    11143             assertPred!"=="(SysTime(DateTime(1, 1, 12, 0, 0, 0)).day, 12); 
    11144             assertPred!"=="(SysTime(DateTime(0, 1, 12, 0, 0, 0)).day, 12); 
    11145  
    11146             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11147             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11148             static assert(__traits(compiles, cst.day)); 
    11149             //static assert(__traits(compiles, ist.day)); 
    11150  
    11151             //Verify Examples. 
    11152             assert(SysTime(DateTime(1999, 7, 6, 9, 7, 5)).day == 6); 
    11153             assert(SysTime(DateTime(2010, 10, 4, 0, 0, 30)).day == 4); 
    11154             assert(SysTime(DateTime(-7, 4, 5, 7, 45, 2)).day == 5); 
    11155         } 
    11156     } 
    11157  
    11158  
    11159     /++ 
    11160         Day of a Gregorian Month. 
    11161  
    11162         Params: 
    11163             day = The day of the month to set this SysTime's day to. 
    11164  
    11165         Throws: 
    11166             DateTimeException if the given day is not a valid day of the current 
    11167             month. 
    11168      +/ 
    11169     @property void day(int day) 
    11170     { 
    11171         auto hnsecs = adjTime; 
    11172         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    11173  
    11174         if(hnsecs < 0) 
    11175         { 
    11176             hnsecs += convert!("hours", "hnsecs")(24); 
    11177             --days; 
    11178         } 
    11179  
    11180         auto date = Date(cast(int)days); 
    11181         date.day = day; 
    11182  
    11183         immutable newDaysHNSecs = convert!("days", "hnsecs")(date.dayOfGregorianCal - 1); 
    11184  
    11185         adjTime = newDaysHNSecs + hnsecs; 
    11186     } 
    11187  
    11188     unittest 
    11189     { 
    11190         version(testStdDateTime) 
    11191         { 
    11192             static void testSTInvalid(SysTime st, int day) 
    11193             { 
    11194                 st.day = day; 
    11195             } 
    11196  
    11197             static void testST(SysTime st, int day, in SysTime expected, size_t line = __LINE__) 
    11198             { 
    11199                 st.day = day; 
    11200                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11201             } 
    11202  
    11203             //Test A.D. 
    11204             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 0)); 
    11205             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 32)); 
    11206             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 2, 1)), 29)); 
    11207             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(4, 2, 1)), 30)); 
    11208             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 3, 1)), 32)); 
    11209             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 4, 1)), 31)); 
    11210             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 5, 1)), 32)); 
    11211             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 6, 1)), 31)); 
    11212             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 7, 1)), 32)); 
    11213             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 8, 1)), 32)); 
    11214             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 9, 1)), 31)); 
    11215             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 10, 1)), 32)); 
    11216             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 11, 1)), 31)); 
    11217             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 12, 1)), 32)); 
    11218  
    11219             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 1, 1)), 31)); 
    11220             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 2, 1)), 28)); 
    11221             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(4, 2, 1)), 29)); 
    11222             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 3, 1)), 31)); 
    11223             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 4, 1)), 30)); 
    11224             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 5, 1)), 31)); 
    11225             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 6, 1)), 30)); 
    11226             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 7, 1)), 31)); 
    11227             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 8, 1)), 31)); 
    11228             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 9, 1)), 30)); 
    11229             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 10, 1)), 31)); 
    11230             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 11, 1)), 30)); 
    11231             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(1, 12, 1)), 31)); 
    11232  
    11233             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 1, SysTime(Date(1, 1, 1))); 
    11234             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 7, SysTime(Date(1, 1, 7))); 
    11235             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0)), 12, SysTime(Date(1, 1, 12))); 
    11236             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11237             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 7, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11238             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 12, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11239  
    11240             testST(SysTime(Date(1, 7, 2)), 12, SysTime(Date(1, 7, 12))); 
    11241             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(Date(5007, 7, 5))); 
    11242  
    11243             testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(7))); 
    11244             testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70))); 
    11245             testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700))); 
    11246             testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(7000))); 
    11247             testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000))); 
    11248             testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 29, SysTime(DateTime(1, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(700_000))); 
    11249  
    11250             testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(9))); 
    11251             testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90))); 
    11252             testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900))); 
    11253             testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(9000))); 
    11254             testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000))); 
    11255             testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 29, SysTime(DateTime(999, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(900_000))); 
    11256  
    11257             //Test B.C. 
    11258             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 0)); 
    11259             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 32)); 
    11260             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 2, 1)), 29)); 
    11261             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(0, 2, 1)), 30)); 
    11262             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 3, 1)), 32)); 
    11263             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 4, 1)), 31)); 
    11264             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 5, 1)), 32)); 
    11265             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 6, 1)), 31)); 
    11266             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 7, 1)), 32)); 
    11267             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 8, 1)), 32)); 
    11268             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 9, 1)), 31)); 
    11269             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 10, 1)), 32)); 
    11270             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 11, 1)), 31)); 
    11271             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 12, 1)), 32)); 
    11272  
    11273             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 1, 1)), 31)); 
    11274             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 2, 1)), 28)); 
    11275             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(0, 2, 1)), 29)); 
    11276             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 3, 1)), 31)); 
    11277             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 4, 1)), 30)); 
    11278             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 5, 1)), 31)); 
    11279             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 6, 1)), 30)); 
    11280             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 7, 1)), 31)); 
    11281             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 8, 1)), 31)); 
    11282             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 9, 1)), 30)); 
    11283             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 10, 1)), 31)); 
    11284             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 11, 1)), 30)); 
    11285             assertNotThrown!DateTimeException(testSTInvalid(SysTime(Date(-1, 12, 1)), 31)); 
    11286  
    11287             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 1, SysTime(Date(0, 1, 1))); 
    11288             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 7, SysTime(Date(0, 1, 7))); 
    11289             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0)), 12, SysTime(Date(0, 1, 12))); 
    11290             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11291             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 7, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11292             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 12, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11293  
    11294             testST(SysTime(Date(0, 7, 2)), 7, SysTime(Date(0, 7, 7))); 
    11295             testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(Date(-1202, 7, 1))); 
    11296  
    11297             testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(7))); 
    11298             testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70))); 
    11299             testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700))); 
    11300             testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(7000))); 
    11301             testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000))); 
    11302             testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 29, SysTime(DateTime(0, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(700_000))); 
    11303  
    11304             testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 6, 12, 22, 17), FracSec.from!"hnsecs"(9))); 
    11305             testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90))); 
    11306             testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900))); 
    11307             testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 5, 12, 22, 17), FracSec.from!"hnsecs"(9000))); 
    11308             testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000))); 
    11309             testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 29, SysTime(DateTime(-1, 12, 29, 12, 22, 17), FracSec.from!"hnsecs"(900_000))); 
    11310  
    11311             testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 12, 0, 0, 0), UTC())); 
    11312  
    11313             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11314             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11315             static assert(!__traits(compiles, cst.day = 27)); 
    11316             //static assert(!__traits(compiles, ist.day = 27)); 
    11317         } 
    11318     } 
    11319  
    11320  
    11321     /++ 
    11322         Hours past midnight. 
    11323      +/ 
    11324     @property ubyte hour() const nothrow 
    11325     { 
    11326         auto hnsecs = adjTime; 
    11327         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    11328  
    11329         if(hnsecs < 0) 
    11330         { 
    11331             hnsecs += convert!("hours", "hnsecs")(24); 
    11332             --days; 
    11333         } 
    11334  
    11335         return cast(ubyte)getUnitsFromHNSecs!"hours"(hnsecs); 
    11336     } 
    11337  
    11338     unittest 
    11339     { 
    11340         version(testStdDateTime) 
    11341         { 
    11342             assertPred!"=="(SysTime(0, UTC()).hour, 0); 
    11343             assertPred!"=="(SysTime(1, UTC()).hour, 0); 
    11344             assertPred!"=="(SysTime(-1, UTC()).hour, 23); 
    11345             assertPred!"=="(SysTime(DateTime(1, 1, 1, 12, 0, 0)).hour, 12); 
    11346             assertPred!"=="(SysTime(DateTime(0, 1, 1, 12, 0, 0)).hour, 12); 
    11347  
    11348             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11349             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11350             static assert(__traits(compiles, cst.hour)); 
    11351             //static assert(__traits(compiles, ist.hour)); 
    11352         } 
    11353     } 
    11354  
    11355  
    11356     /++ 
    11357         Hours past midnight. 
    11358  
    11359         Params: 
    11360             hour = The hours to set this SysTime's hour to. 
    11361  
    11362         Throws: 
    11363             DateTimeException if the given hour are not a valid hour of the day. 
    11364      +/ 
    11365     @property void hour(int hour) 
    11366     { 
    11367         enforceValid!"hours"(hour); 
    11368  
    11369         auto hnsecs = adjTime; 
    11370         auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
    11371         immutable daysHNSecs = convert!("days", "hnsecs")(days); 
    11372         immutable negative = hnsecs < 0; 
    11373  
    11374         if(negative) 
    11375             hnsecs += convert!("hours", "hnsecs")(24); 
    11376  
    11377         hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
    11378         hnsecs += convert!("hours", "hnsecs")(hour); 
    11379  
    11380         if(negative) 
    11381             hnsecs -= convert!("hours", "hnsecs")(24); 
    11382  
    11383         adjTime = daysHNSecs + hnsecs; 
    11384     } 
    11385  
    11386     unittest 
    11387     { 
    11388         version(testStdDateTime) 
    11389         { 
    11390             static void testSTInvalid(SysTime st, int hour) 
    11391             { 
    11392                 st.hour = hour; 
    11393             } 
    11394  
    11395             static void testST(SysTime st, int hour, in SysTime expected, size_t line = __LINE__) 
    11396             { 
    11397                 st.hour = hour; 
    11398                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11399             } 
    11400  
    11401             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 24)); 
    11402  
    11403             //Test A.D. 
    11404             testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 1, 0, 0))); 
    11405             testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 7, 0, 0))); 
    11406             testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0))); 
    11407             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 1, 0, 0), FracSec.from!"hnsecs"(1))); 
    11408             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 7, 0, 0), FracSec.from!"hnsecs"(1))); 
    11409             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0), FracSec.from!"hnsecs"(1))); 
    11410  
    11411             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 1, 59, 59))); 
    11412             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 7, 59, 59))); 
    11413             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 12, 59, 59))); 
    11414             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 1, 59, 59), FracSec.from!"hnsecs"(1))); 
    11415             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 7, 59, 59), FracSec.from!"hnsecs"(1))); 
    11416             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 12, 59, 59), FracSec.from!"hnsecs"(1))); 
    11417  
    11418             testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 12, 0, 0))); 
    11419             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 5, 0, 0))); 
    11420  
    11421             testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(7))); 
    11422             testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(70))); 
    11423             testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(700))); 
    11424             testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(7000))); 
    11425             testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(70_000))); 
    11426             testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(700_000))); 
    11427  
    11428             testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(9))); 
    11429             testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(90))); 
    11430             testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(900))); 
    11431             testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(9000))); 
    11432             testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(90_000))); 
    11433             testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(900_000))); 
    11434  
    11435             //Test B.C. 
    11436             testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 1, 0, 0))); 
    11437             testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 7, 0, 0))); 
    11438             testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 12, 0, 0))); 
    11439             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 1, 0, 0), FracSec.from!"hnsecs"(1))); 
    11440             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 7, 0, 0), FracSec.from!"hnsecs"(1))); 
    11441             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 12, 0, 0), FracSec.from!"hnsecs"(1))); 
    11442  
    11443             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 1, 59, 59))); 
    11444             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 7, 59, 59))); 
    11445             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 12, 59, 59))); 
    11446             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 1, 59, 59), FracSec.from!"hnsecs"(1))); 
    11447             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 7, 59, 59), FracSec.from!"hnsecs"(1))); 
    11448             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 12, 59, 59), FracSec.from!"hnsecs"(1))); 
    11449  
    11450             testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 7, 0, 0))); 
    11451             testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 1, 0, 0))); 
    11452  
    11453             testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(7))); 
    11454             testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(70))); 
    11455             testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(700))); 
    11456             testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(7000))); 
    11457             testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(70_000))); 
    11458             testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(700_000))); 
    11459  
    11460             testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 6, 22, 17), FracSec.from!"hnsecs"(9))); 
    11461             testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 1, 22, 17), FracSec.from!"hnsecs"(90))); 
    11462             testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 1, 22, 17), FracSec.from!"hnsecs"(900))); 
    11463             testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 5, 22, 17), FracSec.from!"hnsecs"(9000))); 
    11464             testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 1, 22, 17), FracSec.from!"hnsecs"(90_000))); 
    11465             testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 23, 22, 17), FracSec.from!"hnsecs"(900_000))); 
    11466  
    11467             testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 12, 0, 0), UTC())); 
    11468  
    11469             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11470             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11471             static assert(!__traits(compiles, cst.hour = 27)); 
    11472             //static assert(!__traits(compiles, ist.hour = 27)); 
    11473         } 
    11474     } 
    11475  
    11476  
    11477     /++ 
    11478         Minutes past the current hour. 
    11479      +/ 
    11480     @property ubyte minute() const nothrow 
    11481     { 
    11482         auto hnsecs = adjTime; 
    11483         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    11484  
    11485         if(hnsecs < 0) 
    11486         { 
    11487             hnsecs += convert!("hours", "hnsecs")(24); 
    11488             --days; 
    11489         } 
    11490  
    11491         hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
    11492  
    11493         return cast(ubyte)getUnitsFromHNSecs!"minutes"(hnsecs); 
    11494     } 
    11495  
    11496     unittest 
    11497     { 
    11498         version(testStdDateTime) 
    11499         { 
    11500             assertPred!"=="(SysTime(0, UTC()).minute, 0); 
    11501             assertPred!"=="(SysTime(1, UTC()).minute, 0); 
    11502             assertPred!"=="(SysTime(-1, UTC()).minute, 59); 
    11503             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 30, 0)).minute, 30); 
    11504             assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 30, 0)).minute, 30); 
    11505  
    11506             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11507             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11508             static assert(__traits(compiles, cst.minute)); 
    11509             //static assert(__traits(compiles, ist.minute)); 
    11510         } 
    11511     } 
    11512  
    11513  
    11514     /++ 
    11515         Minutes past the current hour. 
    11516  
    11517         Params: 
    11518             minutes = The minute to set this SysTime's minute to. 
    11519  
    11520         Throws: 
    11521             DateTimeException if the given minute are not a valid minute of an 
    11522             hour. 
    11523      +/ 
    11524     @property void minute(int minute) 
    11525     { 
    11526         enforceValid!"minutes"(minute); 
    11527  
    11528         auto hnsecs = adjTime; 
    11529         auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
    11530         immutable daysHNSecs = convert!("days", "hnsecs")(days); 
    11531         immutable negative = hnsecs < 0; 
    11532  
    11533         if(negative) 
    11534             hnsecs += convert!("hours", "hnsecs")(24); 
    11535  
    11536         immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
    11537         hnsecs = removeUnitsFromHNSecs!"minutes"(hnsecs); 
    11538  
    11539         hnsecs += convert!("hours", "hnsecs")(hour); 
    11540         hnsecs += convert!("minutes", "hnsecs")(minute); 
    11541  
    11542         if(negative) 
    11543             hnsecs -= convert!("hours", "hnsecs")(24); 
    11544  
    11545         adjTime = daysHNSecs + hnsecs; 
    11546     } 
    11547  
    11548     unittest 
    11549     { 
    11550         version(testStdDateTime) 
    11551         { 
    11552             static void testSTInvalid(SysTime st, int minute) 
    11553             { 
    11554                 st.minute = minute; 
    11555             } 
    11556  
    11557             static void testST(SysTime st, int minute, in SysTime expected, size_t line = __LINE__) 
    11558             { 
    11559                 st.minute = minute; 
    11560                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11561             } 
    11562  
    11563             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 60)); 
    11564  
    11565             //Test A.D. 
    11566             testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 1, 0))); 
    11567             testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 7, 0))); 
    11568             testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0))); 
    11569             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 1, 0), FracSec.from!"hnsecs"(1))); 
    11570             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 7, 0), FracSec.from!"hnsecs"(1))); 
    11571             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0), FracSec.from!"hnsecs"(1))); 
    11572  
    11573             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 1, 59))); 
    11574             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 7, 59))); 
    11575             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 12, 59))); 
    11576             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 1, 59), FracSec.from!"hnsecs"(1))); 
    11577             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 7, 59), FracSec.from!"hnsecs"(1))); 
    11578             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 12, 59), FracSec.from!"hnsecs"(1))); 
    11579  
    11580             testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 12, 0))); 
    11581             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 5, 0))); 
    11582  
    11583             testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(7))); 
    11584             testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(70))); 
    11585             testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(700))); 
    11586             testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(7000))); 
    11587             testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(70_000))); 
    11588             testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(700_000))); 
    11589  
    11590             testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(9))); 
    11591             testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(90))); 
    11592             testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(900))); 
    11593             testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(9000))); 
    11594             testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(90_000))); 
    11595             testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(900_000))); 
    11596  
    11597             //Test B.C. 
    11598             testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 1, 0))); 
    11599             testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 7, 0))); 
    11600             testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 12, 0))); 
    11601             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 1, 0), FracSec.from!"hnsecs"(1))); 
    11602             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 7, 0), FracSec.from!"hnsecs"(1))); 
    11603             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 12, 0), FracSec.from!"hnsecs"(1))); 
    11604  
    11605             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 1, 59))); 
    11606             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 7, 59))); 
    11607             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 12, 59))); 
    11608             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 1, 59), FracSec.from!"hnsecs"(1))); 
    11609             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 7, 59), FracSec.from!"hnsecs"(1))); 
    11610             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 12, 59), FracSec.from!"hnsecs"(1))); 
    11611  
    11612             testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 7, 0))); 
    11613             testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 1, 0))); 
    11614  
    11615             testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(7))); 
    11616             testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(70))); 
    11617             testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(700))); 
    11618             testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(7000))); 
    11619             testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(70_000))); 
    11620             testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(700_000))); 
    11621  
    11622             testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 6, 17), FracSec.from!"hnsecs"(9))); 
    11623             testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 1, 17), FracSec.from!"hnsecs"(90))); 
    11624             testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 1, 17), FracSec.from!"hnsecs"(900))); 
    11625             testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 5, 17), FracSec.from!"hnsecs"(9000))); 
    11626             testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 1, 17), FracSec.from!"hnsecs"(90_000))); 
    11627             testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 23, 17), FracSec.from!"hnsecs"(900_000))); 
    11628  
    11629             testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 12, 0), UTC())); 
    11630  
    11631             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11632             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11633             static assert(!__traits(compiles, cst.minute = 27)); 
    11634             //static assert(!__traits(compiles, ist.minute = 27)); 
    11635         } 
    11636     } 
    11637  
    11638  
    11639     /++ 
    11640         Seconds past the current minute. 
    11641      +/ 
    11642     @property ubyte second() const nothrow 
    11643     { 
    11644         auto hnsecs = adjTime; 
    11645         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    11646  
    11647         if(hnsecs < 0) 
    11648         { 
    11649             hnsecs += convert!("hours", "hnsecs")(24); 
    11650             --days; 
    11651         } 
    11652  
    11653         hnsecs = removeUnitsFromHNSecs!"hours"(hnsecs); 
    11654         hnsecs = removeUnitsFromHNSecs!"minutes"(hnsecs); 
    11655  
    11656         return cast(ubyte)getUnitsFromHNSecs!"seconds"(hnsecs); 
    11657     } 
    11658  
    11659     unittest 
    11660     { 
    11661         version(testStdDateTime) 
    11662         { 
    11663             assertPred!"=="(SysTime(0, UTC()).second, 0); 
    11664             assertPred!"=="(SysTime(1, UTC()).second, 0); 
    11665             assertPred!"=="(SysTime(-1, UTC()).second, 59); 
    11666             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33)).second, 33); 
    11667             assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 0, 33)).second, 33); 
    11668  
    11669             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11670             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11671             static assert(__traits(compiles, cst.second)); 
    11672             //static assert(__traits(compiles, ist.second)); 
    11673         } 
    11674     } 
    11675  
    11676  
    11677     /++ 
    11678         Seconds past the current minute. 
    11679  
    11680         Params 
    11681             second = The second to set this SysTime's second to. 
    11682  
    11683         Throws: 
    11684             DateTimeException if the given second are not a valid second of a minute. 
    11685      +/ 
    11686     @property void second(int second) 
    11687     { 
    11688         enforceValid!"seconds"(second); 
    11689  
    11690         auto hnsecs = adjTime; 
    11691         auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
    11692         immutable daysHNSecs = convert!("days", "hnsecs")(days); 
    11693         immutable negative = hnsecs < 0; 
    11694  
    11695         if(negative) 
    11696             hnsecs += convert!("hours", "hnsecs")(24); 
    11697  
    11698         immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
    11699         immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
    11700         hnsecs = removeUnitsFromHNSecs!"seconds"(hnsecs); 
    11701  
    11702         hnsecs += convert!("hours", "hnsecs")(hour); 
    11703         hnsecs += convert!("minutes", "hnsecs")(minute); 
    11704         hnsecs += convert!("seconds", "hnsecs")(second); 
    11705  
    11706         if(negative) 
    11707             hnsecs -= convert!("hours", "hnsecs")(24); 
    11708  
    11709         adjTime = daysHNSecs + hnsecs; 
    11710     } 
    11711  
    11712     unittest 
    11713     { 
    11714         version(testStdDateTime) 
    11715         { 
    11716             static void testSTInvalid(SysTime st, int second) 
    11717             { 
    11718                 st.second = second; 
    11719             } 
    11720  
    11721             static void testST(SysTime st, int second, in SysTime expected, size_t line = __LINE__) 
    11722             { 
    11723                 st.second = second; 
    11724                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11725             } 
    11726  
    11727             assertThrown!DateTimeException(testSTInvalid(SysTime(Date(1999, 7, 6)), 60)); 
    11728  
    11729             //Test A.D. 
    11730             testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 1))); 
    11731             testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 7))); 
    11732             testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12))); 
    11733             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(1))); 
    11734             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 7), FracSec.from!"hnsecs"(1))); 
    11735             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12), FracSec.from!"hnsecs"(1))); 
    11736  
    11737             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 1))); 
    11738             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 7))); 
    11739             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 12))); 
    11740             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 1), FracSec.from!"hnsecs"(1))); 
    11741             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 7), FracSec.from!"hnsecs"(1))); 
    11742             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 12), FracSec.from!"hnsecs"(1))); 
    11743  
    11744             testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 0, 12))); 
    11745             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 0, 5))); 
    11746  
    11747             testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(7))); 
    11748             testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(70))); 
    11749             testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(700))); 
    11750             testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(7000))); 
    11751             testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(70_000))); 
    11752             testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(700_000))); 
    11753  
    11754             testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(9))); 
    11755             testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(90))); 
    11756             testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(900))); 
    11757             testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(9000))); 
    11758             testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(90_000))); 
    11759             testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(900_000))); 
    11760  
    11761             //Test B.C. 
    11762             testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 1))); 
    11763             testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 7))); 
    11764             testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 12))); 
    11765             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(1))); 
    11766             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 7), FracSec.from!"hnsecs"(1))); 
    11767             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 12), FracSec.from!"hnsecs"(1))); 
    11768  
    11769             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 1))); 
    11770             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 7))); 
    11771             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 12))); 
    11772             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 1), FracSec.from!"hnsecs"(1))); 
    11773             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 7), FracSec.from!"hnsecs"(1))); 
    11774             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 12), FracSec.from!"hnsecs"(1))); 
    11775  
    11776             testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 0, 7))); 
    11777             testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 0, 1))); 
    11778  
    11779             testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(7))); 
    11780             testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(70))); 
    11781             testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(700))); 
    11782             testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(7000))); 
    11783             testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(70_000))); 
    11784             testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(700_000))); 
    11785  
    11786             testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 22, 6), FracSec.from!"hnsecs"(9))); 
    11787             testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 1), FracSec.from!"hnsecs"(90))); 
    11788             testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 1), FracSec.from!"hnsecs"(900))); 
    11789             testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 22, 5), FracSec.from!"hnsecs"(9000))); 
    11790             testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 1), FracSec.from!"hnsecs"(90_000))); 
    11791             testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 22, 23), FracSec.from!"hnsecs"(900_000))); 
    11792  
    11793             testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 0, 12), UTC())); 
    11794  
    11795             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11796             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11797             static assert(!__traits(compiles, cst.seconds = 27)); 
    11798             //static assert(!__traits(compiles, ist.seconds = 27)); 
    11799         } 
    11800     } 
    11801  
    11802  
    11803     /++ 
    11804         Fractional seconds passed the second. 
    11805      +/ 
    11806     @property FracSec fracSec() const nothrow 
    11807     { 
    11808         try 
    11809         { 
    11810             auto hnsecs = removeUnitsFromHNSecs!"days"(adjTime); 
    11811  
    11812             if(hnsecs < 0) 
    11813                 hnsecs += convert!("hours", "hnsecs")(24); 
    11814  
    11815             hnsecs = removeUnitsFromHNSecs!"seconds"(hnsecs); 
    11816  
    11817             return FracSec.from!"hnsecs"(cast(int)hnsecs); 
    11818         } 
    11819         catch(Exception e) 
    11820             assert(0, "FracSec.from!\"hnsecs\"() threw."); 
    11821     } 
    11822  
    11823     unittest 
    11824     { 
    11825         version(testStdDateTime) 
    11826         { 
    11827             assertPred!"=="(SysTime(0, UTC()).fracSec.hnsecs, 0); 
    11828             assertPred!"=="(SysTime(1, UTC()).fracSec.hnsecs, 1); 
    11829             assertPred!"=="(SysTime(-1, UTC()).fracSec.hnsecs, 9_999_999); 
    11830  
    11831             assertPred!"=="(SysTime(DateTime(200, 3, 30, 1, 27, 19), FracSec.from!"hnsecs"(348), UTC()).fracSec.hnsecs, 348); 
    11832             assertPred!"=="(SysTime(DateTime(-1, 2, 17, 4, 5, 22), FracSec.from!"hnsecs"(347), UTC()).fracSec.hnsecs, 347); 
    11833  
    11834             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502)).fracSec, FracSec.from!"hnsecs"(502)); 
    11835             assertPred!"=="(SysTime(DateTime(0, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502)).fracSec, FracSec.from!"hnsecs"(502)); 
    11836  
    11837             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11838             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11839             static assert(__traits(compiles, cst.fracSec)); 
    11840             //static assert(__traits(compiles, ist.fracSec)); 
    11841         } 
    11842     } 
    11843  
    11844  
    11845     /++ 
    11846         Fractional seconds passed the second. 
    11847  
    11848         Params 
    11849             fracSec = The fractional seconds to set this SysTimes's fractional 
    11850                       seconds to. 
    11851      +/ 
    11852     @property void fracSec(FracSec fracSec) nothrow 
    11853     { 
    11854         auto hnsecs = adjTime; 
    11855         auto days = splitUnitsFromHNSecs!"days"(hnsecs); 
    11856         immutable daysHNSecs = convert!("days", "hnsecs")(days); 
    11857         immutable negative = hnsecs < 0; 
    11858  
    11859         if(negative) 
    11860             hnsecs += convert!("hours", "hnsecs")(24); 
    11861  
    11862         immutable hour = splitUnitsFromHNSecs!"hours"(hnsecs); 
    11863         immutable minute = splitUnitsFromHNSecs!"minutes"(hnsecs); 
    11864         immutable second = getUnitsFromHNSecs!"seconds"(hnsecs); 
    11865  
    11866         hnsecs = fracSec.hnsecs; 
    11867         hnsecs += convert!("hours", "hnsecs")(hour); 
    11868         hnsecs += convert!("minutes", "hnsecs")(minute); 
    11869         hnsecs += convert!("seconds", "hnsecs")(second); 
    11870  
    11871         if(negative) 
    11872             hnsecs -= convert!("hours", "hnsecs")(24); 
    11873  
    11874         adjTime = daysHNSecs + hnsecs; 
    11875     } 
    11876  
    11877     unittest 
    11878     { 
    11879         version(testStdDateTime) 
    11880         { 
    11881             static void testST(SysTime st, int hnsecs, in SysTime expected, size_t line = __LINE__) 
    11882             { 
    11883                 st.fracSec = FracSec.from!"hnsecs"(hnsecs); 
    11884                 assertPred!"=="(st, expected, "", __FILE__, line); 
    11885             } 
    11886  
    11887             //Test A.D. 
    11888             testST(SysTime(Date(1, 1, 1)), 0, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    11889             testST(SysTime(Date(1, 1, 1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11890             testST(SysTime(Date(1, 1, 1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
    11891             testST(SysTime(Date(1, 1, 1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
    11892             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11893             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
    11894             testST(SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
    11895  
    11896             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 0, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
    11897             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
    11898             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
    11899             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
    11900             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
    11901             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
    11902             testST(SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(1, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
    11903  
    11904             testST(SysTime(Date(1, 7, 2)), 12, SysTime(DateTime(1, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
    11905             testST(SysTime(Date(5007, 7, 2)), 5, SysTime(DateTime(5007, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(5))); 
    11906  
    11907             testST(SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
    11908             testST(SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11909             testST(SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11910             testST(SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
    11911             testST(SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11912             testST(SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
    11913  
    11914             testST(SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(999, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
    11915             testST(SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(999, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11916             testST(SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(999, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11917             testST(SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(999, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
    11918             testST(SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(999, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11919             testST(SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(999, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
    11920  
    11921             //Test B.C. 
    11922             testST(SysTime(Date(0, 1, 1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    11923             testST(SysTime(Date(0, 1, 1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11924             testST(SysTime(Date(0, 1, 1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
    11925             testST(SysTime(Date(0, 1, 1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
    11926             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 0, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    11927             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11928             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
    11929             testST(SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12))); 
    11930  
    11931             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 0, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(0))); 
    11932             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
    11933             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
    11934             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
    11935             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 1, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1))); 
    11936             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 7, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(7))); 
    11937             testST(SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(1)), 12, SysTime(DateTime(0, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(12))); 
    11938  
    11939             testST(SysTime(Date(0, 7, 2)), 7, SysTime(DateTime(0, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(7))); 
    11940             testST(SysTime(Date(-1202, 7, 2)), 1, SysTime(DateTime(-1202, 7, 2, 0, 0, 0), FracSec.from!"hnsecs"(1))); 
    11941  
    11942             testST(SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(7)), 6, SysTime(DateTime(0, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
    11943             testST(SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(70)), 1, SysTime(DateTime(0, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11944             testST(SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(700)), 1, SysTime(DateTime(0, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11945             testST(SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(7000)), 5, SysTime(DateTime(0, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
    11946             testST(SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(70_000)), 1, SysTime(DateTime(0, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11947             testST(SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(700_000)), 23, SysTime(DateTime(0, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
    11948  
    11949             testST(SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(9)), 6, SysTime(DateTime(-1, 1, 7, 12, 22, 17), FracSec.from!"hnsecs"(6))); 
    11950             testST(SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(90)), 1, SysTime(DateTime(-1, 1, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11951             testST(SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(900)), 1, SysTime(DateTime(-1, 2, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11952             testST(SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(9000)), 5, SysTime(DateTime(-1, 2, 27, 12, 22, 17), FracSec.from!"hnsecs"(5))); 
    11953             testST(SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(90_000)), 1, SysTime(DateTime(-1, 12, 1, 12, 22, 17), FracSec.from!"hnsecs"(1))); 
    11954             testST(SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(900_000)), 23, SysTime(DateTime(-1, 12, 31, 12, 22, 17), FracSec.from!"hnsecs"(23))); 
    11955  
    11956             testST(SysTime(0, UTC()), 12, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(12), UTC())); 
    11957  
    11958             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11959             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11960             static assert(!__traits(compiles, cst.fracSec = FracSec.from!"msecs"(7))); 
    11961             //static assert(!__traits(compiles, ist.fracSec = FracSec.from!"msecs"(7))); 
    11962         } 
    11963     } 
    11964  
    11965  
    11966     /++ 
    11967         The total hnsecs from midnight, January 1st, 1 A.D. UTC. This is the internal 
    11968         representation of SysTime. 
    11969      +/ 
    11970     @property long stdTime() const pure nothrow 
    11971     { 
    11972         return _stdTime; 
    11973     } 
    11974  
    11975     unittest 
    11976     { 
    11977         version(testStdDateTime) 
    11978         { 
    11979             assertPred!"=="(SysTime(0).stdTime, 0); 
    11980             assertPred!"=="(SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502), UTC()).stdTime, 330000502L); 
    11981             assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), UTC()).stdTime, 621355968000000000L); 
    11982  
    11983             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11984             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    11985             static assert(__traits(compiles, cst.stdTime)); 
    11986             //static assert(__traits(compiles, ist.stdTime)); 
    11987         } 
    11988     } 
    11989  
    11990  
    11991     /++ 
    11992         The total hnsecs from midnight, January 1st, 1 A.D. UTC. This is the internal 
    11993         representation of SysTime. 
    11994  
    11995         Params 
    11996             stdTime = The number of hnsecs since January 1st, 1 A.D. UTC. 
    11997      +/ 
    11998     @property void stdTime(long stdTime) pure nothrow 
    11999     { 
    12000         _stdTime = stdTime; 
    12001     } 
    12002  
    12003     unittest 
    12004     { 
    12005         version(testStdDateTime) 
    12006         { 
    12007             { 
    12008                 auto st = SysTime(0, UTC()); 
    12009                 st.stdTime = 330000502L; 
    12010                 assertPred!"=="(st, SysTime(DateTime(1, 1, 1, 0, 0, 33), FracSec.from!"hnsecs"(502), UTC())); 
    12011             } 
    12012  
    12013             { 
    12014                 auto st = SysTime(0, UTC()); 
    12015                 st.stdTime = 621355968000000000L; 
    12016                 assertPred!"=="(st, SysTime(DateTime(1970, 1, 1, 0, 0, 0), UTC())); 
    12017             } 
    12018  
    12019             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    12020             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    12021             static assert(!__traits(compiles, cst.stdTime = 27)); 
    12022             //static assert(!__traits(compiles, ist.stdTime = 27)); 
    12023         } 
    12024     } 
    12025  
    12026  
    12027     /++ 
    12028         The current time zone of this SysTime. Its internal time is always kept 
    12029         in UTC, so there are no conversion issues between time zones due to DST. 
    12030         Functions which return all or part of the time - such as hours - adjust 
    12031         the time to this SysTime's time zone before returning. 
    12032       +/ 
    12033     @property immutable(TimeZone) timezone() const pure nothrow 
    12034     { 
    12035         return _timezone.get; 
    12036     } 
    12037  
    12038  
    12039     /++ 
    12040         The current time zone of this SysTime. It's internal time is always kept 
    12041         in UTC, so there are no conversion issues between time zones due to DST. 
    12042         Functions which return all or part of the time - such as hours - adjust 
    12043         the time to this SysTime's time zone before returning. 
    12044       +/ 
    12045     @property void timezone(immutable TimeZone timezone) pure nothrow 
    12046     { 
    12047         _timezone = timezone; 
    12048     } 
    12049  
    12050  
    12051     /++ 
    12052         Returns whether DST is in effect for this SysTime. 
    12053       +/ 
    12054     @property bool dstInEffect() const nothrow 
    12055     { 
    12056         return _timezone.dstInEffect(_stdTime); 
    12057         //This function's unit testing is done in the time zone classes. 
    12058     } 
    12059  
    12060  
    12061     /++ 
    12062         Returns a SysTime with the same std time as this one, but with LocalTime 
    12063         as its time zone. 
    12064       +/ 
    12065     SysTime toLocalTime() const nothrow 
    12066     { 
    12067         return SysTime(_stdTime, LocalTime()); 
    12068     } 
    12069  
    12070     unittest 
    12071     { 
    12072         version(testStdDateTime) 
    12073         { 
    12074             { 
    12075                 auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
    12076                 assertPred!"=="(sysTime, sysTime.toLocalTime()); 
    12077                 assertPred!"=="(sysTime._stdTime, sysTime.toLocalTime()._stdTime); 
    12078                 assert(sysTime.toLocalTime().timezone is LocalTime()); 
    12079                 assert(sysTime.toLocalTime().timezone is sysTime.timezone); 
    12080                 assert(sysTime.toLocalTime().timezone !is UTC()); 
    12081             } 
    12082  
    12083             { 
    12084                 immutable stz = new SimpleTimeZone(-3 * 60); 
    12085                 auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27), stz); 
    12086                 assertPred!"=="(sysTime, sysTime.toLocalTime()); 
    12087                 assertPred!"=="(sysTime._stdTime, sysTime.toLocalTime()._stdTime); 
    12088                 assert(sysTime.toLocalTime().timezone is LocalTime()); 
    12089                 assert(sysTime.toLocalTime().timezone !is UTC()); 
    12090                 assert(sysTime.toLocalTime().timezone !is stz); 
    12091             } 
    12092         } 
    12093     } 
    12094  
    12095  
    12096     /++ 
    12097         Returns a SysTime with the same std time as this one, but with UTC as 
    12098         its time zone. 
    12099       +/ 
    12100     SysTime toUTC() const pure nothrow 
    12101     { 
    12102         return SysTime(_stdTime, UTC()); 
    12103     } 
    12104  
    12105     unittest 
    12106     { 
    12107         version(testStdDateTime) 
    12108         { 
    12109             auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
    12110             assertPred!"=="(sysTime, sysTime.toUTC()); 
    12111             assertPred!"=="(sysTime._stdTime, sysTime.toUTC()._stdTime); 
    12112             assert(sysTime.toUTC().timezone is UTC()); 
    12113             assert(sysTime.toUTC().timezone !is LocalTime()); 
    12114             assert(sysTime.toUTC().timezone !is sysTime.timezone); 
    12115         } 
    12116     } 
    12117  
    12118  
    12119     /++ 
    12120         Returns a SysTime with the same std time as this one, but with given 
    12121         time zone as its time zone. 
    12122       +/ 
    12123     SysTime toOtherTZ(immutable TimeZone tz) const pure nothrow 
    12124     { 
    12125         return SysTime(_stdTime, tz); 
    12126     } 
    12127  
    12128     unittest 
    12129     { 
    12130         version(testStdDateTime) 
    12131         { 
    12132             immutable stz = new SimpleTimeZone(11 * 60); 
    12133             auto sysTime = SysTime(DateTime(1982, 1, 4, 8, 59, 7), FracSec.from!"hnsecs"(27)); 
    12134             assertPred!"=="(sysTime, sysTime.toOtherTZ(stz)); 
    12135             assertPred!"=="(sysTime._stdTime, sysTime.toOtherTZ(stz)._stdTime); 
    12136             assert(sysTime.toOtherTZ(stz).timezone is stz); 
    12137             assert(sysTime.toOtherTZ(stz).timezone !is LocalTime()); 
    12138             assert(sysTime.toOtherTZ(stz).timezone !is UTC()); 
    12139         } 
    12140     } 
    12141  
    12142  
    12143     /++ 
    12144         Returns a time_t which represents this SysTime. 
    12145  
    12146         If time_t is 32 bits, rather than 64, and the result can't fit in a 32-bit 
    12147         value, then the closest value that can be held in 32 bits will be used 
    12148         (so time_t.max if it goes over or time_t.min if it goes under). 
    12149       +/ 
    12150     time_t toUnixTime() const pure nothrow 
    12151     { 
    12152         return stdTimeToUnixTime(_stdTime); 
    12153     } 
    12154  
    12155     unittest 
    12156     { 
    12157         version(testStdDateTime) 
    12158         { 
    12159             assertPred!"=="(SysTime(DateTime(1970, 1, 1), UTC()).toUnixTime, 0); 
    12160             assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(1), UTC()).toUnixTime, 0); 
    12161             assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"usecs"(1), UTC()).toUnixTime, 0); 
    12162             assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 0), FracSec.from!"msecs"(1), UTC()).toUnixTime, 0); 
    12163             assertPred!"=="(SysTime(DateTime(1970, 1, 1, 0, 0, 1), UTC()).toUnixTime, 1); 
    12164             assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toUnixTime, 0); 
    12165             assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999_999), UTC()).toUnixTime, 0); 
    12166             assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC()).toUnixTime, 0); 
    12167             assertPred!"=="(SysTime(DateTime(1969, 12, 31, 23, 59, 59), UTC()).toUnixTime, -1); 
    12168         } 
    12169     } 
    12170  
    12171  
    12172     /++ 
    12173         Returns a timeval which represents this SysTime. 
    12174  
    12175         If time_t is 32 bits, rather than 64, and the result can't fit in a 32-bit 
    12176         value, then the closest value that can be held in 32 bits will be used 
    12177         for tv_sec. (so time_t.max if it goes over or time_t.min if it goes under). 
    12178       +/ 
    12179     timeval toTimeVal() const pure nothrow 
    12180     { 
    12181         immutable tv_sec = toUnixTime(); 
    12182  
    12183         immutable fracHNSecs = removeUnitsFromHNSecs!"seconds"(_stdTime - 621355968000000000L); 
    12184         immutable tv_usec = cast(int)convert!("hnsecs", "usecs")(fracHNSecs); 
    12185  
    12186         return timeval(tv_sec, tv_usec); 
    12187     } 
    12188  
    12189     unittest 
    12190     { 
    12191         version(testStdDateTime) 
    12192         { 
    12193             assert(SysTime(DateTime(1970, 1, 1), UTC()).toTimeVal() == timeval(0, 0)); 
    12194             assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"hnsecs"(9), UTC()).toTimeVal() == timeval(0, 0)); 
    12195             assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"hnsecs"(10), UTC()).toTimeVal() == timeval(0, 1)); 
    12196             assert(SysTime(DateTime(1970, 1, 1), FracSec.from!"usecs"(7), UTC()).toTimeVal() == timeval(0, 7)); 
    12197  
    12198             assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), UTC()).toTimeVal() == timeval(1, 0)); 
    12199             assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(9), UTC()).toTimeVal() == timeval(1, 0)); 
    12200             assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"hnsecs"(10), UTC()).toTimeVal() == timeval(1, 1)); 
    12201             assert(SysTime(DateTime(1970, 1, 1, 0, 0, 1), FracSec.from!"usecs"(7), UTC()).toTimeVal() == timeval(1, 7)); 
    12202  
    12203             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999), UTC()).toTimeVal() == 
    12204                    timeval(0, 0)); 
    12205             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"hnsecs"(9_999_990), UTC()).toTimeVal() == 
    12206                    timeval(0, -1)); 
    12207  
    12208             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999_999), UTC()).toTimeVal() == 
    12209                    timeval(0, -1)); 
    12210             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"usecs"(999), UTC()).toTimeVal() == 
    12211                    timeval(0, -999_001)); 
    12212             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), FracSec.from!"msecs"(999), UTC()).toTimeVal() == 
    12213                    timeval(0, -1000)); 
    12214             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 59), UTC()).toTimeVal() == timeval(-1, 0)); 
    12215             assert(SysTime(DateTime(1969, 12, 31, 23, 59, 58), FracSec.from!"usecs"(17), UTC()).toTimeVal() == 
    12216                    timeval(-1, -999_983)); 
    12217         } 
    12218     } 
    12219  
    12220  
    12221     /++ 
    12222         Returns a tm which represents this SysTime. 
    12223       +/ 
    12224     tm toTM() const nothrow 
    12225     { 
    12226         try 
    12227         { 
    12228             auto dateTime = cast(DateTime)this; 
    12229             tm timeInfo; 
    12230  
    12231             timeInfo.tm_sec = dateTime.second; 
    12232             timeInfo.tm_min = dateTime.minute; 
    12233             timeInfo.tm_hour = dateTime.hour; 
    12234             timeInfo.tm_mday = dateTime.day; 
    12235             timeInfo.tm_mon = dateTime.month - 1; 
    12236             timeInfo.tm_year = dateTime.year - 1900; 
    12237             timeInfo.tm_wday = dateTime.dayOfWeek; 
    12238             timeInfo.tm_yday = dateTime.dayOfYear - 1; 
    12239             timeInfo.tm_isdst = _timezone.dstInEffect(_stdTime); 
    12240  
    12241             version(Posix) 
    12242             { 
    12243                 char[] zone = (timeInfo.tm_isdst ? _timezone.dstName : _timezone.stdName).dup; 
    12244                 zone ~= "\0"; 
    12245  
    12246                 timeInfo.tm_gmtoff = cast(int)convert!("hnsecs", "seconds")(adjTime - _stdTime); 
    12247                 timeInfo.tm_zone = zone.ptr; 
    12248             } 
    12249  
    12250             return timeInfo; 
    12251         } 
    12252         catch(Exception e) 
    12253             assert(0, "Either DateTime's constructor threw."); 
    12254     } 
    12255  
    12256     unittest 
    12257     { 
    12258         version(testStdDateTime) 
    12259         { 
    12260             version(Posix) 
    12261             { 
    12262                 scope(exit) clearTZEnvVar(); 
    12263                 setTZEnvVar("America/Los_Angeles"); 
    12264             } 
    12265  
    12266             { 
    12267                 auto timeInfo = SysTime(DateTime(1970, 1, 1)).toTM(); 
    12268  
    12269                 assertPred!"=="(timeInfo.tm_sec, 0); 
    12270                 assertPred!"=="(timeInfo.tm_min, 0); 
    12271                 assertPred!"=="(timeInfo.tm_hour, 0); 
    12272                 assertPred!"=="(timeInfo.tm_mday, 1); 
    12273                 assertPred!"=="(timeInfo.tm_mon, 0); 
    12274                 assertPred!"=="(timeInfo.tm_year, 70); 
    12275                 assertPred!"=="(timeInfo.tm_wday, 4); 
    12276                 assertPred!"=="(timeInfo.tm_yday, 0); 
    12277  
    12278                 version(Posix) 
    12279                     assertPred!"=="(timeInfo.tm_isdst, 0); 
    12280                 else version(Windows) 
    12281                     assert(timeInfo.tm_isdst == 0 || timeInfo.tm_isdst == 1); 
    12282  
    12283                 version(Posix) 
    12284                 { 
    12285                     assertPred!"=="(timeInfo.tm_gmtoff, -8 * 60 * 60); 
    12286                     assertPred!"=="(to!string(timeInfo.tm_zone), "PST"); 
    12287                 } 
    12288             } 
    12289  
    12290             { 
    12291                 auto timeInfo = SysTime(DateTime(2010, 7, 4, 12, 15, 7), FracSec.from!"hnsecs"(15)).toTM(); 
    12292  
    12293                 assertPred!"=="(timeInfo.tm_sec, 7); 
    12294                 assertPred!"=="(timeInfo.tm_min, 15); 
    12295                 assertPred!"=="(timeInfo.tm_hour, 12); 
    12296                 assertPred!"=="(timeInfo.tm_mday, 4); 
    12297                 assertPred!"=="(timeInfo.tm_mon, 6); 
    12298                 assertPred!"=="(timeInfo.tm_year, 110); 
    12299                 assertPred!"=="(timeInfo.tm_wday, 0); 
    12300                 assertPred!"=="(timeInfo.tm_yday, 184); 
    12301  
    12302                 version(Posix) 
    12303                     assertPred!"=="(timeInfo.tm_isdst, 1); 
    12304                 else version(Windows) 
    12305                     assert(timeInfo.tm_isdst == 0 || timeInfo.tm_isdst == 1); 
    12306  
    12307                 version(Posix) 
    12308                 { 
    12309                     assertPred!"=="(timeInfo.tm_gmtoff, -7 * 60 * 60); 
    12310                     assertPred!"=="(to!string(timeInfo.tm_zone), "PDT"); 
    12311                 } 
    12312             } 
    12313         } 
    12314     } 
    12315  
    12316  
    12317     /++ 
    12318         Adds the given number of years or months to this SysTime. A negative 
    12319         number will subtract. 
    12320  
    12321         Note that if day overflow is allowed, and the date with the adjusted 
    12322         year/month overflows the number of days in the new month, then the month 
    12323         will be incremented by one, and the days set to the number of days overflowed. 
    12324         (e.g. if the day were 31 and the new month were June, then the month would 
    12325         be incremented to July, and the new day would be 1). If day overflow is not 
    12326         allowed, then the day will be set to the last valid day in the month 
    12327         (e.g. June 31st would become June 30th). 
    12328  
    12329         Params: 
    12330             units         = The type of units to add ("years" or "months"). 
    12331             value         = The number of months or years to add to this SysTime. 
    12332             allowOverflow = Whether the days should be allowed to overflow, causing 
    12333                             the month to increment. 
    12334  
    12335         Examples: 
    12336 -------------------- 
    12337 auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
    12338 st1.add!"months"(11); 
    12339 assert(st1 == SysTime(DateTime(2010, 12, 1, 12, 30, 33))); 
    12340  
    12341 auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
    12342 st2.add!"months"(-11); 
    12343 assert(st2 == SysTime(DateTime(2009, 2, 1, 12, 30, 33))); 
    12344  
    12345 auto st3 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
    12346 st3.add!"years"(1); 
    12347 assert(st3 == SysTime(DateTime(2001, 3, 1, 12, 30, 33))); 
    12348  
    12349 auto st4 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
    12350 st4.add!"years"(1, AllowDayOverflow.no); 
    12351 assert(st4 == SysTime(DateTime(2001, 2, 28, 12, 30, 33))); 
    12352 -------------------- 
    12353       +/ 
    12354     ref SysTime add(string units)(long years, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
    12355         if(units == "years" || 
    12356            units == "months") 
    12357     { 
    12358         auto hnsecs = adjTime; 
    12359         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    12360  
    12361         if(hnsecs < 0) 
    12362         { 
    12363             hnsecs += convert!("hours", "hnsecs")(24); 
    12364             --days; 
    12365         } 
    12366  
    12367         auto date = Date(cast(int)days); 
    12368         date.add!units(years, allowOverflow); 
    12369         days = date.dayOfGregorianCal - 1; 
    12370  
    12371         if(days < 0) 
    12372         { 
    12373             hnsecs -= convert!("hours", "hnsecs")(24); 
    12374             ++days; 
    12375         } 
    12376  
    12377         immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
    12378  
    12379         adjTime = newDaysHNSecs + hnsecs; 
    12380  
    12381         return this; 
    12382     } 
    12383  
    12384     //Test add!"years"() with AllowDayOverlow.yes 
    12385     unittest 
    12386     { 
    12387         version(testStdDateTime) 
    12388         { 
    12389             //Test A.D. 
    12390             { 
    12391                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    12392                 sysTime.add!"years"(7); 
    12393                 assertPred!"=="(sysTime, SysTime(Date(2006, 7, 6))); 
    12394                 sysTime.add!"years"(-9); 
    12395                 assertPred!"=="(sysTime, SysTime(Date(1997, 7, 6))); 
    12396             } 
    12397  
    12398             { 
    12399                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    12400                 sysTime.add!"years"(1); 
    12401                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
    12402             } 
    12403  
    12404             { 
    12405                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    12406                 sysTime.add!"years"(-1); 
    12407                 assertPred!"=="(sysTime, SysTime(Date(1999, 3, 1))); 
    12408             } 
    12409  
    12410             { 
    12411                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
    12412                 sysTime.add!"years"(7); 
    12413                 assertPred!"=="(sysTime, SysTime(DateTime(2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12414                 sysTime.add!"years"(-9); 
    12415                 assertPred!"=="(sysTime, SysTime(DateTime(1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12416             } 
    12417  
    12418             { 
    12419                 auto sysTime = SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207)); 
    12420                 sysTime.add!"years"(1); 
    12421                 assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
    12422             } 
    12423  
    12424             { 
    12425                 auto sysTime = SysTime(DateTime(2000, 2, 29, 0, 7, 2), FracSec.from!"usecs"(1207)); 
    12426                 sysTime.add!"years"(-1); 
    12427                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 3, 1, 0, 7, 2), FracSec.from!"usecs"(1207))); 
    12428             } 
    12429  
    12430             //Test B.C. 
    12431             { 
    12432                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    12433                 sysTime.add!"years"(-7); 
    12434                 assertPred!"=="(sysTime, SysTime(Date(-2006, 7, 6))); 
    12435                 sysTime.add!"years"(9); 
    12436                 assertPred!"=="(sysTime, SysTime(Date(-1997, 7, 6))); 
    12437             } 
    12438  
    12439             { 
    12440                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    12441                 sysTime.add!"years"(-1); 
    12442                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
    12443             } 
    12444  
    12445             { 
    12446                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    12447                 sysTime.add!"years"(1); 
    12448                 assertPred!"=="(sysTime, SysTime(Date(-1999, 3, 1))); 
    12449             } 
    12450  
    12451             { 
    12452                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
    12453                 sysTime.add!"years"(-7); 
    12454                 assertPred!"=="(sysTime, SysTime(DateTime(-2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12455                 sysTime.add!"years"(9); 
    12456                 assertPred!"=="(sysTime, SysTime(DateTime(-1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12457             } 
    12458  
    12459             { 
    12460                 auto sysTime = SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
    12461                 sysTime.add!"years"(-1); 
    12462                 assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
    12463             } 
    12464  
    12465             { 
    12466                 auto sysTime = SysTime(DateTime(-2000, 2, 29, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
    12467                 sysTime.add!"years"(1); 
    12468                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 3, 1, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
    12469             } 
    12470  
    12471             //Test Both 
    12472             { 
    12473                 auto sysTime = SysTime(Date(4, 7, 6)); 
    12474                 sysTime.add!"years"(-5); 
    12475                 assertPred!"=="(sysTime, SysTime(Date(-1, 7, 6))); 
    12476                 sysTime.add!"years"(5); 
    12477                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12478             } 
    12479  
    12480             { 
    12481                 auto sysTime = SysTime(Date(-4, 7, 6)); 
    12482                 sysTime.add!"years"(5); 
    12483                 assertPred!"=="(sysTime, SysTime(Date(1, 7, 6))); 
    12484                 sysTime.add!"years"(-5); 
    12485                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12486             } 
    12487  
    12488             { 
    12489                 auto sysTime = SysTime(Date(4, 7, 6)); 
    12490                 sysTime.add!"years"(-8); 
    12491                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12492                 sysTime.add!"years"(8); 
    12493                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12494             } 
    12495  
    12496             { 
    12497                 auto sysTime = SysTime(Date(-4, 7, 6)); 
    12498                 sysTime.add!"years"(8); 
    12499                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12500                 sysTime.add!"years"(-8); 
    12501                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12502             } 
    12503  
    12504             { 
    12505                 auto sysTime = SysTime(Date(-4, 2, 29)); 
    12506                 sysTime.add!"years"(5); 
    12507                 assertPred!"=="(sysTime, SysTime(Date(1, 3, 1))); 
    12508             } 
    12509  
    12510             { 
    12511                 auto sysTime = SysTime(Date(4, 2, 29)); 
    12512                 sysTime.add!"years"(-5); 
    12513                 assertPred!"=="(sysTime, SysTime(Date(-1, 3, 1))); 
    12514             } 
    12515  
    12516             { 
    12517                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    12518                 sysTime.add!"years"(-1); 
    12519                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12520                 sysTime.add!"years"(1); 
    12521                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12522             } 
    12523  
    12524             { 
    12525                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    12526                 sysTime.add!"years"(-1); 
    12527                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12528                 sysTime.add!"years"(1); 
    12529                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12530             } 
    12531  
    12532             { 
    12533                 auto sysTime = SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    12534                 sysTime.add!"years"(1); 
    12535                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12536                 sysTime.add!"years"(-1); 
    12537                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12538             } 
    12539  
    12540             { 
    12541                 auto sysTime = SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    12542                 sysTime.add!"years"(1); 
    12543                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12544                 sysTime.add!"years"(-1); 
    12545                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12546             } 
    12547  
    12548             { 
    12549                 auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
    12550                 sysTime.add!"years"(-5); 
    12551                 assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12552                 sysTime.add!"years"(5); 
    12553                 assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12554             } 
    12555  
    12556             { 
    12557                 auto sysTime = SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
    12558                 sysTime.add!"years"(5); 
    12559                 assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12560                 sysTime.add!"years"(-5); 
    12561                 assertPred!"=="(sysTime, SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12562             } 
    12563  
    12564             { 
    12565                 auto sysTime = SysTime(DateTime(-4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
    12566                 sysTime.add!"years"(5); 
    12567                 assertPred!"=="(sysTime, SysTime(DateTime(1, 3, 1, 5, 5, 5), FracSec.from!"msecs"(555))); 
    12568             } 
    12569  
    12570             { 
    12571                 auto sysTime = SysTime(DateTime(4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
    12572                 sysTime.add!"years"(-5); 
    12573                 assertPred!"=="(sysTime, SysTime(DateTime(-1, 3, 1, 5, 5, 5), FracSec.from!"msecs"(555))); 
    12574             } 
    12575  
    12576             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    12577             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    12578             static assert(!__traits(compiles, cst.add!"years"(4))); 
    12579             //static assert(!__traits(compiles, ist.add!"years"(4))); 
    12580  
    12581             //Verify Examples. 
    12582             auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
    12583             st1.add!"months"(11); 
    12584             assert(st1 == SysTime(DateTime(2010, 12, 1, 12, 30, 33))); 
    12585  
    12586             auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30, 33)); 
    12587             st2.add!"months"(-11); 
    12588             assert(st2 == SysTime(DateTime(2009, 2, 1, 12, 30, 33))); 
    12589  
    12590             auto st3 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
    12591             st3.add!"years"(1); 
    12592             assert(st3 == SysTime(DateTime(2001, 3, 1, 12, 30, 33))); 
    12593  
    12594             auto st4 = SysTime(DateTime(2000, 2, 29, 12, 30, 33)); 
    12595             st4.add!"years"(1, AllowDayOverflow.no); 
    12596             assert(st4 == SysTime(DateTime(2001, 2, 28, 12, 30, 33))); 
    12597         } 
    12598     } 
    12599  
    12600     //Test add!"years"() with AllowDayOverlow.no 
    12601     unittest 
    12602     { 
    12603         version(testStdDateTime) 
    12604         { 
    12605             //Test A.D. 
    12606             { 
    12607                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    12608                 sysTime.add!"years"(7, AllowDayOverflow.no); 
    12609                 assertPred!"=="(sysTime, SysTime(Date(2006, 7, 6))); 
    12610                 sysTime.add!"years"(-9, AllowDayOverflow.no); 
    12611                 assertPred!"=="(sysTime, SysTime(Date(1997, 7, 6))); 
    12612             } 
    12613  
    12614             { 
    12615                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    12616                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12617                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
    12618             } 
    12619  
    12620             { 
    12621                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    12622                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12623                 assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
    12624             } 
    12625  
    12626             { 
    12627                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
    12628                 sysTime.add!"years"(7, AllowDayOverflow.no); 
    12629                 assertPred!"=="(sysTime, SysTime(DateTime(2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12630                 sysTime.add!"years"(-9, AllowDayOverflow.no); 
    12631                 assertPred!"=="(sysTime, SysTime(DateTime(1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12632             } 
    12633  
    12634             { 
    12635                 auto sysTime = SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207)); 
    12636                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12637                 assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
    12638             } 
    12639  
    12640             { 
    12641                 auto sysTime = SysTime(DateTime(2000, 2, 29, 0, 7, 2), FracSec.from!"usecs"(1207)); 
    12642                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12643                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 28, 0, 7, 2), FracSec.from!"usecs"(1207))); 
    12644             } 
    12645  
    12646             //Test B.C. 
    12647             { 
    12648                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    12649                 sysTime.add!"years"(-7, AllowDayOverflow.no); 
    12650                 assertPred!"=="(sysTime, SysTime(Date(-2006, 7, 6))); 
    12651                 sysTime.add!"years"(9, AllowDayOverflow.no); 
    12652                 assertPred!"=="(sysTime, SysTime(Date(-1997, 7, 6))); 
    12653             } 
    12654  
    12655             { 
    12656                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    12657                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12658                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
    12659             } 
    12660  
    12661             { 
    12662                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    12663                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12664                 assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
    12665             } 
    12666  
    12667             { 
    12668                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234)); 
    12669                 sysTime.add!"years"(-7, AllowDayOverflow.no); 
    12670                 assertPred!"=="(sysTime, SysTime(DateTime(-2006, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12671                 sysTime.add!"years"(9, AllowDayOverflow.no); 
    12672                 assertPred!"=="(sysTime, SysTime(DateTime(-1997, 7, 6, 12, 7, 3), FracSec.from!"msecs"(234))); 
    12673             } 
    12674  
    12675             { 
    12676                 auto sysTime = SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
    12677                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12678                 assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
    12679             } 
    12680  
    12681             { 
    12682                 auto sysTime = SysTime(DateTime(-2000, 2, 29, 3, 3, 3), FracSec.from!"hnsecs"(3)); 
    12683                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12684                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 28, 3, 3, 3), FracSec.from!"hnsecs"(3))); 
    12685             } 
    12686  
    12687             //Test Both 
    12688             { 
    12689                 auto sysTime = SysTime(Date(4, 7, 6)); 
    12690                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12691                 assertPred!"=="(sysTime, SysTime(Date(-1, 7, 6))); 
    12692                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12693                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12694             } 
    12695  
    12696             { 
    12697                 auto sysTime = SysTime(Date(-4, 7, 6)); 
    12698                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12699                 assertPred!"=="(sysTime, SysTime(Date(1, 7, 6))); 
    12700                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12701                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12702             } 
    12703  
    12704             { 
    12705                 auto sysTime = SysTime(Date(4, 7, 6)); 
    12706                 sysTime.add!"years"(-8, AllowDayOverflow.no); 
    12707                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12708                 sysTime.add!"years"(8, AllowDayOverflow.no); 
    12709                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12710             } 
    12711  
    12712             { 
    12713                 auto sysTime = SysTime(Date(-4, 7, 6)); 
    12714                 sysTime.add!"years"(8, AllowDayOverflow.no); 
    12715                 assertPred!"=="(sysTime, SysTime(Date(4, 7, 6))); 
    12716                 sysTime.add!"years"(-8, AllowDayOverflow.no); 
    12717                 assertPred!"=="(sysTime, SysTime(Date(-4, 7, 6))); 
    12718             } 
    12719  
    12720             { 
    12721                 auto sysTime = SysTime(Date(-4, 2, 29)); 
    12722                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12723                 assertPred!"=="(sysTime, SysTime(Date(1, 2, 28))); 
    12724             } 
    12725  
    12726             { 
    12727                 auto sysTime = SysTime(Date(4, 2, 29)); 
    12728                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12729                 assertPred!"=="(sysTime, SysTime(Date(-1, 2, 28))); 
    12730             } 
    12731  
    12732             { 
    12733                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    12734                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12735                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12736                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12737                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12738             } 
    12739  
    12740             { 
    12741                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    12742                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12743                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12744                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12745                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12746             } 
    12747  
    12748             { 
    12749                 auto sysTime = SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    12750                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12751                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12752                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12753                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    12754             } 
    12755  
    12756             { 
    12757                 auto sysTime = SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    12758                 sysTime.add!"years"(1, AllowDayOverflow.no); 
    12759                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12760                 sysTime.add!"years"(-1, AllowDayOverflow.no); 
    12761                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    12762             } 
    12763  
    12764             { 
    12765                 auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
    12766                 sysTime.add!"years"(-5); 
    12767                 assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12768                 sysTime.add!"years"(5); 
    12769                 assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12770             } 
    12771  
    12772             { 
    12773                 auto sysTime = SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
    12774                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12775                 assertPred!"=="(sysTime, SysTime(DateTime(-1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12776                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12777                 assertPred!"=="(sysTime, SysTime(DateTime(4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12778             } 
    12779  
    12780             { 
    12781                 auto sysTime = SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329)); 
    12782                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12783                 assertPred!"=="(sysTime, SysTime(DateTime(1, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12784                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12785                 assertPred!"=="(sysTime, SysTime(DateTime(-4, 7, 6, 14, 7, 1), FracSec.from!"usecs"(54329))); 
    12786             } 
    12787  
    12788             { 
    12789                 auto sysTime = SysTime(DateTime(-4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
    12790                 sysTime.add!"years"(5, AllowDayOverflow.no); 
    12791                 assertPred!"=="(sysTime, SysTime(DateTime(1, 2, 28, 5, 5, 5), FracSec.from!"msecs"(555))); 
    12792             } 
    12793  
    12794             { 
    12795                 auto sysTime = SysTime(DateTime(4, 2, 29, 5, 5, 5), FracSec.from!"msecs"(555)); 
    12796                 sysTime.add!"years"(-5, AllowDayOverflow.no); 
    12797                 assertPred!"=="(sysTime, SysTime(DateTime(-1, 2, 28, 5, 5, 5), FracSec.from!"msecs"(555))); 
    12798             } 
    12799         } 
    12800     } 
    12801  
    12802     //Test add!"months"() with AllowDayOverlow.yes 
    12803     unittest 
    12804     { 
    12805         version(testStdDateTime) 
    12806         { 
    12807             //Test A.D. 
    12808             { 
    12809                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    12810                 sysTime.add!"months"(3); 
    12811                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    12812                 sysTime.add!"months"(-4); 
    12813                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    12814             } 
    12815  
    12816             { 
    12817                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    12818                 sysTime.add!"months"(6); 
    12819                 assertPred!"=="(sysTime, SysTime(Date(2000, 1, 6))); 
    12820                 sysTime.add!"months"(-6); 
    12821                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
    12822             } 
    12823  
    12824             { 
    12825                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    12826                 sysTime.add!"months"(27); 
    12827                 assertPred!"=="(sysTime, SysTime(Date(2001, 10, 6))); 
    12828                 sysTime.add!"months"(-28); 
    12829                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    12830             } 
    12831  
    12832             { 
    12833                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    12834                 sysTime.add!"months"(1); 
    12835                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 1))); 
    12836             } 
    12837  
    12838             { 
    12839                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    12840                 sysTime.add!"months"(-1); 
    12841                 assertPred!"=="(sysTime, SysTime(Date(1999, 5, 1))); 
    12842             } 
    12843  
    12844             { 
    12845                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    12846                 sysTime.add!"months"(12); 
    12847                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
    12848             } 
    12849  
    12850             { 
    12851                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    12852                 sysTime.add!"months"(12); 
    12853                 assertPred!"=="(sysTime, SysTime(Date(2001, 3, 1))); 
    12854             } 
    12855  
    12856             { 
    12857                 auto sysTime = SysTime(Date(1999, 7, 31)); 
    12858                 sysTime.add!"months"(1); 
    12859                 assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
    12860                 sysTime.add!"months"(1); 
    12861                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
    12862             } 
    12863  
    12864             { 
    12865                 auto sysTime = SysTime(Date(1998, 8, 31)); 
    12866                 sysTime.add!"months"(13); 
    12867                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
    12868                 sysTime.add!"months"(-13); 
    12869                 assertPred!"=="(sysTime, SysTime(Date(1998, 9, 1))); 
    12870             } 
    12871  
    12872             { 
    12873                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    12874                 sysTime.add!"months"(13); 
    12875                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 31))); 
    12876                 sysTime.add!"months"(-13); 
    12877                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
    12878             } 
    12879  
    12880             { 
    12881                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    12882                 sysTime.add!"months"(14); 
    12883                 assertPred!"=="(sysTime, SysTime(Date(1999, 3, 3))); 
    12884                 sysTime.add!"months"(-14); 
    12885                 assertPred!"=="(sysTime, SysTime(Date(1998, 1, 3))); 
    12886             } 
    12887  
    12888             { 
    12889                 auto sysTime = SysTime(Date(1998, 12, 31)); 
    12890                 sysTime.add!"months"(14); 
    12891                 assertPred!"=="(sysTime, SysTime(Date(2000, 3, 2))); 
    12892                 sysTime.add!"months"(-14); 
    12893                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 2))); 
    12894             } 
    12895  
    12896             { 
    12897                 auto sysTime = SysTime(Date(1999, 12, 31)); 
    12898                 sysTime.add!"months"(14); 
    12899                 assertPred!"=="(sysTime, SysTime(Date(2001, 3, 3))); 
    12900                 sysTime.add!"months"(-14); 
    12901                 assertPred!"=="(sysTime, SysTime(Date(2000, 1, 3))); 
    12902             } 
    12903  
    12904             { 
    12905                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    12906                 sysTime.add!"months"(3); 
    12907                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    12908                 sysTime.add!"months"(-4); 
    12909                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    12910             } 
    12911  
    12912             { 
    12913                 auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    12914                 sysTime.add!"months"(14); 
    12915                 assertPred!"=="(sysTime, SysTime(DateTime(2000, 3, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    12916                 sysTime.add!"months"(-14); 
    12917                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 1, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    12918             } 
    12919  
    12920             { 
    12921                 auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    12922                 sysTime.add!"months"(14); 
    12923                 assertPred!"=="(sysTime, SysTime(DateTime(2001, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    12924                 sysTime.add!"months"(-14); 
    12925                 assertPred!"=="(sysTime, SysTime(DateTime(2000, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    12926             } 
    12927  
    12928             //Test B.C. 
    12929             { 
    12930                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    12931                 sysTime.add!"months"(3); 
    12932                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
    12933                 sysTime.add!"months"(-4); 
    12934                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
    12935             } 
    12936  
    12937             { 
    12938                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    12939                 sysTime.add!"months"(6); 
    12940                 assertPred!"=="(sysTime, SysTime(Date(-1998, 1, 6))); 
    12941                 sysTime.add!"months"(-6); 
    12942                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
    12943             } 
    12944  
    12945             { 
    12946                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    12947                 sysTime.add!"months"(-27); 
    12948                 assertPred!"=="(sysTime, SysTime(Date(-2001, 4, 6))); 
    12949                 sysTime.add!"months"(28); 
    12950                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
    12951             } 
    12952  
    12953             { 
    12954                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    12955                 sysTime.add!"months"(1); 
    12956                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 1))); 
    12957             } 
    12958  
    12959             { 
    12960                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    12961                 sysTime.add!"months"(-1); 
    12962                 assertPred!"=="(sysTime, SysTime(Date(-1999, 5, 1))); 
    12963             } 
    12964  
    12965             { 
    12966                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    12967                 sysTime.add!"months"(-12); 
    12968                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
    12969             } 
    12970  
    12971             { 
    12972                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    12973                 sysTime.add!"months"(-12); 
    12974                 assertPred!"=="(sysTime, SysTime(Date(-2001, 3, 1))); 
    12975             } 
    12976  
    12977             { 
    12978                 auto sysTime = SysTime(Date(-1999, 7, 31)); 
    12979                 sysTime.add!"months"(1); 
    12980                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
    12981                 sysTime.add!"months"(1); 
    12982                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 1))); 
    12983             } 
    12984  
    12985             { 
    12986                 auto sysTime = SysTime(Date(-1998, 8, 31)); 
    12987                 sysTime.add!"months"(13); 
    12988                 assertPred!"=="(sysTime, SysTime(Date(-1997, 10, 1))); 
    12989                 sysTime.add!"months"(-13); 
    12990                 assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 1))); 
    12991             } 
    12992  
    12993             { 
    12994                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    12995                 sysTime.add!"months"(13); 
    12996                 assertPred!"=="(sysTime, SysTime(Date(-1995, 1, 31))); 
    12997                 sysTime.add!"months"(-13); 
    12998                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
    12999             } 
    13000  
    13001             { 
    13002                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    13003                 sysTime.add!"months"(14); 
    13004                 assertPred!"=="(sysTime, SysTime(Date(-1995, 3, 3))); 
    13005                 sysTime.add!"months"(-14); 
    13006                 assertPred!"=="(sysTime, SysTime(Date(-1996, 1, 3))); 
    13007             } 
    13008  
    13009             { 
    13010                 auto sysTime = SysTime(Date(-2002, 12, 31)); 
    13011                 sysTime.add!"months"(14); 
    13012                 assertPred!"=="(sysTime, SysTime(Date(-2000, 3, 2))); 
    13013                 sysTime.add!"months"(-14); 
    13014                 assertPred!"=="(sysTime, SysTime(Date(-2001, 1, 2))); 
    13015             } 
    13016  
    13017             { 
    13018                 auto sysTime = SysTime(Date(-2001, 12, 31)); 
    13019                 sysTime.add!"months"(14); 
    13020                 assertPred!"=="(sysTime, SysTime(Date(-1999, 3, 3))); 
    13021                 sysTime.add!"months"(-14); 
    13022                 assertPred!"=="(sysTime, SysTime(Date(-2000, 1, 3))); 
    13023             } 
    13024  
    13025             { 
    13026                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    13027                 sysTime.add!"months"(3); 
    13028                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13029                 sysTime.add!"months"(-4); 
    13030                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13031             } 
    13032  
    13033             { 
    13034                 auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13035                 sysTime.add!"months"(14); 
    13036                 assertPred!"=="(sysTime, SysTime(DateTime(-2000, 3, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13037                 sysTime.add!"months"(-14); 
    13038                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 1, 2, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13039             } 
    13040  
    13041             { 
    13042                 auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13043                 sysTime.add!"months"(14); 
    13044                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13045                 sysTime.add!"months"(-14); 
    13046                 assertPred!"=="(sysTime, SysTime(DateTime(-2000, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13047             } 
    13048  
    13049             //Test Both 
    13050             { 
    13051                 auto sysTime = SysTime(Date(1, 1, 1)); 
    13052                 sysTime.add!"months"(-1); 
    13053                 assertPred!"=="(sysTime, SysTime(Date(0, 12, 1))); 
    13054                 sysTime.add!"months"(1); 
    13055                 assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
    13056             } 
    13057  
    13058             { 
    13059                 auto sysTime = SysTime(Date(4, 1, 1)); 
    13060                 sysTime.add!"months"(-48); 
    13061                 assertPred!"=="(sysTime, SysTime(Date(0, 1, 1))); 
    13062                 sysTime.add!"months"(48); 
    13063                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    13064             } 
    13065  
    13066             { 
    13067                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13068                 sysTime.add!"months"(-49); 
    13069                 assertPred!"=="(sysTime, SysTime(Date(0, 3, 2))); 
    13070                 sysTime.add!"months"(49); 
    13071                 assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
    13072             } 
    13073  
    13074             { 
    13075                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13076                 sysTime.add!"months"(-85); 
    13077                 assertPred!"=="(sysTime, SysTime(Date(-3, 3, 3))); 
    13078                 sysTime.add!"months"(85); 
    13079                 assertPred!"=="(sysTime, SysTime(Date(4, 4, 3))); 
    13080             } 
    13081  
    13082             { 
    13083                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13084                 sysTime.add!"months"(-1); 
    13085                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13086                 sysTime.add!"months"(1); 
    13087                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13088             } 
    13089  
    13090             { 
    13091                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13092                 sysTime.add!"months"(-1); 
    13093                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13094                 sysTime.add!"months"(1); 
    13095                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13096             } 
    13097  
    13098             { 
    13099                 auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13100                 sysTime.add!"months"(1); 
    13101                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13102                 sysTime.add!"months"(-1); 
    13103                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13104             } 
    13105  
    13106             { 
    13107                 auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13108                 sysTime.add!"months"(1); 
    13109                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13110                 sysTime.add!"months"(-1); 
    13111                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13112             } 
    13113  
    13114             { 
    13115                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
    13116                 sysTime.add!"months"(-1); 
    13117                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13118                 sysTime.add!"months"(1); 
    13119                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13120             } 
    13121  
    13122             { 
    13123                 auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13124                 sysTime.add!"months"(-85); 
    13125                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 3, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13126                 sysTime.add!"months"(85); 
    13127                 assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 3, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13128             } 
    13129  
    13130             { 
    13131                 auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13132                 sysTime.add!"months"(85); 
    13133                 assertPred!"=="(sysTime, SysTime(DateTime(4, 5, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13134                 sysTime.add!"months"(-85); 
    13135                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13136             } 
    13137  
    13138             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13139             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13140             static assert(!__traits(compiles, cst.add!"months"(4))); 
    13141             //static assert(!__traits(compiles, ist.add!"months"(4))); 
    13142  
    13143             //Verify Examples. 
    13144             auto st1 = SysTime(DateTime(2010, 1, 1, 12, 30 ,33)); 
    13145             st1.add!"months"(1); 
    13146             assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 30 ,33))); 
    13147  
    13148             auto st2 = SysTime(DateTime(2010, 1, 1, 12, 30 ,33)); 
    13149             st2.add!"months"(-1); 
    13150             assert(st2 == SysTime(DateTime(2009, 12, 1, 12, 30 ,33))); 
    13151  
    13152             auto st3 = SysTime(DateTime(1999, 1, 29, 12, 30 ,33)); 
    13153             st3.add!"months"(1); 
    13154             assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 30 ,33))); 
    13155  
    13156             auto st4 = SysTime(DateTime(1999, 1, 29, 12, 30 ,33)); 
    13157             st4.add!"months"(1, AllowDayOverflow.no); 
    13158             assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 30 ,33))); 
    13159         } 
    13160     } 
    13161  
    13162     //Test add!"months"() with AllowDayOverlow.no 
    13163     unittest 
    13164     { 
    13165         version(testStdDateTime) 
    13166         { 
    13167             //Test A.D. 
    13168             { 
    13169                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13170                 sysTime.add!"months"(3, AllowDayOverflow.no); 
    13171                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    13172                 sysTime.add!"months"(-4, AllowDayOverflow.no); 
    13173                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    13174             } 
    13175  
    13176             { 
    13177                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13178                 sysTime.add!"months"(6, AllowDayOverflow.no); 
    13179                 assertPred!"=="(sysTime, SysTime(Date(2000, 1, 6))); 
    13180                 sysTime.add!"months"(-6, AllowDayOverflow.no); 
    13181                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
    13182             } 
    13183  
    13184             { 
    13185                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13186                 sysTime.add!"months"(27, AllowDayOverflow.no); 
    13187                 assertPred!"=="(sysTime, SysTime(Date(2001, 10, 6))); 
    13188                 sysTime.add!"months"(-28, AllowDayOverflow.no); 
    13189                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    13190             } 
    13191  
    13192             { 
    13193                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    13194                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13195                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 30))); 
    13196             } 
    13197  
    13198             { 
    13199                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    13200                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13201                 assertPred!"=="(sysTime, SysTime(Date(1999, 4, 30))); 
    13202             } 
    13203  
    13204             { 
    13205                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    13206                 sysTime.add!"months"(12, AllowDayOverflow.no); 
    13207                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 28))); 
    13208             } 
    13209  
    13210             { 
    13211                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    13212                 sysTime.add!"months"(12, AllowDayOverflow.no); 
    13213                 assertPred!"=="(sysTime, SysTime(Date(2001, 2, 28))); 
    13214             } 
    13215  
    13216             { 
    13217                 auto sysTime = SysTime(Date(1999, 7, 31)); 
    13218                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13219                 assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
    13220                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13221                 assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
    13222             } 
    13223  
    13224             { 
    13225                 auto sysTime = SysTime(Date(1998, 8, 31)); 
    13226                 sysTime.add!"months"(13, AllowDayOverflow.no); 
    13227                 assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
    13228                 sysTime.add!"months"(-13, AllowDayOverflow.no); 
    13229                 assertPred!"=="(sysTime, SysTime(Date(1998, 8, 30))); 
    13230             } 
    13231  
    13232             { 
    13233                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    13234                 sysTime.add!"months"(13, AllowDayOverflow.no); 
    13235                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 31))); 
    13236                 sysTime.add!"months"(-13, AllowDayOverflow.no); 
    13237                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
    13238             } 
    13239  
    13240             { 
    13241                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    13242                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13243                 assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
    13244                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13245                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 28))); 
    13246             } 
    13247  
    13248             { 
    13249                 auto sysTime = SysTime(Date(1998, 12, 31)); 
    13250                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13251                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
    13252                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13253                 assertPred!"=="(sysTime, SysTime(Date(1998, 12, 29))); 
    13254             } 
    13255  
    13256             { 
    13257                 auto sysTime = SysTime(Date(1999, 12, 31)); 
    13258                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13259                 assertPred!"=="(sysTime, SysTime(Date(2001, 2, 28))); 
    13260                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13261                 assertPred!"=="(sysTime, SysTime(Date(1999, 12, 28))); 
    13262             } 
    13263  
    13264             { 
    13265                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    13266                 sysTime.add!"months"(3, AllowDayOverflow.no); 
    13267                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13268                 sysTime.add!"months"(-4, AllowDayOverflow.no); 
    13269                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13270             } 
    13271  
    13272             { 
    13273                 auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13274                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13275                 assertPred!"=="(sysTime, SysTime(DateTime(2000, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13276                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13277                 assertPred!"=="(sysTime, SysTime(DateTime(1998, 12, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13278             } 
    13279  
    13280             { 
    13281                 auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13282                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13283                 assertPred!"=="(sysTime, SysTime(DateTime(2001, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13284                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13285                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13286             } 
    13287  
    13288             //Test B.C. 
    13289             { 
    13290                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13291                 sysTime.add!"months"(3, AllowDayOverflow.no); 
    13292                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
    13293                 sysTime.add!"months"(-4, AllowDayOverflow.no); 
    13294                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
    13295             } 
    13296  
    13297             { 
    13298                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13299                 sysTime.add!"months"(6, AllowDayOverflow.no); 
    13300                 assertPred!"=="(sysTime, SysTime(Date(-1998, 1, 6))); 
    13301                 sysTime.add!"months"(-6, AllowDayOverflow.no); 
    13302                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
    13303             } 
    13304  
    13305             { 
    13306                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13307                 sysTime.add!"months"(-27, AllowDayOverflow.no); 
    13308                 assertPred!"=="(sysTime, SysTime(Date(-2001, 4, 6))); 
    13309                 sysTime.add!"months"(28, AllowDayOverflow.no); 
    13310                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
    13311             } 
    13312  
    13313             { 
    13314                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    13315                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13316                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 30))); 
    13317             } 
    13318  
    13319             { 
    13320                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    13321                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13322                 assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 30))); 
    13323             } 
    13324  
    13325             { 
    13326                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    13327                 sysTime.add!"months"(-12, AllowDayOverflow.no); 
    13328                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 28))); 
    13329             } 
    13330  
    13331             { 
    13332                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    13333                 sysTime.add!"months"(-12, AllowDayOverflow.no); 
    13334                 assertPred!"=="(sysTime, SysTime(Date(-2001, 2, 28))); 
    13335             } 
    13336  
    13337             { 
    13338                 auto sysTime = SysTime(Date(-1999, 7, 31)); 
    13339                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13340                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
    13341                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13342                 assertPred!"=="(sysTime, SysTime(Date(-1999, 9, 30))); 
    13343             } 
    13344  
    13345             { 
    13346                 auto sysTime = SysTime(Date(-1998, 8, 31)); 
    13347                 sysTime.add!"months"(13, AllowDayOverflow.no); 
    13348                 assertPred!"=="(sysTime, SysTime(Date(-1997, 9, 30))); 
    13349                 sysTime.add!"months"(-13, AllowDayOverflow.no); 
    13350                 assertPred!"=="(sysTime, SysTime(Date(-1998, 8, 30))); 
    13351             } 
    13352  
    13353             { 
    13354                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    13355                 sysTime.add!"months"(13, AllowDayOverflow.no); 
    13356                 assertPred!"=="(sysTime, SysTime(Date(-1995, 1, 31))); 
    13357                 sysTime.add!"months"(-13, AllowDayOverflow.no); 
    13358                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
    13359             } 
    13360  
    13361             { 
    13362                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    13363                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13364                 assertPred!"=="(sysTime, SysTime(Date(-1995, 2, 28))); 
    13365                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13366                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 28))); 
    13367             } 
    13368  
    13369             { 
    13370                 auto sysTime = SysTime(Date(-2002, 12, 31)); 
    13371                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13372                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
    13373                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13374                 assertPred!"=="(sysTime, SysTime(Date(-2002, 12, 29))); 
    13375             } 
    13376  
    13377             { 
    13378                 auto sysTime = SysTime(Date(-2001, 12, 31)); 
    13379                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13380                 assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
    13381                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13382                 assertPred!"=="(sysTime, SysTime(Date(-2001, 12, 28))); 
    13383             } 
    13384  
    13385             { 
    13386                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    13387                 sysTime.add!"months"(3, AllowDayOverflow.no); 
    13388                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13389                 sysTime.add!"months"(-4, AllowDayOverflow.no); 
    13390                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13391             } 
    13392  
    13393             { 
    13394                 auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13395                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13396                 assertPred!"=="(sysTime, SysTime(DateTime(-2000, 2, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13397                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13398                 assertPred!"=="(sysTime, SysTime(DateTime(-2002, 12, 29, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13399             } 
    13400  
    13401             { 
    13402                 auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13403                 sysTime.add!"months"(14, AllowDayOverflow.no); 
    13404                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13405                 sysTime.add!"months"(-14, AllowDayOverflow.no); 
    13406                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13407             } 
    13408  
    13409             //Test Both 
    13410             { 
    13411                 auto sysTime = SysTime(Date(1, 1, 1)); 
    13412                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13413                 assertPred!"=="(sysTime, SysTime(Date(0, 12, 1))); 
    13414                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13415                 assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
    13416             } 
    13417  
    13418             { 
    13419                 auto sysTime = SysTime(Date(4, 1, 1)); 
    13420                 sysTime.add!"months"(-48, AllowDayOverflow.no); 
    13421                 assertPred!"=="(sysTime, SysTime(Date(0, 1, 1))); 
    13422                 sysTime.add!"months"(48, AllowDayOverflow.no); 
    13423                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    13424             } 
    13425  
    13426             { 
    13427                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13428                 sysTime.add!"months"(-49, AllowDayOverflow.no); 
    13429                 assertPred!"=="(sysTime, SysTime(Date(0, 2, 29))); 
    13430                 sysTime.add!"months"(49, AllowDayOverflow.no); 
    13431                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
    13432             } 
    13433  
    13434             { 
    13435                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13436                 sysTime.add!"months"(-85, AllowDayOverflow.no); 
    13437                 assertPred!"=="(sysTime, SysTime(Date(-3, 2, 28))); 
    13438                 sysTime.add!"months"(85, AllowDayOverflow.no); 
    13439                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 28))); 
    13440             } 
    13441  
    13442             { 
    13443                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13444                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13445                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13446                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13447                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13448             } 
    13449  
    13450             { 
    13451                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13452                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13453                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13454                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13455                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13456             } 
    13457  
    13458             { 
    13459                 auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13460                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13461                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13462                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13463                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13464             } 
    13465  
    13466             { 
    13467                 auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13468                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13469                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13470                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13471                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13472             } 
    13473  
    13474             { 
    13475                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
    13476                 sysTime.add!"months"(-1, AllowDayOverflow.no); 
    13477                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13478                 sysTime.add!"months"(1, AllowDayOverflow.no); 
    13479                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13480             } 
    13481  
    13482             { 
    13483                 auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13484                 sysTime.add!"months"(-85, AllowDayOverflow.no); 
    13485                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 2, 28, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13486                 sysTime.add!"months"(85, AllowDayOverflow.no); 
    13487                 assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 28, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13488             } 
    13489  
    13490             { 
    13491                 auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13492                 sysTime.add!"months"(85, AllowDayOverflow.no); 
    13493                 assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13494                 sysTime.add!"months"(-85, AllowDayOverflow.no); 
    13495                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13496             } 
    13497         } 
    13498     } 
    13499  
    13500  
    13501     /++ 
    13502         Adds the given number of years to this SysTime. A negative number will 
    13503         subtract. 
    13504  
    13505         For years, because they are the largest unit in SysTime, there is no 
    13506         difference between adding or rolling. 
    13507  
    13508         Params: 
    13509             years         = The number of years to add to this SysTime. 
    13510             allowOverflow = Whether the days should be allowed to overflow, 
    13511                             causing the month to increment. 
    13512       +/ 
    13513     /+ref SysTime+/ void roll(string units)(long years, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
    13514         if(units == "years") 
    13515     { 
    13516         add!"years"(years, allowOverflow); 
    13517     } 
    13518  
    13519     unittest 
    13520     { 
    13521         version(testStdDateTime) 
    13522         { 
    13523             auto st = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13524             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13525             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13526             static assert(__traits(compiles, st.roll!"years"(4))); 
    13527             static assert(!__traits(compiles, cst.roll!"years"(4))); 
    13528             //static assert(!__traits(compiles, ist.roll!"years"(4))); 
    13529         } 
    13530     } 
    13531  
    13532  
    13533     /++ 
    13534         Adds the given number of months to this SysTime. A negative number will 
    13535         subtract. 
    13536  
    13537         The difference between rolling and adding is that rolling does not affect 
    13538         larger units. So, if you roll the SysTime 12 months, you get the exact 
    13539         same SysTime. However, the days can still be affected due to the differing 
    13540         number of days in each month. 
    13541  
    13542         Params: 
    13543             months        = The number of months to add to this SysTime. 
    13544             allowOverflow = Whether the days should be allowed to overflow, 
    13545                             causing the month to increment. 
    13546  
    13547         Examples: 
    13548 -------------------- 
    13549 auto st1 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
    13550 st1.roll!"months"(1); 
    13551 assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 33, 33))); 
    13552  
    13553 auto st2 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
    13554 st2.roll!"months"(-1); 
    13555 assert(st2 == SysTime(DateTime(2010, 12, 1, 12, 33, 33))); 
    13556  
    13557 auto st3 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
    13558 st3.roll!"months"(1); 
    13559 assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 33, 33))); 
    13560  
    13561 auto st4 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
    13562 st4.roll!"months"(1, AllowDayOverflow.no); 
    13563 assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 33, 33))); 
    13564 -------------------- 
    13565       +/ 
    13566     /+ref SysTime+/ void roll(string units)(long months, AllowDayOverflow allowOverflow = AllowDayOverflow.yes) nothrow 
    13567         if(units == "months") 
    13568     { 
    13569         auto hnsecs = adjTime; 
    13570         auto days = splitUnitsFromHNSecs!"days"(hnsecs) + 1; 
    13571  
    13572         if(hnsecs < 0) 
    13573         { 
    13574             hnsecs += convert!("hours", "hnsecs")(24); 
    13575             --days; 
    13576         } 
    13577  
    13578         auto date = Date(cast(int)days); 
    13579         date.roll!"months"(months, allowOverflow); 
    13580         days = date.dayOfGregorianCal - 1; 
    13581  
    13582         if(days < 0) 
    13583         { 
    13584             hnsecs -= convert!("hours", "hnsecs")(24); 
    13585             ++days; 
    13586         } 
    13587  
    13588         immutable newDaysHNSecs = convert!("days", "hnsecs")(days); 
    13589  
    13590         adjTime = newDaysHNSecs + hnsecs; 
    13591     } 
    13592  
    13593     //Test roll!"months"() with AllowDayOverlow.yes 
    13594     unittest 
    13595     { 
    13596         version(testStdDateTime) 
    13597         { 
    13598             //Test A.D. 
    13599             { 
    13600                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13601                 sysTime.roll!"months"(3); 
    13602                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    13603                 sysTime.roll!"months"(-4); 
    13604                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    13605             } 
    13606  
    13607             { 
    13608                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13609                 sysTime.roll!"months"(6); 
    13610                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 6))); 
    13611                 sysTime.roll!"months"(-6); 
    13612                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
    13613             } 
    13614  
    13615             { 
    13616                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13617                 sysTime.roll!"months"(27); 
    13618                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    13619                 sysTime.roll!"months"(-28); 
    13620                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    13621             } 
    13622  
    13623             { 
    13624                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    13625                 sysTime.roll!"months"(1); 
    13626                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 1))); 
    13627             } 
    13628  
    13629             { 
    13630                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    13631                 sysTime.roll!"months"(-1); 
    13632                 assertPred!"=="(sysTime, SysTime(Date(1999, 5, 1))); 
    13633             } 
    13634  
    13635             { 
    13636                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    13637                 sysTime.roll!"months"(12); 
    13638                 assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
    13639             } 
    13640  
    13641             { 
    13642                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    13643                 sysTime.roll!"months"(12); 
    13644                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
    13645             } 
    13646  
    13647             { 
    13648                 auto sysTime = SysTime(Date(1999, 7, 31)); 
    13649                 sysTime.roll!"months"(1); 
    13650                 assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
    13651                 sysTime.roll!"months"(1); 
    13652                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 1))); 
    13653             } 
    13654  
    13655             { 
    13656                 auto sysTime = SysTime(Date(1998, 8, 31)); 
    13657                 sysTime.roll!"months"(13); 
    13658                 assertPred!"=="(sysTime, SysTime(Date(1998, 10, 1))); 
    13659                 sysTime.roll!"months"(-13); 
    13660                 assertPred!"=="(sysTime, SysTime(Date(1998, 9, 1))); 
    13661             } 
    13662  
    13663             { 
    13664                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    13665                 sysTime.roll!"months"(13); 
    13666                 assertPred!"=="(sysTime, SysTime(Date(1997, 1, 31))); 
    13667                 sysTime.roll!"months"(-13); 
    13668                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
    13669             } 
    13670  
    13671             { 
    13672                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    13673                 sysTime.roll!"months"(14); 
    13674                 assertPred!"=="(sysTime, SysTime(Date(1997, 3, 3))); 
    13675                 sysTime.roll!"months"(-14); 
    13676                 assertPred!"=="(sysTime, SysTime(Date(1997, 1, 3))); 
    13677             } 
    13678  
    13679             { 
    13680                 auto sysTime = SysTime(Date(1998, 12, 31)); 
    13681                 sysTime.roll!"months"(14); 
    13682                 assertPred!"=="(sysTime, SysTime(Date(1998, 3, 3))); 
    13683                 sysTime.roll!"months"(-14); 
    13684                 assertPred!"=="(sysTime, SysTime(Date(1998, 1, 3))); 
    13685             } 
    13686  
    13687             { 
    13688                 auto sysTime = SysTime(Date(1999, 12, 31)); 
    13689                 sysTime.roll!"months"(14); 
    13690                 assertPred!"=="(sysTime, SysTime(Date(1999, 3, 3))); 
    13691                 sysTime.roll!"months"(-14); 
    13692                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 3))); 
    13693             } 
    13694  
    13695             { 
    13696                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    13697                 sysTime.roll!"months"(3); 
    13698                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13699                 sysTime.roll!"months"(-4); 
    13700                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    13701             } 
    13702  
    13703             { 
    13704                 auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13705                 sysTime.roll!"months"(14); 
    13706                 assertPred!"=="(sysTime, SysTime(DateTime(1998, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13707                 sysTime.roll!"months"(-14); 
    13708                 assertPred!"=="(sysTime, SysTime(DateTime(1998, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13709             } 
    13710  
    13711             { 
    13712                 auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13713                 sysTime.roll!"months"(14); 
    13714                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13715                 sysTime.roll!"months"(-14); 
    13716                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13717             } 
    13718  
    13719             //Test B.C. 
    13720             { 
    13721                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13722                 sysTime.roll!"months"(3); 
    13723                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
    13724                 sysTime.roll!"months"(-4); 
    13725                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
    13726             } 
    13727  
    13728             { 
    13729                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13730                 sysTime.roll!"months"(6); 
    13731                 assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 6))); 
    13732                 sysTime.roll!"months"(-6); 
    13733                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
    13734             } 
    13735  
    13736             { 
    13737                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    13738                 sysTime.roll!"months"(-27); 
    13739                 assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 6))); 
    13740                 sysTime.roll!"months"(28); 
    13741                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
    13742             } 
    13743  
    13744             { 
    13745                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    13746                 sysTime.roll!"months"(1); 
    13747                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 1))); 
    13748             } 
    13749  
    13750             { 
    13751                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    13752                 sysTime.roll!"months"(-1); 
    13753                 assertPred!"=="(sysTime, SysTime(Date(-1999, 5, 1))); 
    13754             } 
    13755  
    13756             { 
    13757                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    13758                 sysTime.roll!"months"(-12); 
    13759                 assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
    13760             } 
    13761  
    13762             { 
    13763                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    13764                 sysTime.roll!"months"(-12); 
    13765                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
    13766             } 
    13767  
    13768             { 
    13769                 auto sysTime = SysTime(Date(-1999, 7, 31)); 
    13770                 sysTime.roll!"months"(1); 
    13771                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
    13772                 sysTime.roll!"months"(1); 
    13773                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 1))); 
    13774             } 
    13775  
    13776             { 
    13777                 auto sysTime = SysTime(Date(-1998, 8, 31)); 
    13778                 sysTime.roll!"months"(13); 
    13779                 assertPred!"=="(sysTime, SysTime(Date(-1998, 10, 1))); 
    13780                 sysTime.roll!"months"(-13); 
    13781                 assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 1))); 
    13782             } 
    13783  
    13784             { 
    13785                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    13786                 sysTime.roll!"months"(13); 
    13787                 assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 31))); 
    13788                 sysTime.roll!"months"(-13); 
    13789                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
    13790             } 
    13791  
    13792             { 
    13793                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    13794                 sysTime.roll!"months"(14); 
    13795                 assertPred!"=="(sysTime, SysTime(Date(-1997, 3, 3))); 
    13796                 sysTime.roll!"months"(-14); 
    13797                 assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 3))); 
    13798             } 
    13799  
    13800             { 
    13801                 auto sysTime = SysTime(Date(-2002, 12, 31)); 
    13802                 sysTime.roll!"months"(14); 
    13803                 assertPred!"=="(sysTime, SysTime(Date(-2002, 3, 3))); 
    13804                 sysTime.roll!"months"(-14); 
    13805                 assertPred!"=="(sysTime, SysTime(Date(-2002, 1, 3))); 
    13806             } 
    13807  
    13808             { 
    13809                 auto sysTime = SysTime(Date(-2001, 12, 31)); 
    13810                 sysTime.roll!"months"(14); 
    13811                 assertPred!"=="(sysTime, SysTime(Date(-2001, 3, 3))); 
    13812                 sysTime.roll!"months"(-14); 
    13813                 assertPred!"=="(sysTime, SysTime(Date(-2001, 1, 3))); 
    13814             } 
    13815  
    13816             { 
    13817                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13818                 sysTime.roll!"months"(-1); 
    13819                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13820                 sysTime.roll!"months"(1); 
    13821                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13822             } 
    13823  
    13824             { 
    13825                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13826                 sysTime.roll!"months"(-1); 
    13827                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13828                 sysTime.roll!"months"(1); 
    13829                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13830             } 
    13831  
    13832             { 
    13833                 auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    13834                 sysTime.roll!"months"(1); 
    13835                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13836                 sysTime.roll!"months"(-1); 
    13837                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    13838             } 
    13839  
    13840             { 
    13841                 auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    13842                 sysTime.roll!"months"(1); 
    13843                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13844                 sysTime.roll!"months"(-1); 
    13845                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    13846             } 
    13847  
    13848             { 
    13849                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007)); 
    13850                 sysTime.roll!"months"(3); 
    13851                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007))); 
    13852                 sysTime.roll!"months"(-4); 
    13853                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"hnsecs"(5007))); 
    13854             } 
    13855  
    13856             { 
    13857                 auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13858                 sysTime.roll!"months"(14); 
    13859                 assertPred!"=="(sysTime, SysTime(DateTime(-2002, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13860                 sysTime.roll!"months"(-14); 
    13861                 assertPred!"=="(sysTime, SysTime(DateTime(-2002, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13862             } 
    13863  
    13864             { 
    13865                 auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    13866                 sysTime.roll!"months"(14); 
    13867                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 3, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13868                 sysTime.roll!"months"(-14); 
    13869                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 1, 3, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    13870             } 
    13871  
    13872             //Test Both 
    13873             { 
    13874                 auto sysTime = SysTime(Date(1, 1, 1)); 
    13875                 sysTime.roll!"months"(-1); 
    13876                 assertPred!"=="(sysTime, SysTime(Date(1, 12, 1))); 
    13877                 sysTime.roll!"months"(1); 
    13878                 assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
    13879             } 
    13880  
    13881             { 
    13882                 auto sysTime = SysTime(Date(4, 1, 1)); 
    13883                 sysTime.roll!"months"(-48); 
    13884                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    13885                 sysTime.roll!"months"(48); 
    13886                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    13887             } 
    13888  
    13889             { 
    13890                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13891                 sysTime.roll!"months"(-49); 
    13892                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 2))); 
    13893                 sysTime.roll!"months"(49); 
    13894                 assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
    13895             } 
    13896  
    13897             { 
    13898                 auto sysTime = SysTime(Date(4, 3, 31)); 
    13899                 sysTime.roll!"months"(-85); 
    13900                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 2))); 
    13901                 sysTime.roll!"months"(85); 
    13902                 assertPred!"=="(sysTime, SysTime(Date(4, 4, 2))); 
    13903             } 
    13904  
    13905             { 
    13906                 auto sysTime = SysTime(Date(-1, 1, 1)); 
    13907                 sysTime.roll!"months"(-1); 
    13908                 assertPred!"=="(sysTime, SysTime(Date(-1, 12, 1))); 
    13909                 sysTime.roll!"months"(1); 
    13910                 assertPred!"=="(sysTime, SysTime(Date(-1, 1, 1))); 
    13911             } 
    13912  
    13913             { 
    13914                 auto sysTime = SysTime(Date(-4, 1, 1)); 
    13915                 sysTime.roll!"months"(-48); 
    13916                 assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
    13917                 sysTime.roll!"months"(48); 
    13918                 assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
    13919             } 
    13920  
    13921             { 
    13922                 auto sysTime = SysTime(Date(-4, 3, 31)); 
    13923                 sysTime.roll!"months"(-49); 
    13924                 assertPred!"=="(sysTime, SysTime(Date(-4, 3, 2))); 
    13925                 sysTime.roll!"months"(49); 
    13926                 assertPred!"=="(sysTime, SysTime(Date(-4, 4, 2))); 
    13927             } 
    13928  
    13929             { 
    13930                 auto sysTime = SysTime(Date(-4, 3, 31)); 
    13931                 sysTime.roll!"months"(-85); 
    13932                 assertPred!"=="(sysTime, SysTime(Date(-4, 3, 2))); 
    13933                 sysTime.roll!"months"(85); 
    13934                 assertPred!"=="(sysTime, SysTime(Date(-4, 4, 2))); 
    13935             } 
    13936  
    13937             { 
    13938                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
    13939                 sysTime.roll!"months"(-1); 
    13940                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13941                 sysTime.roll!"months"(1); 
    13942                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    13943             } 
    13944  
    13945             { 
    13946                 auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13947                 sysTime.roll!"months"(-85); 
    13948                 assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 2, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13949                 sysTime.roll!"months"(85); 
    13950                 assertPred!"=="(sysTime, SysTime(DateTime(4, 4, 2, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13951             } 
    13952  
    13953             { 
    13954                 auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    13955                 sysTime.roll!"months"(85); 
    13956                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 5, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13957                 sysTime.roll!"months"(-85); 
    13958                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 1, 12, 11, 10), FracSec.from!"msecs"(9))); 
    13959             } 
    13960  
    13961             const cst = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13962             //immutable ist = SysTime(DateTime(1999, 7, 6, 12, 30, 33)); 
    13963             static assert(!__traits(compiles, cst.roll!"months"(4))); 
    13964             //static assert(!__traits(compiles, ist.roll!"months"(4))); 
    13965  
    13966             //Verify Examples. 
    13967             auto st1 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
    13968             st1.roll!"months"(1); 
    13969             assert(st1 == SysTime(DateTime(2010, 2, 1, 12, 33, 33))); 
    13970  
    13971             auto st2 = SysTime(DateTime(2010, 1, 1, 12, 33, 33)); 
    13972             st2.roll!"months"(-1); 
    13973             assert(st2 == SysTime(DateTime(2010, 12, 1, 12, 33, 33))); 
    13974  
    13975             auto st3 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
    13976             st3.roll!"months"(1); 
    13977             assert(st3 == SysTime(DateTime(1999, 3, 1, 12, 33, 33))); 
    13978  
    13979             auto st4 = SysTime(DateTime(1999, 1, 29, 12, 33, 33)); 
    13980             st4.roll!"months"(1, AllowDayOverflow.no); 
    13981             assert(st4 == SysTime(DateTime(1999, 2, 28, 12, 33, 33))); 
    13982         } 
    13983     } 
    13984  
    13985     //Test roll!"months"() with AllowDayOverlow.no 
    13986     unittest 
    13987     { 
    13988         version(testStdDateTime) 
    13989         { 
    13990             //Test A.D. 
    13991             { 
    13992                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    13993                 sysTime.roll!"months"(3, AllowDayOverflow.no); 
    13994                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    13995                 sysTime.roll!"months"(-4, AllowDayOverflow.no); 
    13996                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    13997             } 
    13998  
    13999             { 
    14000                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    14001                 sysTime.roll!"months"(6, AllowDayOverflow.no); 
    14002                 assertPred!"=="(sysTime, SysTime(Date(1999, 1, 6))); 
    14003                 sysTime.roll!"months"(-6, AllowDayOverflow.no); 
    14004                 assertPred!"=="(sysTime, SysTime(Date(1999, 7, 6))); 
    14005             } 
    14006  
    14007             { 
    14008                 auto sysTime = SysTime(Date(1999, 7, 6)); 
    14009                 sysTime.roll!"months"(27, AllowDayOverflow.no); 
    14010                 assertPred!"=="(sysTime, SysTime(Date(1999, 10, 6))); 
    14011                 sysTime.roll!"months"(-28, AllowDayOverflow.no); 
    14012                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 6))); 
    14013             } 
    14014  
    14015             { 
    14016                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    14017                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14018                 assertPred!"=="(sysTime, SysTime(Date(1999, 6, 30))); 
    14019             } 
    14020  
    14021             { 
    14022                 auto sysTime = SysTime(Date(1999, 5, 31)); 
    14023                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14024                 assertPred!"=="(sysTime, SysTime(Date(1999, 4, 30))); 
    14025             } 
    14026  
    14027             { 
    14028                 auto sysTime = SysTime(Date(1999, 2, 28)); 
    14029                 sysTime.roll!"months"(12, AllowDayOverflow.no); 
    14030                 assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
    14031             } 
    14032  
    14033             { 
    14034                 auto sysTime = SysTime(Date(2000, 2, 29)); 
    14035                 sysTime.roll!"months"(12, AllowDayOverflow.no); 
    14036                 assertPred!"=="(sysTime, SysTime(Date(2000, 2, 29))); 
    14037             } 
    14038  
    14039             { 
    14040                 auto sysTime = SysTime(Date(1999, 7, 31)); 
    14041                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14042                 assertPred!"=="(sysTime, SysTime(Date(1999, 8, 31))); 
    14043                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14044                 assertPred!"=="(sysTime, SysTime(Date(1999, 9, 30))); 
    14045             } 
    14046  
    14047             { 
    14048                 auto sysTime = SysTime(Date(1998, 8, 31)); 
    14049                 sysTime.roll!"months"(13, AllowDayOverflow.no); 
    14050                 assertPred!"=="(sysTime, SysTime(Date(1998, 9, 30))); 
    14051                 sysTime.roll!"months"(-13, AllowDayOverflow.no); 
    14052                 assertPred!"=="(sysTime, SysTime(Date(1998, 8, 30))); 
    14053             } 
    14054  
    14055             { 
    14056                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    14057                 sysTime.roll!"months"(13, AllowDayOverflow.no); 
    14058                 assertPred!"=="(sysTime, SysTime(Date(1997, 1, 31))); 
    14059                 sysTime.roll!"months"(-13, AllowDayOverflow.no); 
    14060                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 31))); 
    14061             } 
    14062  
    14063             { 
    14064                 auto sysTime = SysTime(Date(1997, 12, 31)); 
    14065                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14066                 assertPred!"=="(sysTime, SysTime(Date(1997, 2, 28))); 
    14067                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14068                 assertPred!"=="(sysTime, SysTime(Date(1997, 12, 28))); 
    14069             } 
    14070  
    14071             { 
    14072                 auto sysTime = SysTime(Date(1998, 12, 31)); 
    14073                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14074                 assertPred!"=="(sysTime, SysTime(Date(1998, 2, 28))); 
    14075                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14076                 assertPred!"=="(sysTime, SysTime(Date(1998, 12, 28))); 
    14077             } 
    14078  
    14079             { 
    14080                 auto sysTime = SysTime(Date(1999, 12, 31)); 
    14081                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14082                 assertPred!"=="(sysTime, SysTime(Date(1999, 2, 28))); 
    14083                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14084                 assertPred!"=="(sysTime, SysTime(Date(1999, 12, 28))); 
    14085             } 
    14086  
    14087             { 
    14088                 auto sysTime = SysTime(DateTime(1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    14089                 sysTime.roll!"months"(3, AllowDayOverflow.no); 
    14090                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    14091                 sysTime.roll!"months"(-4, AllowDayOverflow.no); 
    14092                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    14093             } 
    14094  
    14095             { 
    14096                 auto sysTime = SysTime(DateTime(1998, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    14097                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14098                 assertPred!"=="(sysTime, SysTime(DateTime(1998, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14099                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14100                 assertPred!"=="(sysTime, SysTime(DateTime(1998, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14101             } 
    14102  
    14103             { 
    14104                 auto sysTime = SysTime(DateTime(1999, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    14105                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14106                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14107                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14108                 assertPred!"=="(sysTime, SysTime(DateTime(1999, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14109             } 
    14110  
    14111             //Test B.C. 
    14112             { 
    14113                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    14114                 sysTime.roll!"months"(3, AllowDayOverflow.no); 
    14115                 assertPred!"=="(sysTime, SysTime(Date(-1999, 10, 6))); 
    14116                 sysTime.roll!"months"(-4, AllowDayOverflow.no); 
    14117                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 6))); 
    14118             } 
    14119  
    14120             { 
    14121                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    14122                 sysTime.roll!"months"(6, AllowDayOverflow.no); 
    14123                 assertPred!"=="(sysTime, SysTime(Date(-1999, 1, 6))); 
    14124                 sysTime.roll!"months"(-6, AllowDayOverflow.no); 
    14125                 assertPred!"=="(sysTime, SysTime(Date(-1999, 7, 6))); 
    14126             } 
    14127  
    14128             { 
    14129                 auto sysTime = SysTime(Date(-1999, 7, 6)); 
    14130                 sysTime.roll!"months"(-27, AllowDayOverflow.no); 
    14131                 assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 6))); 
    14132                 sysTime.roll!"months"(28, AllowDayOverflow.no); 
    14133                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 6))); 
    14134             } 
    14135  
    14136             { 
    14137                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    14138                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14139                 assertPred!"=="(sysTime, SysTime(Date(-1999, 6, 30))); 
    14140             } 
    14141  
    14142             { 
    14143                 auto sysTime = SysTime(Date(-1999, 5, 31)); 
    14144                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14145                 assertPred!"=="(sysTime, SysTime(Date(-1999, 4, 30))); 
    14146             } 
    14147  
    14148             { 
    14149                 auto sysTime = SysTime(Date(-1999, 2, 28)); 
    14150                 sysTime.roll!"months"(-12, AllowDayOverflow.no); 
    14151                 assertPred!"=="(sysTime, SysTime(Date(-1999, 2, 28))); 
    14152             } 
    14153  
    14154             { 
    14155                 auto sysTime = SysTime(Date(-2000, 2, 29)); 
    14156                 sysTime.roll!"months"(-12, AllowDayOverflow.no); 
    14157                 assertPred!"=="(sysTime, SysTime(Date(-2000, 2, 29))); 
    14158             } 
    14159  
    14160             { 
    14161                 auto sysTime = SysTime(Date(-1999, 7, 31)); 
    14162                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14163                 assertPred!"=="(sysTime, SysTime(Date(-1999, 8, 31))); 
    14164                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14165                 assertPred!"=="(sysTime, SysTime(Date(-1999, 9, 30))); 
    14166             } 
    14167  
    14168             { 
    14169                 auto sysTime = SysTime(Date(-1998, 8, 31)); 
    14170                 sysTime.roll!"months"(13, AllowDayOverflow.no); 
    14171                 assertPred!"=="(sysTime, SysTime(Date(-1998, 9, 30))); 
    14172                 sysTime.roll!"months"(-13, AllowDayOverflow.no); 
    14173                 assertPred!"=="(sysTime, SysTime(Date(-1998, 8, 30))); 
    14174             } 
    14175  
    14176             { 
    14177                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    14178                 sysTime.roll!"months"(13, AllowDayOverflow.no); 
    14179                 assertPred!"=="(sysTime, SysTime(Date(-1997, 1, 31))); 
    14180                 sysTime.roll!"months"(-13, AllowDayOverflow.no); 
    14181                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 31))); 
    14182             } 
    14183  
    14184             { 
    14185                 auto sysTime = SysTime(Date(-1997, 12, 31)); 
    14186                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14187                 assertPred!"=="(sysTime, SysTime(Date(-1997, 2, 28))); 
    14188                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14189                 assertPred!"=="(sysTime, SysTime(Date(-1997, 12, 28))); 
    14190             } 
    14191  
    14192             { 
    14193                 auto sysTime = SysTime(Date(-2002, 12, 31)); 
    14194                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14195                 assertPred!"=="(sysTime, SysTime(Date(-2002, 2, 28))); 
    14196                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14197                 assertPred!"=="(sysTime, SysTime(Date(-2002, 12, 28))); 
    14198             } 
    14199  
    14200             { 
    14201                 auto sysTime = SysTime(Date(-2001, 12, 31)); 
    14202                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14203                 assertPred!"=="(sysTime, SysTime(Date(-2001, 2, 28))); 
    14204                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14205                 assertPred!"=="(sysTime, SysTime(Date(-2001, 12, 28))); 
    14206             } 
    14207  
    14208             { 
    14209                 auto sysTime = SysTime(DateTime(-1999, 7, 6, 12, 2, 7), FracSec.from!"usecs"(5007)); 
    14210                 sysTime.roll!"months"(3, AllowDayOverflow.no); 
    14211                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 10, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    14212                 sysTime.roll!"months"(-4, AllowDayOverflow.no); 
    14213                 assertPred!"=="(sysTime, SysTime(DateTime(-1999, 6, 6, 12, 2, 7), FracSec.from!"usecs"(5007))); 
    14214             } 
    14215  
    14216             { 
    14217                 auto sysTime = SysTime(DateTime(-2002, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    14218                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14219                 assertPred!"=="(sysTime, SysTime(DateTime(-2002, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14220                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14221                 assertPred!"=="(sysTime, SysTime(DateTime(-2002, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14222             } 
    14223  
    14224             { 
    14225                 auto sysTime = SysTime(DateTime(-2001, 12, 31, 7, 7, 7), FracSec.from!"hnsecs"(422202)); 
    14226                 sysTime.roll!"months"(14, AllowDayOverflow.no); 
    14227                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 2, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14228                 sysTime.roll!"months"(-14, AllowDayOverflow.no); 
    14229                 assertPred!"=="(sysTime, SysTime(DateTime(-2001, 12, 28, 7, 7, 7), FracSec.from!"hnsecs"(422202))); 
    14230             } 
    14231  
    14232             //Test Both 
    14233             { 
    14234                 auto sysTime = SysTime(Date(1, 1, 1)); 
    14235                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14236                 assertPred!"=="(sysTime, SysTime(Date(1, 12, 1))); 
    14237                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14238                 assertPred!"=="(sysTime, SysTime(Date(1, 1, 1))); 
    14239             } 
    14240  
    14241             { 
    14242                 auto sysTime = SysTime(Date(4, 1, 1)); 
    14243                 sysTime.roll!"months"(-48, AllowDayOverflow.no); 
    14244                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    14245                 sysTime.roll!"months"(48, AllowDayOverflow.no); 
    14246                 assertPred!"=="(sysTime, SysTime(Date(4, 1, 1))); 
    14247             } 
    14248  
    14249             { 
    14250                 auto sysTime = SysTime(Date(4, 3, 31)); 
    14251                 sysTime.roll!"months"(-49, AllowDayOverflow.no); 
    14252                 assertPred!"=="(sysTime, SysTime(Date(4, 2, 29))); 
    14253                 sysTime.roll!"months"(49, AllowDayOverflow.no); 
    14254                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
    14255             } 
    14256  
    14257             { 
    14258                 auto sysTime = SysTime(Date(4, 3, 31)); 
    14259                 sysTime.roll!"months"(-85, AllowDayOverflow.no); 
    14260                 assertPred!"=="(sysTime, SysTime(Date(4, 2, 29))); 
    14261                 sysTime.roll!"months"(85, AllowDayOverflow.no); 
    14262                 assertPred!"=="(sysTime, SysTime(Date(4, 3, 29))); 
    14263             } 
    14264  
    14265             { 
    14266                 auto sysTime = SysTime(Date(-1, 1, 1)); 
    14267                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14268                 assertPred!"=="(sysTime, SysTime(Date(-1, 12, 1))); 
    14269                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14270                 assertPred!"=="(sysTime, SysTime(Date(-1, 1, 1))); 
    14271             } 
    14272  
    14273             { 
    14274                 auto sysTime = SysTime(Date(-4, 1, 1)); 
    14275                 sysTime.roll!"months"(-48, AllowDayOverflow.no); 
    14276                 assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
    14277                 sysTime.roll!"months"(48, AllowDayOverflow.no); 
    14278                 assertPred!"=="(sysTime, SysTime(Date(-4, 1, 1))); 
    14279             } 
    14280  
    14281             { 
    14282                 auto sysTime = SysTime(Date(-4, 3, 31)); 
    14283                 sysTime.roll!"months"(-49, AllowDayOverflow.no); 
    14284                 assertPred!"=="(sysTime, SysTime(Date(-4, 2, 29))); 
    14285                 sysTime.roll!"months"(49, AllowDayOverflow.no); 
    14286                 assertPred!"=="(sysTime, SysTime(Date(-4, 3, 29))); 
    14287             } 
    14288  
    14289             { 
    14290                 auto sysTime = SysTime(Date(-4, 3, 31)); 
    14291                 sysTime.roll!"months"(-85, AllowDayOverflow.no); 
    14292                 assertPred!"=="(sysTime, SysTime(Date(-4, 2, 29))); 
    14293                 sysTime.roll!"months"(85, AllowDayOverflow.no); 
    14294                 assertPred!"=="(sysTime, SysTime(Date(-4, 3, 29))); 
    14295             } 
    14296  
    14297             { 
    14298                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    14299                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14300                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    14301                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14302                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    14303             } 
    14304  
    14305             { 
    14306                 auto sysTime = SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    14307                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14308                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    14309                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14310                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    14311             } 
    14312  
    14313             { 
    14314                 auto sysTime = SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0)); 
    14315                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14316                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    14317                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14318                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 0, 0, 0), FracSec.from!"hnsecs"(0))); 
    14319             } 
    14320  
    14321             { 
    14322                 auto sysTime = SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999)); 
    14323                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14324                 assertPred!"=="(sysTime, SysTime(DateTime(0, 1, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    14325                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14326                 assertPred!"=="(sysTime, SysTime(DateTime(0, 12, 1, 23, 59, 59), FracSec.from!"hnsecs"(9_999_999))); 
    14327             } 
    14328  
    14329             { 
    14330                 auto sysTime = SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17)); 
    14331                 sysTime.roll!"months"(-1, AllowDayOverflow.no); 
    14332                 assertPred!"=="(sysTime, SysTime(DateTime(1, 12, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    14333                 sysTime.roll!"months"(1, AllowDayOverflow.no); 
    14334                 assertPred!"=="(sysTime, SysTime(DateTime(1, 1, 1, 0, 7, 9), FracSec.from!"hnsecs"(17))); 
    14335             } 
    14336  
    14337             { 
    14338                 auto sysTime = SysTime(DateTime(4, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    14339                 sysTime.roll!"months"(-85, AllowDayOverflow.no); 
    14340                 assertPred!"=="(sysTime, SysTime(DateTime(4, 2, 29, 12, 11, 10), FracSec.from!"msecs"(9))); 
    14341                 sysTime.roll!"months"(85, AllowDayOverflow.no); 
    14342                 assertPred!"=="(sysTime, SysTime(DateTime(4, 3, 29, 12, 11, 10), FracSec.from!"msecs"(9))); 
    14343             } 
    14344  
    14345             { 
    14346                 auto sysTime = SysTime(DateTime(-3, 3, 31, 12, 11, 10), FracSec.from!"msecs"(9)); 
    14347                 sysTime.roll!"months"(85, AllowDayOverflow.no); 
    14348                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 4, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
    14349                 sysTime.roll!"months"(-85, AllowDayOverflow.no); 
    14350                 assertPred!"=="(sysTime, SysTime(DateTime(-3, 3, 30, 12, 11, 10), FracSec.from!"msecs"(9))); 
    14351             } 
    14352         } 
    14353     } 
    14354  
    14355  
    14356     /++ 
    14357         Adds the given number of days to this SysTime. A negative number will 
    14358         subtract. 
    14359  
    14360         The difference between rolling and adding is that rolling does not affect 
    14361         larger units. So, if you roll the SysTime one year's worth of days, then 
    14362         you get the exact same SysTime. 
    14363  
    14364         Note that TimeOfDay has no $(D add!"days"()) function because you can add 
    14365         days to a SysTime by adding a duration to it. 
    14366  
    14367         Params: 
    14368             days = The number of days to add to this SysTime. 
    14369  
    14370         Examples: 
    14371 -------------------- 
    14372 auto st = SysTime(DateTime(2010, 1, 1, 11, 23, 12)); 
    14373 st.roll!"days"(1); 
    14374 assert(st == SysTime(DateTime(2010, 1, 2, 11, 23, 12))); 
    14375 st.roll!"days"(365); 
    14376 assert(st == SysTime(DateTime(2010, 1, 26, 11, 23, 12))); 
    14377 st.roll!"days"(-32); 
    14378 assert(st == SysTime(DateTime(2010, 1, 25, 11, 23, 12))); 
    14379 -------------------- 
    14380       +/ 
    14381     /+ref SysTime+/ void roll(string units)(long days) nothrow 
    14382         if(units == "days") 
    14383     { 
    14384         auto hnsecs = adjTime; 
    14385         auto gdays = splitUnitsFromHNSecs!"days"(hnsecs) + 1;