static wxString CallStrftime(const wxChar *format, const tm* tm)
{
wxChar buf[4096];
+ // Create temp wxString here to work around mingw/cygwin bug 1046059
+ // http://sourceforge.net/tracker/?func=detail&atid=102435&aid=1046059&group_id=2435
+ wxString s;
+
if ( !wxStrftime(buf, WXSIZEOF(buf), format, tm) )
{
// buffer is too small?
wxFAIL_MSG(_T("strftime() failed"));
}
- return wxString(buf);
+ s = buf;
+ return s;
}
#endif
case wxDateTime::A_CST:
// Central Standard Time in use in Australia = UTC + 9.5
- m_offset = 60l*(9*60 + 30);
+ m_offset = 60l*(9*MIN_PER_HOUR + MIN_PER_HOUR/2);
break;
default:
// EPOCH_JDN + 0.5
jdn -= EPOCH_JDN + 0.5;
- jdn *= MILLISECONDS_PER_DAY;
-
- m_time.Assign(jdn);
-
- // JDNs always suppose an UTC date, so bring it back to local time zone
- // (also see GetJulianDayNumber() implementation)
- long tzDiff = GetTimeZone();
- if ( IsDST() == 1 )
- {
- // FIXME: again, we suppose that DST is always one hour
- tzDiff -= 3600;
- }
+ m_time.Assign(jdn*MILLISECONDS_PER_DAY);
- m_time += tzDiff*1000; // tzDiff is in seconds
+ // JDNs always are in UTC, so we don't need any adjustments for time zone
return *this;
}
timeOnly -= tm.msec;
timeOnly /= 1000; // now we have time in seconds
- tm.sec = (wxDateTime_t)(timeOnly % 60);
+ tm.sec = (wxDateTime_t)(timeOnly % SEC_PER_MIN);
timeOnly -= tm.sec;
- timeOnly /= 60; // now we have time in minutes
+ timeOnly /= SEC_PER_MIN; // now we have time in minutes
- tm.min = (wxDateTime_t)(timeOnly % 60);
+ tm.min = (wxDateTime_t)(timeOnly % MIN_PER_HOUR);
timeOnly -= tm.min;
- tm.hour = (wxDateTime_t)(timeOnly / 60);
+ tm.hour = (wxDateTime_t)(timeOnly / MIN_PER_HOUR);
return tm;
}
double wxDateTime::GetJulianDayNumber() const
{
- // JDN are always expressed for the UTC dates
- Tm tm(ToTimezone(UTC).GetTm(UTC));
-
- double result = GetTruncatedJDN(tm.mday, tm.mon, tm.year);
-
- // add the part GetTruncatedJDN() neglected
- result += 0.5;
-
- // and now add the time: 86400 sec = 1 JDN
- return result + ((double)(60*(60*tm.hour + tm.min) + tm.sec)) / 86400;
+ return m_time.ToDouble() / MILLISECONDS_PER_DAY + EPOCH_JDN + 0.5;
}
double wxDateTime::GetRataDie() const
secDiff -= 3600;
}
+ return Add(wxTimeSpan::Seconds(secDiff));
+}
+
+wxDateTime& wxDateTime::MakeFromTimezone(const TimeZone& tz, bool noDST)
+{
+ long secDiff = GetTimeZone() + tz.GetOffset();
+
+ // 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;
+ }
+
return Subtract(wxTimeSpan::Seconds(secDiff));
}
// find the YEAR which is a year in the strftime() range (1970
// - 2038) whose Jan 1 falls on the same week day as the Jan 1
// of the real year. Then make a copy of the format and
- // replace all occurences of YEAR in it with some unique
+ // replace all occurrences of YEAR in it with some unique
// string not appearing anywhere else in it, then use
// strftime() to format the date in year YEAR and then replace
// YEAR back by the real year and the unique replacement
- // string back with YEAR. Notice that "all occurences of YEAR"
- // means all occurences of 4 digit as well as 2 digit form!
+ // string back with YEAR. Notice that "all occurrences of YEAR"
+ // means all occurrences of 4 digit as well as 2 digit form!
//
// the bugs: we assume that neither of %c nor %x contains any
// fields which may change between the YEAR and real year. For
strYear.Printf(_T("%d"), year);
strYear2.Printf(_T("%d"), year % 100);
- // find two strings not occuring in format (this is surely
- // not optimal way of doing it... improvements welcome!)
+ // find two strings not occurring in format (this is surely
+ // not the optimal way of doing it... improvements welcome!)
wxString fmt = format;
wxString replacement = (wxChar)-1;
while ( fmt.Find(replacement) != wxNOT_FOUND )
replacement << (wxChar)-2;
}
- // replace all occurences of year with it
+ // replace all occurrences of year with it
bool wasReplaced = fmt.Replace(strYear, replacement) > 0;
if ( !wasReplaced )
wasReplaced = fmt.Replace(strYear2, replacement2) > 0;
: _T("%x"),
&tmAdjusted);
- // now replace the occurence of 1999 with the real year
+ // now replace the occurrence of 1999 with the real year
wxString strYearReal, strYearReal2;
strYearReal.Printf(_T("%04d"), yearReal);
strYearReal2.Printf(_T("%02d"), yearReal % 100);
str.Replace(strYear, strYearReal);
str.Replace(strYear2, strYearReal2);
- // and replace back all occurences of replacement string
+ // and replace back all occurrences of replacement string
if ( wasReplaced )
{
str.Replace(replacement2, strYear2);
}
// hours
- offset = 60*(10*(*p - _T('0')) + (*(p + 1) - _T('0')));
+ offset = MIN_PER_HOUR*(10*(*p - _T('0')) + (*(p + 1) - _T('0')));
p += 2;
p += tz.length();
}
-
+
// make it minutes
- offset *= 60;
+ offset *= MIN_PER_HOUR;
}
- // the spec was correct
+ // the spec was correct, construct the date from the values we found
Set(day, mon, year, hour, min, sec);
- MakeTimezone((wxDateTime_t)(60*offset));
+ MakeFromTimezone(TimeZone((wxDateTime_t)(offset*SEC_PER_MIN)));
return p;
}