00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 module mango.format.DateTime;
00040
00041 private import std.date;
00042
00043 private import mango.format.Int,
00044 mango.format.Formatter;
00045
00046
00047
00048
00049
00050 class DateTime : Formatter
00051 {
00052
00053
00054
00055
00056 final static tChar[] format (long i)
00057 {
00058 return format (new tChar[40], i);
00059 }
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 final static tChar[] format (tChar[] buffer, long time)
00074 {
00075
00076 assert(buffer.length >= 29 + 7 + 1);
00077
00078 d_time t,
00079 dst,
00080 offset;
00081 tChar sign;
00082 tChar* p = buffer;
00083
00084 void str (tChar* s, tChar c)
00085 {
00086 p[0..3] = s[0..3];
00087 p += 3;
00088 *p++ = c;
00089 }
00090
00091 void num (int i, tChar c=0)
00092 {
00093 p += Int.format (p[0..2], i, Int.Radix.Decimal, '0').length;
00094 if (c)
00095 *p++ = c;
00096 }
00097
00098
00099 if (time == d_time_nan)
00100 return buffer[0..0];
00101
00102 dst = DaylightSavingTA (time);
00103 offset = LocalTZA + dst;
00104 t = time + offset;
00105
00106 str (&daystr[WeekDay(t) * 3], ' ');
00107 str (&monstr[MonthFromTime(t) * 3], ' ');
00108 num (DateFromTime(t), ' ');
00109 num (HourFromTime(t), ':');
00110 num (MinFromTime(t), ':');
00111 num (SecFromTime(t), ' ');
00112
00113 sign = '+';
00114 if (offset < 0)
00115 {
00116 sign = '-';
00117 offset = -(LocalTZA + dst);
00118 }
00119 str ("GMT", sign);
00120
00121 int mn = cast(int)(offset / msPerMinute);
00122 num (mn / 60);
00123 num (mn % 60, ' ');
00124
00125 Int.format (p[0..4], YearFromTime(t));
00126 p += 4;
00127
00128 return buffer[0..p-buffer.ptr];
00129 }
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140 final static long parse (tChar[] date, uint* ate=null)
00141 in {
00142 assert (ate == null);
00143 }
00144 body
00145 {
00146 return std.date.parse (date);
00147 }
00148 }
00149
00150
00151
00152
00153
00154 /+
00155 len = sprintf (buffer, "%.3s %.3s %02d %02d:%02d:%02d GMT%c%02d%02d %d",
00156 &daystr[WeekDay(t) * 3],
00157 &monstr[MonthFromTime(t) * 3],
00158 DateFromTime(t),
00159 cast(int)HourFromTime(t), cast(int)MinFromTime(t),
00160 cast(int)SecFromTime(t), sign, hr, mn,
00161 cast(long)YearFromTime(t));
00162 +/