// global data
// ----------------------------------------------------------------------------
+const wxChar * wxDefaultDateTimeFormat = wxT("%c");
+const wxChar * wxDefaultTimeSpanFormat = wxT("%H:%M:%S");
+
// in the fine tradition of ANSI C we use our equivalent of (time_t)-1 to
// indicate an invalid wxDateTime object
const wxDateTime wxDefaultDateTime;
break;
}
- return !s.IsEmpty() && s.ToULong(number);
+ return !s.empty() && s.ToULong(number);
}
// scans all alphabetic characters and returns the resulting string
: m_tz(tz)
{
msec = 0;
- sec = tm.tm_sec;
- min = tm.tm_min;
- hour = tm.tm_hour;
- mday = tm.tm_mday;
+ sec = (wxDateTime::wxDateTime_t)tm.tm_sec;
+ min = (wxDateTime::wxDateTime_t)tm.tm_min;
+ hour = (wxDateTime::wxDateTime_t)tm.tm_hour;
+ mday = (wxDateTime::wxDateTime_t)tm.tm_mday;
mon = (wxDateTime::Month)tm.tm_mon;
year = 1900 + tm.tm_year;
- wday = tm.tm_wday;
- yday = tm.tm_yday;
+ wday = (wxDateTime::wxDateTime_t)tm.tm_wday;
+ yday = (wxDateTime::wxDateTime_t)tm.tm_yday;
}
bool wxDateTime::Tm::IsValid() const
// compute the week day from day/month/year: we use the dumbest algorithm
// possible: just compute our JDN and then use the (simple to derive)
// formula: weekday = (JDN + 1.5) % 7
- wday = (wxDateTime::WeekDay)(GetTruncatedJDN(mday, mon, year) + 2) % 7;
+ wday = (wxDateTime::wxDateTime_t)((wxDateTime::WeekDay)(GetTruncatedJDN(mday, mon, year) + 2) % 7);
}
void wxDateTime::Tm::AddMonths(int monDiff)
dayDiff += GetNumOfDaysInMonth(year, mon);
}
- mday += dayDiff;
+ mday = (wxDateTime::wxDateTime_t)( mday + dayDiff );
while ( mday > GetNumOfDaysInMonth(year, mon) )
{
mday -= GetNumOfDaysInMonth(year, mon);
wxString wxDateTime::GetMonthName(wxDateTime::Month month,
wxDateTime::NameFlags flags)
{
- wxCHECK_MSG( month != Inv_Month, _T(""), _T("invalid month") );
+ wxCHECK_MSG( month != Inv_Month, wxEmptyString, _T("invalid month") );
// notice that we must set all the fields to avoid confusing libc (GNU one
// gets confused to a crash if we don't do this)
wxString wxDateTime::GetWeekDayName(wxDateTime::WeekDay wday,
wxDateTime::NameFlags flags)
{
- wxCHECK_MSG( wday != Inv_WeekDay, _T(""), _T("invalid weekday") );
+ wxCHECK_MSG( wday != Inv_WeekDay, wxEmptyString, _T("invalid weekday") );
// take some arbitrary Sunday (but notice that the day should be such that
// after adding wday to it below we still have a valid date, e.g. don't
// less than timezone - try to make it work for this case
if ( tm2.tm_year == 70 && tm2.tm_mon == 0 && tm2.tm_mday == 1 )
{
- // add timezone to make sure that date is in range
- tm2.tm_sec -= GetTimeZone();
-
- timet = mktime(&tm2);
- if ( timet != (time_t)-1 )
- {
- timet += GetTimeZone();
-
- return Set(timet);
- }
+ return Set((time_t)(
+ GetTimeZone() +
+ tm2.tm_hour * MIN_PER_HOUR * SEC_PER_MIN +
+ tm2.tm_min * SEC_PER_MIN +
+ tm2.tm_sec));
}
wxFAIL_MSG( _T("mktime() failed") );
tm->tm_min = minute;
tm->tm_sec = second;
+ // and the DST in case it changes on this date
+ struct tm tm2(*tm);
+ mktime(&tm2);
+ if ( tm2.tm_isdst != tm->tm_isdst )
+ tm->tm_isdst = tm2.tm_isdst;
+
(void)Set(*tm);
// and finally adjust milliseconds
(void)Set(tm);
// and finally adjust milliseconds
- return SetMillisecond(millisec);
+ if (IsValid())
+ SetMillisecond(millisec);
+
+ return *this;
}
else
{
// Weekday and monthday stuff
// ----------------------------------------------------------------------------
-bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek,
- WeekDay weekday,
- WeekFlags flags)
+// convert Sun, Mon, ..., Sat into 6, 0, ..., 5
+static inline int ConvertWeekDayToMondayBase(int wd)
+{
+ return wd == wxDateTime::Sun ? 6 : wd - 1;
+}
+
+/* static */
+wxDateTime
+wxDateTime::SetToWeekOfYear(int year, wxDateTime_t numWeek, WeekDay wd)
{
wxASSERT_MSG( numWeek > 0,
_T("invalid week number: weeks are counted from 1") );
- int year = GetYear();
+ // Jan 4 always lies in the 1st week of the year
+ wxDateTime dt(4, Jan, year);
+ dt.SetToWeekDayInSameWeek(wd);
+ dt += wxDateSpan::Weeks(numWeek - 1);
+ return dt;
+}
+
+// use a separate function to avoid warnings about using deprecated
+// SetToTheWeek in GetWeek below
+static wxDateTime
+SetToTheWeek(int year,
+ wxDateTime::wxDateTime_t numWeek,
+ wxDateTime::WeekDay weekday,
+ wxDateTime::WeekFlags flags)
+{
// Jan 4 always lies in the 1st week of the year
- Set(4, Jan, year);
- SetToWeekDayInSameWeek(weekday, flags) += wxDateSpan::Weeks(numWeek - 1);
+ wxDateTime dt(4, wxDateTime::Jan, year);
+ dt.SetToWeekDayInSameWeek(weekday, flags);
+ dt += wxDateSpan::Weeks(numWeek - 1);
+
+ return dt;
+}
+bool wxDateTime::SetToTheWeek(wxDateTime_t numWeek,
+ WeekDay weekday,
+ WeekFlags flags)
+{
+ int year = GetYear();
+ *this = ::SetToTheWeek(year, numWeek, weekday, flags);
if ( GetYear() != year )
{
// oops... numWeek was too big
return true;
}
+wxDateTime wxDateTime::GetWeek(wxDateTime_t numWeek,
+ WeekDay weekday,
+ WeekFlags flags) const
+{
+ return ::SetToTheWeek(GetYear(), numWeek, weekday, flags);
+}
+
wxDateTime& wxDateTime::SetToLastMonthDay(Month month,
int year)
{
static inline
wxDateTime::wxDateTime_t GetDayOfYearFromTm(const wxDateTime::Tm& tm)
{
- return gs_cumulatedDays[wxDateTime::IsLeapYear(tm.year)][tm.mon] + tm.mday;
+ return (wxDateTime::wxDateTime_t)(gs_cumulatedDays[wxDateTime::IsLeapYear(tm.year)][tm.mon] + tm.mday);
}
wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const
return GetDayOfYearFromTm(GetTm(tz));
}
-// convert Sun, Mon, ..., Sat into 6, 0, ..., 5
-static inline int ConvertWeekDayToMondayBase(int wd)
-{
- return wd == wxDateTime::Sun ? 6 : wd - 1;
-}
-
wxDateTime::wxDateTime_t
wxDateTime::GetWeekOfYear(wxDateTime::WeekFlags flags, const TimeZone& tz) const
{
}
}
- return week;
+ return (wxDateTime::wxDateTime_t)week;
}
wxDateTime::wxDateTime_t wxDateTime::GetWeekOfMonth(wxDateTime::WeekFlags flags,
// yday lies in December then
if ( (mon == Dec) || (yday <= gs_cumulatedDays[isLeap][mon + 1]) )
{
- Set(yday - gs_cumulatedDays[isLeap][mon], mon, year);
+ Set((wxDateTime::wxDateTime_t)(yday - gs_cumulatedDays[isLeap][mon]), mon, year);
break;
}
wxString wxDateTime::Format(const wxChar *format, const TimeZone& tz) const
{
- wxCHECK_MSG( format, _T(""), _T("NULL format in wxDateTime::Format") );
+ wxCHECK_MSG( format, wxEmptyString, _T("NULL format in wxDateTime::Format") );
// we have to use our own implementation if the date is out of range of
// strftime() or if we use non standard specificators
fmt += *p;
}
- if ( !fmt.IsEmpty() )
+ if ( !fmt.empty() )
{
// we've only got the flags and width so far in fmt
fmt.Prepend(_T('%'));
return (wxChar *)NULL;
}
- wxDateTime_t day = *p++ - _T('0');
+ wxDateTime_t day = (wxDateTime_t)(*p++ - _T('0'));
if ( wxIsdigit(*p) )
{
day *= 10;
- day += *p++ - _T('0');
+ day = (wxDateTime_t)(day + (*p++ - _T('0')));
}
if ( *p++ != _T(' ') )
return (wxChar *)NULL;
}
- wxDateTime_t hour = *p++ - _T('0');
+ wxDateTime_t hour = (wxDateTime_t)(*p++ - _T('0'));
if ( !wxIsdigit(*p) )
{
}
hour *= 10;
- hour += *p++ - _T('0');
+ hour = (wxDateTime_t)(hour + (*p++ - _T('0')));
if ( *p++ != _T(':') )
{
return (wxChar *)NULL;
}
- wxDateTime_t min = *p++ - _T('0');
+ wxDateTime_t min = (wxDateTime_t)(*p++ - _T('0'));
if ( !wxIsdigit(*p) )
{
}
min *= 10;
- min += *p++ - _T('0');
+ min = (wxDateTime_t)(min + *p++ - _T('0'));
wxDateTime_t sec = 0;
if ( *p++ == _T(':') )
return (wxChar *)NULL;
}
- sec = *p++ - _T('0');
+ sec = (wxDateTime_t)(*p++ - _T('0'));
if ( !wxIsdigit(*p) )
{
}
sec *= 10;
- sec += *p++ - _T('0');
+ sec = (wxDateTime_t)(sec + *p++ - _T('0'));
}
if ( *p++ != _T(' ') )
wxString am, pm, token = GetAlphaToken(input);
GetAmPmStrings(&am, &pm);
- if (am.IsEmpty() && pm.IsEmpty())
+ if (am.empty() && pm.empty())
return (wxChar *)NULL; // no am/pm strings defined
if ( token.CmpNoCase(pm) == 0 )
{
{
wxString date = wxGetTranslation(literalDates[n].str);
size_t len = date.length();
- if ( wxStrlen(p) >= len && (wxString(p, len).CmpNoCase(date) == 0) )
+ if ( wxStrlen(p) >= len )
{
- // nothing can follow this, so stop here
- p += len;
-
- int dayDiffFromToday = literalDates[n].dayDiffFromToday;
- *this = Today();
- if ( dayDiffFromToday )
+ wxString str(p, len);
+ if ( str.CmpNoCase(date) == 0 )
{
- *this += wxDateSpan::Days(dayDiffFromToday);
- }
+ // nothing can follow this, so stop here
+ p += len;
+
+ int dayDiffFromToday = literalDates[n].dayDiffFromToday;
+ *this = Today();
+ if ( dayDiffFromToday )
+ {
+ *this += wxDateSpan::Days(dayDiffFromToday);
+ }
- return p;
+ return p;
+ }
}
}
}
else // may be either day or year
{
- wxDateTime_t maxDays = haveMon
+ wxDateTime_t maxDays = (wxDateTime_t)(
+ haveMon
? GetNumOfDaysInMonth(haveYear ? year : Inv_Year, mon)
- : 31;
+ : 31
+ );
// can it be day?
if ( (val == 0) || (val > (unsigned long)maxDays) )
{
// no need to check in month range as always < 12, but
// the days are counted from 1 unlike the months
- day = (wxDateTime_t)mon + 1;
+ day = (wxDateTime_t)(mon + 1);
haveDay = true;
}
else
// we're in the current year then
if ( (year > 0) && (year <= (int)GetNumOfDaysInMonth(Inv_Year, mon)) )
{
- day = year;
+ day = (wxDateTime_t)year;
haveMon = true;
haveYear = false;
return !wxDateTimeHolidayAuthority::IsHoliday(*this);
}
+// ============================================================================
+// wxDateSpan
+// ============================================================================
+
+wxDateSpan WXDLLIMPEXP_BASE operator*(int n, const wxDateSpan& ds)
+{
+ wxDateSpan ds1(ds);
+ return ds1.Multiply(n);
+}
+
// ============================================================================
// wxTimeSpan
// ============================================================================
+wxTimeSpan WXDLLIMPEXP_BASE operator*(int n, const wxTimeSpan& ts)
+{
+ return wxTimeSpan(ts).Multiply(n);
+}
+
// this enum is only used in wxTimeSpan::Format() below but we can't declare
// it locally to the method as it provokes an internal compiler error in egcs
// 2.91.60 when building with -O2
// %l milliseconds (000 - 999)
wxString wxTimeSpan::Format(const wxChar *format) const
{
- wxCHECK_MSG( format, _T(""), _T("NULL format in wxTimeSpan::Format") );
+ wxCHECK_MSG( format, wxEmptyString, _T("NULL format in wxTimeSpan::Format") );
wxString str;
str.Alloc(wxStrlen(format));
wxDateTimeHolidayAuthority::~wxDateTimeHolidayAuthority()
{
- // nothing to do here
+ // required here for Darwin
}
// ----------------------------------------------------------------------------
return holidays.GetCount();
}
+// ============================================================================
+// other helper functions
+// ============================================================================
+
+// ----------------------------------------------------------------------------
+// iteration helpers: can be used to write a for loop over enum variable like
+// this:
+// for ( m = wxDateTime::Jan; m < wxDateTime::Inv_Month; wxNextMonth(m) )
+// ----------------------------------------------------------------------------
+
+WXDLLIMPEXP_BASE void wxNextMonth(wxDateTime::Month& m)
+{
+ wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") );
+
+ // no wrapping or the for loop above would never end!
+ m = (wxDateTime::Month)(m + 1);
+}
+
+WXDLLIMPEXP_BASE void wxPrevMonth(wxDateTime::Month& m)
+{
+ wxASSERT_MSG( m < wxDateTime::Inv_Month, _T("invalid month") );
+
+ m = m == wxDateTime::Jan ? wxDateTime::Inv_Month
+ : (wxDateTime::Month)(m - 1);
+}
+
+WXDLLIMPEXP_BASE void wxNextWDay(wxDateTime::WeekDay& wd)
+{
+ wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") );
+
+ // no wrapping or the for loop above would never end!
+ wd = (wxDateTime::WeekDay)(wd + 1);
+}
+
+WXDLLIMPEXP_BASE void wxPrevWDay(wxDateTime::WeekDay& wd)
+{
+ wxASSERT_MSG( wd < wxDateTime::Inv_WeekDay, _T("invalid week day") );
+
+ wd = wd == wxDateTime::Sun ? wxDateTime::Inv_WeekDay
+ : (wxDateTime::WeekDay)(wd - 1);
+}
+
#endif // wxUSE_DATETIME