-#if defined(HAVE_LOCALTIME)
- time_t t0 = time(&t0);
- if ( t0 != (time_t)-1 )
- {
- struct tm *tp = localtime(&t0);
-
- if ( tp )
- {
- return 1000*(60*(60*tp->tm_hour+tp->tm_min)+tp->tm_sec);
- }
- }
-#elif defined(HAVE_GETTIMEOFDAY)
- struct timeval tp;
- if ( wxGetTimeOfDay(&tp, (struct timezone *)NULL) != -1 )
- {
- return (1000*tp.tv_sec + tp.tv_usec / 1000);
- }
-#elif defined(HAVE_FTIME)
- struct timeb tp;
- if ( ftime(&tp) == 0 )
- {
- return (1000*tp.time + tp.millitm);
- }
-#else
- #error "no function to find the current time on this system"
-#endif
-
- wxLogSysError(_("Failed to get the system time"));
-
+ struct tm tm;
+ time_t t0, t1;
+
+ // This cannot be made static because mktime can overwrite it.
+ //
+ memset(&tm, 0, sizeof(tm));
+ tm.tm_year = 70;
+ tm.tm_mon = 0;
+ tm.tm_mday = 5; // not Jan 1st 1970 due to mktime 'feature'
+ tm.tm_hour = 0;
+ tm.tm_min = 0;
+ tm.tm_sec = 0;
+ tm.tm_isdst = -1; // let mktime guess
+
+ // Note that mktime assumes that the struct tm contains local time.
+ //
+ t1 = time(&t1); // now
+ t0 = mktime(&tm); // origin
+
+ // Return the difference in seconds.
+ //
+ if (( t0 != (time_t)-1 ) && ( t1 != (time_t)-1 ))
+ return (long)difftime(t1, t0) + (60 * 60 * 24 * 4);
+
+ wxLogSysError(_("Failed to get the local system time"));