|
@@ -4734,13 +4734,43 @@ parse_date_string(const char *datetime)
|
|
|
&minute,
|
|
|
&second) == 6)) {
|
|
|
month = get_month_index(month_str);
|
|
|
- if ((month >= 0) && (year > 1970)) {
|
|
|
+ if ((month >= 0) && (year >= 1970)) {
|
|
|
+
|
|
|
+ /* alternative code (#250) */
|
|
|
+ time_t alt_result;
|
|
|
+ struct tm tm;
|
|
|
+ memset(&tm, 0, sizeof(tm));
|
|
|
+
|
|
|
+ tm.tm_year = year - 1900;
|
|
|
+ tm.tm_mon = month;
|
|
|
+ tm.tm_mday = day;
|
|
|
+ tm.tm_hour = hour;
|
|
|
+ tm.tm_min = minute;
|
|
|
+ tm.tm_sec = second;
|
|
|
+ alt_result = mktime(&tm);
|
|
|
+ if (alt_result > 0) {
|
|
|
+ struct tm *lt = gmtime(&alt_result);
|
|
|
+ time_t delta;
|
|
|
+ if (lt->tm_mday == tm.tm_mday) {
|
|
|
+ delta = (lt->tm_sec - tm.tm_sec)
|
|
|
+ + 60 * (lt->tm_min - tm.tm_min)
|
|
|
+ + 60 * 60 * (lt->tm_hour - tm.tm_hour);
|
|
|
+ } else {
|
|
|
+ /* TODO */
|
|
|
+ delta = 0;
|
|
|
+ }
|
|
|
+ alt_result -= delta;
|
|
|
+ }
|
|
|
+
|
|
|
+ /* original code */
|
|
|
leap_days = num_leap_years(year) - num_leap_years(1970);
|
|
|
year -= 1970;
|
|
|
days =
|
|
|
year * 365 + days_before_month[month] + (day - 1) + leap_days;
|
|
|
result = (time_t)days * 24 * 3600 + (time_t)hour * 3600
|
|
|
+ minute * 60 + second;
|
|
|
+
|
|
|
+ /* TODO: fix original code or use alternate code - see #250 */
|
|
|
}
|
|
|
}
|
|
|
|