Rant: Date and Time fall short of simplicity in D

Kagamin spam at here.lot
Sat Mar 30 10:42:36 PDT 2013


On Friday, 29 March 2013 at 14:03:34 UTC, Steven Schveighoffer 
wrote:
>> Another example, I once had to convert a long type which 
>> represented
>> Unix time into DateTime. Here's the code to do it:
>>
>> return 
>> cast(DateTime)SysTime(unixTimeToStdTime(cast(int)d.when.time));
>
> I have three comments here:
>
> 1. unixTimeToStdTime should take ulong.
> 2. There should be a shortcut for this.
>
> Note on Windows, given a SYSTEMTIME we can do:
>
> return cast(DateTime)SYSTEMTIMEToSysTime(t);
>
> We need an equivalent unixTimeToSysTime, and in fact, I think 
> we can get rid of unixTimeToStdTime, what is the point of that?
>
> 3. I HATE "safe" cast conversions.  If you want to make a 
> conversion, use a method/property.  I don't even know why D 
> allows overloading casting.  Casts are way too blunt for this.
>
> The code should be:
>
> return unixTimeToSysTime(d.when.time).asDateTime;

I think anything-to-anything conversion is possible.

T toTime(F,T)(F fromValue, TimeZone zone=Utc)
{
   // first make an intermediate value
   // the source type needs to support toSysTime method
   // also it should not be a primitive type
   SysTime temp = fromValue.toSysTime(zone);
   // also define an extension method for SysTime
   // for conversion to this time type
   return temp.toTime!(T);
}

unix time will need a wrapper for strong typing

struct UnixTime { int value; }
SysTime toSysTime(UnixTime fromValue, TimeZone zone=Utc)
{ return SysTime(unixTimeToStdTime(fromValue.value), zone); }

so conversion is

return UnixTime(d.when.time).toTime!DateTime;

may be it can be reduced to

return to!DateTime(UnixTime(d.when.time));


More information about the Digitalmars-d mailing list