1. wxLongLongWx::Assign(double) added (half implemented)

2. small wxDateTime bug fixed


git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@5121 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
This commit is contained in:
Vadim Zeitlin
1999-12-27 11:26:59 +00:00
parent d5fc46616d
commit 41acf5c0bd
6 changed files with 58 additions and 19 deletions

View File

@@ -685,16 +685,21 @@ public:
// time. Using the functions below, it may be converted to another time // time. Using the functions below, it may be converted to another time
// zone (for example, the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT()) // zone (for example, the Unix epoch is wxDateTime(1, Jan, 1970).ToGMT())
// //
// these functions try to handle DST internally, but there is no magical
// way to know all rules for it in all countries in the world, so if the
// program can handle it itself (or doesn't want to handle it at all for
// whatever reason), the DST handling can be disabled with noDST.
//
// Converting to the local time zone doesn't do anything. // Converting to the local time zone doesn't do anything.
// ------------------------------------------------------------------------ // ------------------------------------------------------------------------
// transform to any given timezone // transform to any given timezone
inline wxDateTime ToTimezone(const TimeZone& tz) const; inline wxDateTime ToTimezone(const TimeZone& tz, bool noDST = FALSE) const;
wxDateTime& MakeTimezone(const TimeZone& tz); wxDateTime& MakeTimezone(const TimeZone& tz, bool noDST = FALSE);
// transform to GMT/UTC // transform to GMT/UTC
wxDateTime ToGMT() const { return ToTimezone(GMT0); } wxDateTime ToGMT(bool noDST = FALSE) const { return ToTimezone(GMT0, noDST); }
wxDateTime& MakeGMT() { return MakeTimezone(GMT0); } wxDateTime& MakeGMT(bool noDST = FALSE) { return MakeTimezone(GMT0, noDST); }
// is daylight savings time in effect at this moment according to the // is daylight savings time in effect at this moment according to the
// rules of the specified country? // rules of the specified country?

View File

