#endif // broken strptime()
#ifndef WX_TIMEZONE
- #if defined(__MINGW32__) || defined(__VISAGECPP__)
+ #if defined(__BORLANDC__) || defined(__MINGW32__) || defined(__VISAGECPP__)
#define WX_TIMEZONE _timezone
#else // unknown platform - try timezone
#define WX_TIMEZONE timezone
{
case Gregorian:
return Now().GetMonth();
- break;
case Julian:
wxFAIL_MSG(_T("TODO"));
case Gregorian:
case Julian:
return IsLeapYear(year) ? 366 : 365;
- break;
default:
wxFAIL_MSG(_T("unsupported calendar"));
dt += wxTimeSpan::Hours(1);
- dt.MakeGMT();
+ // disable DST tests because it could result in an infinite recursion!
+ dt.MakeGMT(TRUE);
}
else switch ( country )
{
dt += wxTimeSpan::Hours(1);
- dt.MakeGMT();
+ // disable DST tests because it could result in an infinite recursion!
+ dt.MakeGMT(TRUE);
}
else switch ( country )
{
jdn *= MILLISECONDS_PER_DAY;
- m_time = jdn;
+ m_time.Assign(jdn);
return *this;
}
wxDateTime::Tm wxDateTime::GetTm(const TimeZone& tz) const
{
+#ifdef __VMS__
+ int time2;
+#endif
wxASSERT_MSG( IsValid(), _T("invalid wxDateTime") );
time_t time = GetTicks();
else
{
time += tz.GetOffset();
- if ( time >= 0 )
+#ifdef __VMS__ /* time is unsigned so VMS gives a warning on the original */
+ time2 = (int) time;
+ if ( time2 >= 0 )
+#else
+ if ( time >= 0 )
+#endif
{
tm = gmtime(&time);
wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const
{
-#if 0
+#if 1
// the first week of the year is the one which contains Jan, 4 (according
// to ISO standard rule), so the year day N0 = 4 + 7*W always lies in the
// week W+1. As any day N = 7*W + 4 + (N - 4)%7, it lies in the same week
}
return week;
-#else // this seems to be a bit simpler and I believe is also correct
- return (WeekDay)((GetDayOfYear() - (GetWeekDay() - 1 + 7) % 7 + 7) / 7);
+#else // 0
+ // an attempt at doing it simpler - but this doesn't quite work...
+ return (WeekDay)((GetDayOfYear(tz) - (GetWeekDay(tz) - 1 + 7) % 7 + 7) / 7);
#endif // 0/1
}
wxDateTime& wxDateTime::SetToYearDay(wxDateTime::wxDateTime_t yday)
{
int year = GetYear();
- wxCHECK_MSG( (0 < yday) && (yday < GetNumberOfDays(year)),
+ wxCHECK_MSG( (0 < yday) && (yday <= GetNumberOfDays(year)),
ms_InvDateTime, _T("invalid year day") );
bool isLeap = IsLeapYear(year);
}
}
-wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz)
+wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST)
{
int secDiff = GetTimeZone() + tz.GetOffset();
- // we need to know whether DST is or not in effect for this date
- if ( IsDST() == 1 )
+ // we need to know whether DST is or not in effect for this date unless
+ // the test disabled by the caller
+ if ( !noDST && (IsDST() == 1) )
{
// FIXME we assume that the DST is always shifted by 1 hour
secDiff -= 3600;
wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
{
+#ifdef __VMS__
+ int time2;
+#endif
wxCHECK_MSG( format, _T(""), _T("NULL format in wxDateTime::Format") );
time_t time = GetTicks();
{
time += tz.GetOffset();
+#ifdef __VMS__ /* time is unsigned so VMS gives a warning on the original */
+ time2 = (int) time;
+ if ( time2 >= 0 )
+#else
if ( time >= 0 )
+#endif
{
tm = gmtime(&time);
// the spec was correct
Set(day, mon, year, hour, min, sec);
- MakeTimezone(60*offset);
+ MakeTimezone((wxDateTime_t)(60*offset));
return p;
}
// this is the format which corresponds to ctime() output
// and strptime("%c") should parse it, so try it first
- static const wxChar *fmtCtime = _T("%a %b %e %H:%M:%S %Y");
+ static const wxChar *fmtCtime = _T("%a %b %d %H:%M:%S %Y");
const wxChar *result = dt.ParseFormat(input, fmtCtime);
if ( !result )
return (wxChar *)NULL;
}
+ Tm tm = dt.GetTm();
+
+ haveDay = haveMon = haveYear =
+ haveHour = haveMin = haveSec = TRUE;
+
+ hour = tm.hour;
+ min = tm.min;
+ sec = tm.sec;
+
+ year = tm.year;
+ mon = tm.mon;
+ mday = tm.mday;
+
input = result;
}
break;
}
haveMon = TRUE;
- mon = (Month)num;
+ mon = (Month)(num - 1);
break;
case _T('M'): // minute as a decimal number (00-59)
min = tm.min;
sec = tm.sec;
}
+ break;
case _T('w'): // weekday as a number (0-6), Sunday = 0
if ( !GetNumericToken(input, &num) || (wday > 6) )
{
wxDateTime dt;
- wxString fmtDate;
+ wxString fmtDate, fmtDateAlt;
if ( IsWestEuropeanCountry(GetCountry()) ||
GetCountry() == Russia )
{
fmtDate = _T("%d/%m/%y");
+ fmtDateAlt = _T("%m/%d/%y");
}
else // assume USA
{
fmtDate = _T("%m/%d/%y");
+ fmtDateAlt = _T("%d/%m/%y");
}
const wxChar *result = dt.ParseFormat(input, fmtDate);
+
+ if ( !result )
+ {
+ // ok, be nice and try another one
+ result = dt.ParseFormat(input, fmtDateAlt);
+ }
+
if ( !result )
{
// bad luck
break;
case _T('Y'): // year with century
- if ( !GetNumericToken(input, &num) || !num || (num > 366) )
+ if ( !GetNumericToken(input, &num) )
{
// no match
return (wxChar *)NULL;
}
- haveYDay = TRUE;
- yday = (wxDateTime_t)num;
+ haveYear = TRUE;
+ year = (wxDateTime_t)num;
break;
case _T('Z'): // timezone name
// take this date as default
tmDef = dateDef.GetTm();
}
- else if ( IsValid() )
+ else if ( m_time != 0 )
{
// if this date is valid, don't change it
tmDef = GetTm();
// also always ignore the week day
if ( haveMon && haveDay )
{
+ if ( mday > GetNumOfDaysInMonth(tm.year, mon) )
+ {
+ wxLogDebug(_T("bad month day in wxDateTime::ParseFormat"));
+
+ return (wxChar *)NULL;
+ }
+
tm.mon = mon;
tm.mday = mday;
}
else if ( haveYDay )
{
+ if ( yday > GetNumberOfDays(tm.year) )
+ {
+ wxLogDebug(_T("bad year day in wxDateTime::ParseFormat"));
+
+ return (wxChar *)NULL;
+ }
+
Tm tm2 = wxDateTime(1, Jan, tm.year).SetToYearDay(yday).GetTm();
tm.mon = tm2.mon;