11 const char*
const days[7] = {
12 "Mon",
"Tue",
"Wed",
"Thu",
"Fri",
"Sat" ,
"Sun"
16 "Jan",
"Feb",
"Mar",
"Apr",
"May",
"Jun",
17 "Jul",
"Aug",
"Sep",
"Oct",
"Nov",
"Dec"
20 template<
bool FIRST,
unsigned MUL,
typename T>
21 static inline bool parseDigit(
unsigned c, T& t)
24 if (c > 9)
return false;
41 if (*p++ !=
' ')
return time_t(-1);
48 if (*p++ !=
'n')
return time_t(-1);
52 case 'n': tm.tm_mon = 5;
break;
53 case 'l': tm.tm_mon = 6;
break;
54 default:
return time_t(-1);
57 default:
return time_t(-1);
61 if (*p++ !=
'e')
return time_t(-1);
62 if (*p++ !=
'b')
return time_t(-1);
66 if (*p++ !=
'a')
return time_t(-1);
68 case 'r': tm.tm_mon = 2;
break;
69 case 'y': tm.tm_mon = 4;
break;
70 default:
return time_t(-1);
76 if (*p++ !=
'r')
return time_t(-1);
79 if (*p++ !=
'g')
return time_t(-1);
81 default:
return time_t(-1);
85 if (*p++ !=
'e')
return time_t(-1);
86 if (*p++ !=
'p')
return time_t(-1);
90 if (*p++ !=
'c')
return time_t(-1);
91 if (*p++ !=
't')
return time_t(-1);
95 if (*p++ !=
'o')
return time_t(-1);
96 if (*p++ !=
'v')
return time_t(-1);
100 if (*p++ !=
'e')
return time_t(-1);
101 if (*p++ !=
'c')
return time_t(-1);
104 default:
return time_t(-1);
108 if (*p++ !=
' ')
return time_t(-1);
111 if (!parseDigit<true, 10>(*p++, tm.tm_mday))
return time_t(-1);
112 if (!parseDigit<false, 1>(*p++, tm.tm_mday))
return time_t(-1);
113 if ((tm.tm_mday < 1) || (31 < tm.tm_mday) )
return time_t(-1);
116 if (*p++ !=
' ')
return time_t(-1);
119 if (!parseDigit<true, 10>(*p++, tm.tm_hour))
return time_t(-1);
120 if (!parseDigit<false, 1>(*p++, tm.tm_hour))
return time_t(-1);
121 if ((tm.tm_hour < 0) || (23 < tm.tm_hour))
return time_t(-1);
124 if (*p++ !=
':')
return time_t(-1);
127 if (!parseDigit<true, 10>(*p++, tm.tm_min))
return time_t(-1);
128 if (!parseDigit<false, 1>(*p++, tm.tm_min))
return time_t(-1);
129 if ((tm.tm_min < 0) || (59 < tm.tm_min))
return time_t(-1);
132 if (*p++ !=
':')
return time_t(-1);
135 if (!parseDigit<true, 10>(*p++, tm.tm_sec))
return time_t(-1);
136 if (!parseDigit<false, 1>(*p++, tm.tm_sec))
return time_t(-1);
137 if ((tm.tm_sec < 0) || (59 < tm.tm_sec))
return time_t(-1);
140 if (*p++ !=
' ')
return time_t(-1);
143 if (!parseDigit<true, 1000>(*p++, tm.tm_year))
return time_t(-1);
144 if (!parseDigit<false, 100>(*p++, tm.tm_year))
return time_t(-1);
145 if (!parseDigit<false, 10>(*p++, tm.tm_year))
return time_t(-1);
146 if (!parseDigit<false, 1>(*p++, tm.tm_year))
return time_t(-1);
148 if (tm.tm_year < 0)
return time_t(-1);
156 if (time < 0) time = 0;
158 tm = localtime(&time);
159 std::ostringstream sstr;
160 sstr << std::setfill(
'0')
161 <<
days [tm->tm_wday] <<
' '
162 <<
months[tm->tm_mon] <<
' '
163 << std::setw(2) << tm->tm_mday <<
' '
164 << std::setw(2) << tm->tm_hour <<
':'
165 << std::setw(2) << tm->tm_min <<
':'
166 << std::setw(2) << tm->tm_sec <<
' '
167 << std::setw(4) << (tm->tm_year + 1900);