#endif
#include "wx/datetime.h"
+#include "wx/time.h"
// ============================================================================
// implementation of wxDateTime
extern void InitTm(struct tm& tm);
-extern int GetTimeZone();
-
extern wxString CallStrftime(const wxString& format, const tm* tm);
// ----------------------------------------------------------------------------
format.Replace("%X",wxLocale::GetInfo(wxLOCALE_TIME_FMT));
#endif
// we have to use our own implementation if the date is out of range of
- // strftime() or if we use non standard specificators
+ // strftime() or if we use non standard specifiers
#ifdef wxHAS_STRFTIME
time_t time = GetTicks();
// use strftime()
struct tm tmstruct;
struct tm *tm;
- if ( tz.GetOffset() == -GetTimeZone() )
+ if ( tz.GetOffset() == -wxGetTimeZone() )
{
// we are working with local time
tm = wxLocaltime_r(&time, &tmstruct);
// used for calls to strftime() when we only deal with time
struct tm tmTimeOnly;
+ memset(&tmTimeOnly, 0, sizeof(tmTimeOnly));
tmTimeOnly.tm_hour = tm.hour;
tmTimeOnly.tm_min = tm.min;
tmTimeOnly.tm_sec = tm.sec;
- tmTimeOnly.tm_wday = 0;
- tmTimeOnly.tm_yday = 0;
- tmTimeOnly.tm_mday = 1; // any date will do
+ tmTimeOnly.tm_mday = 1; // any date will do, use 1976-01-01
tmTimeOnly.tm_mon = 0;
tmTimeOnly.tm_year = 76;
tmTimeOnly.tm_isdst = 0; // no DST, we adjust for tz ourselves
default:
// is it the format width?
- fmt.Empty();
- while ( *p == wxT('-') || *p == wxT('+') ||
- *p == wxT(' ') || wxIsdigit(*p) )
+ for ( fmt.clear();
+ *p == wxT('-') || *p == wxT('+') ||
+ *p == wxT(' ') || wxIsdigit(*p);
+ ++p )
{
fmt += *p;
}
}
// no, it wasn't the width
- wxFAIL_MSG(wxT("unknown format specificator"));
+ wxFAIL_MSG(wxT("unknown format specifier"));
// fall through and just copy it nevertheless
{
wxDateTime dt;
+#if wxUSE_INTL
const wxString
fmtDateTime = wxLocale::GetInfo(wxLOCALE_DATE_TIME_FMT);
if ( !fmtDateTime.empty() )
dt = ParseFormatAt(input, end, fmtDateTime);
-
+#endif // wxUSE_INTL
if ( !dt.IsValid() )
{
// also try the format which corresponds to ctime()
case wxT('x'): // locale default date representation
{
+#if wxUSE_INTL
wxString
fmtDate = wxLocale::GetInfo(wxLOCALE_SHORT_DATE_FMT),
fmtDateAlt = wxLocale::GetInfo(wxLOCALE_LONG_DATE_FMT);
-
+#else // !wxUSE_INTL
+ wxString fmtDate, fmtDateAlt;
+#endif // wxUSE_INTL/!wxUSE_INTL
if ( fmtDate.empty() )
{
if ( IsWestEuropeanCountry(GetCountry()) ||
case wxT('X'): // locale default time representation
{
+#if wxUSE_INTL
wxString fmtTime = wxLocale::GetInfo(wxLOCALE_TIME_FMT),
fmtTimeAlt;
-
+#else // !wxUSE_INTL
+ wxString fmtTime, fmtTimeAlt;
+#endif // wxUSE_INTL/!wxUSE_INTL
if ( fmtTime.empty() )
{
// try to parse what follows as "%H:%M:%S" and, if this
{
wxCHECK_MSG( end, false, "end iterator pointer must be specified" );
- // Set to current day and hour, so strings like '14:00' becomes today at
- // 14, not some other random date
- wxDateTime dtDate = wxDateTime::Today();
- wxDateTime dtTime = wxDateTime::Today();
+ wxDateTime
+ dtDate,
+ dtTime;
wxString::const_iterator
endTime,
const wxString::const_iterator pEnd = date.end();
wxString::const_iterator p = pBegin;
- while ( wxIsspace(*p) )
+ while ( p != pEnd && wxIsspace(*p) )
p++;
// some special cases
while ( p != pEnd )
{
// skip white space and date delimiters
- while ( wxStrchr(".,/-\t\r\n ", *p) )
+ if ( wxStrchr(".,/-\t\r\n ", *p) )
{
++p;
+ continue;
}
// modify copy of the iterator as we're not sure if the next token is
else // not a valid weekday name
{
// try the ordinals
- static const char *ordinals[] =
+ static const char *const ordinals[] =
{
wxTRANSLATE("first"),
wxTRANSLATE("second"),
for ( size_t n = 0; n < WXSIZEOF(stdTimes); n++ )
{
const wxString timeString = wxGetTranslation(stdTimes[n].name);
- const wxString::const_iterator p = time.begin() + timeString.length();
- if ( timeString.CmpNoCase(wxString(time.begin(), p)) == 0 )
+ if ( timeString.CmpNoCase(wxString(time, timeString.length())) == 0 )
{
// casts required by DigitalMars
Set(stdTimes[n].hour, wxDateTime_t(0), wxDateTime_t(0));
if ( end )
- *end = p;
+ *end = time.begin() + timeString.length();
return true;
}
// try all time formats we may think about in the order from longest to
// shortest
- static const char *timeFormats[] =
+ static const char *const timeFormats[] =
{
"%I:%M:%S %p", // 12hour with AM/PM
"%H:%M:%S", // could be the same or 24 hour one so try it too
"%I:%M %p", // 12hour with AM/PM but without seconds
- "%H:%M:%S", // and a possibly 24 hour version without seconds
+ "%H:%M", // and a possibly 24 hour version without seconds
"%X", // possibly something from above or maybe something
// completely different -- try it last