// so long as the above copyright and this permission statement
// are retained in all copies.
//
-// Licence: wxWindows license
+// Licence: wxWindows licence
///////////////////////////////////////////////////////////////////////////////
/*
#include "wx/datetime.h"
#include "wx/timer.h" // for wxGetLocalTimeMillis()
+const long wxDateTime::TIME_T_FACTOR = 1000l;
+
// ----------------------------------------------------------------------------
// conditional compilation
// ----------------------------------------------------------------------------
-#if defined(HAVE_STRPTIME) && defined(__LINUX__)
+#if defined(HAVE_STRPTIME) && defined(__GLIBC__) && \
+ ((__GLIBC__ == 2) && (__GLIBC_MINOR__ == 0))
// glibc 2.0.7 strptime() is broken - the following snippet causes it to
// crash (instead of just failing):
//
#undef HAVE_STRPTIME
#endif // broken strptime()
+#if defined(__MWERKS__) && wxUSE_UNICODE
+ #include <wtime.h>
+#endif
+
#if !defined(WX_TIMEZONE) && !defined(WX_GMTOFF_IN_TM)
#if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
#define WX_TIMEZONE _timezone
#elif defined(__MWERKS__)
long wxmw_timezone = 28800;
#define WX_TIMEZONE wxmw_timezone
- #elif defined(__DJGPP__)
+ #elif defined(__DJGPP__) || defined(__WINE__)
#include <sys/timeb.h>
#include <values.h>
static long wxGetTimeZone()
return daysInMonth[wxDateTime::IsLeapYear(year)][month];
}
-// ensure that the timezone variable is set by calling localtime
+// returns the time zone in the C sense, i.e. the difference UTC - local
+// (in seconds)
static int GetTimeZone()
{
// set to TRUE when the timezone is set
#ifdef WX_GMTOFF_IN_TM
static long gmtoffset = LONG_MAX; // invalid timezone
#endif
-
+
wxCRIT_SECT_LOCKER(lock, gs_critsectTimezone);
+ // ensure that the timezone variable is set by calling localtime
if ( !s_timezoneSet )
{
// just call localtime() instead of figuring out whether this system
// supports tzset(), _tzset() or something else
- time_t t = 0;
+ time_t t = 0;
struct tm *tm;
tm = localtime(&t);
s_timezoneSet = TRUE;
+
#ifdef WX_GMTOFF_IN_TM
- gmtoffset = tm->tm_gmtoff;
+ // note that GMT offset is the opposite of time zone and so to return
+ // consistent results in both WX_GMTOFF_IN_TM and !WX_GMTOFF_IN_TM
+ // cases we have to negate it
+ gmtoffset = -tm->tm_gmtoff;
#endif
}
- JDN_OFFSET;
}
-// this function is a wrapper around strftime(3)
+// this function is a wrapper around strftime(3) adding error checking
static wxString CallStrftime(const wxChar *format, const tm* tm)
{
wxChar buf[4096];
return wxString(buf);
}
+#ifdef HAVE_STRPTIME
+
+// Unicode-friendly strptime() wrapper
+static const wxChar *
+CallStrptime(const wxChar *input, const char *fmt, tm *tm)
+{
+ // the problem here is that strptime() returns pointer into the string we
+ // passed to it while we're really interested in the pointer into the
+ // original, Unicode, string so we try to transform the pointer back
+#if wxUSE_UNICODE
+ wxCharBuffer inputMB(wxConvertWX2MB(input));
+#else // ASCII
+ const char * const inputMB = input;
+#endif // Unicode/Ascii
+
+ const char *result = strptime(inputMB, fmt, tm);
+ if ( !result )
+ return NULL;
+
+#if wxUSE_UNICODE
+ // FIXME: this is wrong in presence of surrogates &c
+ return input + (result - inputMB.data());
+#else // ASCII
+ return result;
+#endif // Unicode/Ascii
+}
+
+#endif // HAVE_STRPTIME
+
// if year and/or month have invalid values, replace them with the current ones
static void ReplaceDefaultYearMonthWithCurrent(int *year,
wxDateTime::Month *month)
case _T('x'): // locale default date representation
#ifdef HAVE_STRPTIME
- // try using strptime() - it may fail even if the input is
+ // try using strptime() -- it may fail even if the input is
// correct but the date is out of range, so we will fall back
- // to our generic code anyhow (FIXME !Unicode friendly)
+ // to our generic code anyhow
{
struct tm tm;
- const wxChar *result = strptime(input, "%x", &tm);
+
+ const wxChar *result = CallStrptime(input, "%x", &tm);
if ( result )
{
input = result;
{
// use strptime() to do it for us (FIXME !Unicode friendly)
struct tm tm;
- input = strptime(input, "%X", &tm);
+ input = CallStrptime(input, "%X", &tm);
if ( !input )
{
return (wxChar *)NULL;
// tokenize the string
size_t nPosCur = 0;
- static const wxChar *dateDelimiters = _T(".,/-\t\n ");
+ static const wxChar *dateDelimiters = _T(".,/-\t\r\n ");
wxStringTokenizer tok(p, dateDelimiters);
while ( tok.HasMoreTokens() )
{
size_t len = timeString.length();
if ( timeString.CmpNoCase(wxString(time, len)) == 0 )
{
- Set(stdTimes[n].hour, 0, 0);
+ // casts required by DigitalMars
+ Set(stdTimes[n].hour, wxDateTime_t(0), wxDateTime_t(0));
return time + len;
}
ms_authorities.Add(auth);
}
+wxDateTimeHolidayAuthority::~wxDateTimeHolidayAuthority()
+{
+ // nothing to do here
+}
+
// ----------------------------------------------------------------------------
// wxDateTimeWorkDays
// ----------------------------------------------------------------------------