19c19,23 < import core.sys.posix.time; --- > version (Windows) { > import core.stdc.time; > } else version (linux) { > import core.sys.posix.time; > } 20a25 > import std.string; 46,47c51,58 < auto d1 = fromString("2002-1-25"); < auto d2 = fromUndelimitedString("20020125"); --- > auto d = Date(2010, May, 31); > assert(d.toSimpleString == "2010-May-31"); > assert(d.toIsoString == "20100531"); > assert(d.toIsoExtendedString == "2010-05-31"); > auto d1 = fromString("2002-5-25"); > assert(d1 == d); > auto d2 = fromUndelimitedString("20020525"); > assert(d2 == d); 56,60c67,71 < alias ushort GregYear; < alias ushort GregMonth; < alias ushort GregDay; < alias uint GregDayOfWeek; < alias uint GregDayOfYear; --- > alias ushort GregorianYear; > alias ushort GregorianMonth; > alias ushort GregorianDay; > alias uint GregorianDayOfWeek; > alias uint GregorianDayOfYear; 62a74 > string[] months = ["January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]; 76c88 < this(uint year, uint month, uint day) --- > this(GregorianYear year, GregorianMonth month, GregorianDay day) 91c103 < @property GregYear year() const --- > @property GregorianYear year() const 107c119 < @property GregMonth month() const --- > @property GregorianMonth month() const 123c135 < @property GregDay day() const --- > @property GregorianDay day() const 139,140c151 < @property Tuple!(GregYear, GregMonth, GregDay) < yearMonthDay() const --- > @property Tuple!(GregorianYear, GregorianMonth, GregorianDay) yearMonthDay() const 156c167 < @property GregDayOfWeek dayOfWeek() const --- > @property GregorianDayOfWeek dayOfWeek() const 168c179 < @property GregDayOfYear dayOfYear() const --- > @property GregorianDayOfYear dayOfYear() const 172c183 < return cast(GregDayOfYear) doy; --- > return cast(GregorianDayOfYear) doy; 302c313 < return text(ymd._0, '-', ymd._1, '-', ymd._2); --- > return text(ymd._0, '-', months[ymd._1 - 1][0..3], '-', zfill(to!string(ymd._2), 2)); 307c318,319 < assert(0); --- > auto ymd = yearMonthDay; > return text(ymd._0, zfill(to!string(ymd._1), 2), zfill(to!string(ymd._2), 2)); 312c324,325 < assert(0); --- > auto ymd = yearMonthDay; > return text(ymd._0, '-', zfill(to!string(ymd._1), 2), '-', zfill(to!string(ymd._2), 2)); 379c392,423 < Date fromString(in char[] s) --- > /** > * Because 'split' has already been used, the weird name will be > * changed in the future when an appropriate identifier is chosen. > */ > string[] unjoin(string s, char[] ch) > { > uint start = 0; > uint i = 0; > string[] result; > > for (i = 0; i < s.length; i++) { > if (indexOf(ch, s[i]) != -1) { > result ~= s[start..i]; > start = i + 1; > } > } > if (start < i) { > result ~= s[start..$]; > } > return result; > } > > unittest { > string s = "2010-05-31"; > string[] r = unjoin(s, ['/', '-', '.', ',', '\\']); > assert(r[0] == "2010"); > assert(r[1] == "05"); > assert(r[2] == "31"); > } > > //Date fromString(in char[] s) > Date fromString(in string s) 381a426,431 > string[] r = unjoin(s, ['/', '-', '.', '\\']); > if (r.length == 0) { > result = Date(1970, Jan, 1); // or some other default date value > } else { > result = Date(to!ushort(r[0]), to!ushort(r[1]), to!ushort(r[2])); > } 385c435,436 < Date fromUndelimitedString(in char[] s) --- > //Date fromUndelimitedString(in char[] s) > Date fromUndelimitedString(in string s) 387a439,443 > if (s.length == 0) { > result = Date(1970, Jan, 1); // or some other default date value > } else { > result = Date(to!ushort(s[0..4]), to!ushort(s[4..6]), to!ushort(s[6..$])); > }