@@ -279,9 +279,10 @@ wxDateTime& wxDateTime::operator+=(const wxDateSpan& diff)
// wxDateTime and timezones // wxDateTime and timezones
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
wxDateTime wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz) const wxDateTime wxDateTime::ToTimezone(const wxDateTime::TimeZone& tz,
bool noDST) const
{ {
return wxDateTime(*this).MakeTimezone(tz); return wxDateTime(*this).MakeTimezone(tz, noDST);
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -25,7 +25,7 @@
#include <limits.h> // for LONG_MAX #include <limits.h> // for LONG_MAX
//#define wxUSE_LONGLONG_WX 1 // for testing (VZ) // #define wxUSE_LONGLONG_WX 1 // for testing (VZ)
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// decide upon which class we will use // decide upon which class we will use

View File

@@ -1479,7 +1479,7 @@ int main(int argc, char **argv)
#endif // TEST_MIME #endif // TEST_MIME
#ifdef TEST_TIME #ifdef TEST_TIME
if ( 0 ) if ( 1 )
{ {
TestTimeSet(); TestTimeSet();
TestTimeStatic(); TestTimeStatic();
@@ -1491,9 +1491,8 @@ int main(int argc, char **argv)
TestTimeWDays(); TestTimeWDays();
TestTimeWNumber(); TestTimeWNumber();
TestTimeParse(); TestTimeParse();
}
TestTimeFormat(); TestTimeFormat();
}
#endif // TEST_TIME #endif // TEST_TIME
wxUninitialize(); wxUninitialize();

View File

@@ -833,7 +833,8 @@ wxDateTime wxDateTime::GetBeginDST(int year, Country country)
dt += wxTimeSpan::Hours(1); dt += wxTimeSpan::Hours(1);
dt.MakeGMT(); // disable DST tests because it could result in an infinite recursion!
dt.MakeGMT(TRUE);
} }
else switch ( country ) else switch ( country )
{ {
@@ -933,7 +934,8 @@ wxDateTime wxDateTime::GetEndDST(int year, Country country)
dt += wxTimeSpan::Hours(1); dt += wxTimeSpan::Hours(1);
dt.MakeGMT(); // disable DST tests because it could result in an infinite recursion!
dt.MakeGMT(TRUE);
} }
else switch ( country ) else switch ( country )
{ {
@@ -1505,7 +1507,7 @@ wxDateTime::wxDateTime_t wxDateTime::GetDayOfYear(const TimeZone& tz) const
wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const 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 // 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 // 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 // week W+1. As any day N = 7*W + 4 + (N - 4)%7, it lies in the same week
@@ -1527,7 +1529,8 @@ wxDateTime::wxDateTime_t wxDateTime::GetWeekOfYear(const TimeZone& tz) const
} }
return week; return week;
#else // this seems to be a bit simpler and I believe is also correct #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); return (WeekDay)((GetDayOfYear(tz) - (GetWeekDay(tz) - 1 + 7) % 7 + 7) / 7);
#endif // 0/1 #endif // 0/1
} }
@@ -1628,12 +1631,13 @@ int wxDateTime::IsDST(wxDateTime::Country country) const
} }
} }
wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz) wxDateTime& wxDateTime::MakeTimezone(const TimeZone& tz, bool noDST)
{ {
int secDiff = GetTimeZone() + tz.GetOffset(); int secDiff = GetTimeZone() + tz.GetOffset();
// we need to know whether DST is or not in effect for this date // we need to know whether DST is or not in effect for this date unless
if ( IsDST() == 1 ) // the test disabled by the caller
if ( !noDST && (IsDST() == 1) )
{ {
// FIXME we assume that the DST is always shifted by 1 hour // FIXME we assume that the DST is always shifted by 1 hour
secDiff -= 3600; secDiff -= 3600;
@@ -2395,7 +2399,7 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
// this is the format which corresponds to ctime() output // this is the format which corresponds to ctime() output
// and strptime("%c") should parse it, so try it first // 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); const wxChar *result = dt.ParseFormat(input, fmtCtime);
if ( !result ) if ( !result )
@@ -2621,18 +2625,27 @@ const wxChar *wxDateTime::ParseFormat(const wxChar *date,
{ {
wxDateTime dt; wxDateTime dt;
wxString fmtDate; wxString fmtDate, fmtDateAlt;
if ( IsWestEuropeanCountry(GetCountry()) || if ( IsWestEuropeanCountry(GetCountry()) ||
GetCountry() == Russia ) GetCountry() == Russia )
{ {
fmtDate = _T("%d/%m/%y"); fmtDate = _T("%d/%m/%y");
fmtDateAlt = _T("%m/%d/%y");
} }
else // assume USA else // assume USA
{ {
fmtDate = _T("%m/%d/%y"); fmtDate = _T("%m/%d/%y");
fmtDateAlt = _T("%d/%m/%y");
} }
const wxChar *result = dt.ParseFormat(input, fmtDate); const wxChar *result = dt.ParseFormat(input, fmtDate);
if ( !result )
{
// ok, be nice and try another one
result = dt.ParseFormat(input, fmtDateAlt);
}
if ( !result ) if ( !result )
{ {
// bad luck // bad luck

View File

@@ -30,6 +30,7 @@
#include "wx/longlong.h" #include "wx/longlong.h"
#include <memory.h> // for memset() #include <memory.h> // for memset()
#include <math.h> // for fabs()
// ============================================================================ // ============================================================================
// implementation // implementation
@@ -80,8 +81,28 @@ ostream& operator<< (ostream& o, const wxLongLongNative& ll)
#endif // wxUSE_LONGLONG_NATIVE #endif // wxUSE_LONGLONG_NATIVE
// ============================================================================
// wxLongLongWx: emulation of 'long long' using 2 longs
// ============================================================================
#if wxUSE_LONGLONG_WX #if wxUSE_LONGLONG_WX
// assignment
wxLongLongWx& wxLongLongWx::Assign(double d)
{
if ( fabs(d) <= LONG_MAX )
{
m_hi = d < 0 ? 1 << (8*sizeof(long) - 1) : 0l;
m_lo = (long)d;
}
else
{
wxFAIL_MSG(_T("TODO"));
}
return *this;
}
wxLongLongWx wxLongLongWx::operator<<(int shift) const wxLongLongWx wxLongLongWx::operator<<(int shift) const
{ {
if (shift == 0) if (shift == 0)