static void s_TestGMT(int idx) { // Write time in timezone format {{ CTime::SetFormat("M/D/Y h:m:s Z"); CTime t1(2001, 3, 12, 11, 22, 33, 999, CTime::eGmt); assert(t1.AsString() == "03/12/2001 11:22:33 GMT"); CTime t2(2001, 3, 12, 11, 22, 33, 999, CTime::eLocal); assert(t2.AsString() == "03/12/2001 11:22:33 "); }} // Process timezone string {{ CTime t; t.SetFormat("M/D/Y h:m:s Z"); t="03/12/2001 11:22:33 GMT"; assert(t.AsString() == "03/12/2001 11:22:33 GMT"); t="03/12/2001 11:22:33 "; assert(t.AsString() == "03/12/2001 11:22:33 "); }} // Day of week {{ CTime t(2001, 4, 1); t.SetFormat("M/D/Y h:m:s w"); int i; for (i=0; t<=CTime(2001, 4, 10); t.AddDay(),i++) { assert(t.DayOfWeek() == (i%7)); } }} // Test GetTimeT {{ time_t timer = time(0); CTime tgmt(CTime::eCurrent, CTime::eGmt, CTime::eTZPrecisionDefault); CTime tloc(CTime::eCurrent, CTime::eLocal, CTime::eTZPrecisionDefault); CTime t(timer); // Set the same time to all time objects tgmt.SetTimeT(timer); tloc.SetTimeT(timer); assert(timer == t.GetTimeT()); assert(timer == tgmt.GetTimeT()); // On the day of changing to summer/winter time, the local time // converted to GMT may differ from the value returned by time(0), // because in the common case API don't know if DST is in effect for // specified local time or not (see mktime()). time_t l_ = tloc.GetTimeT(); if (timer != l_ ) { if ( abs((int)(timer - l_)) > 3600 ) assert(timer == l_); } }} // Test TimeZoneOffset (1) -- EST timezone only {{ CTime tw(2001, 1, 1, 12); CTime ts(2001, 6, 1, 12); assert(tw.TimeZoneOffset() / 3600 == -5); assert(ts.TimeZoneOffset()/3600 == -4); }} // Test TimeZoneOffset (2) -- EST timezone only {{ CTime tw(2001, 6, 1, 12); CTime ts(2002, 1, 1, 12); assert(tw.TimeZoneOffset() / 3600 == -4); assert(ts.TimeZoneOffset() / 3600 == -5); }} // Test AdjustTime {{ CTime::SetFormat("M/D/Y h:m:s"); CTime t("03/11/2007 01:01:00"); CTime tn; t.SetTimeZonePrecision(CTime::eTZPrecisionDefault); // GMT t.SetTimeZone(CTime::eGmt); tn = t; tn.AddDay(5); assert(tn.AsString() == "03/16/2007 01:01:00"); tn = t; tn.AddDay(40); assert(tn.AsString() == "04/20/2007 01:01:00"); // Local eNone t.SetTimeZone(CTime::eLocal); t.SetTimeZonePrecision(CTime::eNone); tn = t; tn.AddDay(5); assert(tn.AsString() == "03/16/2007 01:01:00"); tn = t; tn.AddDay(40); assert(tn.AsString() == "04/20/2007 01:01:00"); //Local eMonth t.SetTimeZonePrecision(CTime::eMonth); tn = t; tn.AddDay(5); assert(tn.AsString() == "03/16/2007 01:01:00"); tn = t; tn.AddMonth(-1); assert(tn.AsString() == "02/11/2007 01:01:00"); tn = t; tn.AddMonth(+1); assert(tn.AsString() == "04/11/2007 02:01:00"); // Local eDay t.SetTimeZonePrecision(CTime::eDay); tn = t; tn.AddDay(-1); assert(tn.AsString() == "03/10/2007 01:01:00"); tn.AddDay(); assert(tn.AsString() == "03/11/2007 01:01:00"); tn = t; tn.AddDay(); assert(tn.AsString() == "03/12/2007 02:01:00"); // Local eHour t.SetTimeZonePrecision(CTime::eHour); tn = t; tn.AddHour(-3); CTime te = t; te.AddHour(3); assert(tn.AsString() == "03/10/2007 22:01:00"); assert(te.AsString() == "03/11/2007 05:01:00"); CTime th = tn; th.AddHour(49); assert(th.AsString() == "03/13/2007 00:01:00"); tn = "11/04/2007 00:01:00"; tn.SetTimeZonePrecision(CTime::eHour); te = tn; tn.AddHour(-3); te.AddHour(9); assert(tn.AsString() == "11/03/2007 21:01:00"); assert(te.AsString() == "11/04/2007 08:01:00"); th = tn; th.AddHour(49); assert(th.AsString() == "11/05/2007 21:01:00"); tn = "11/04/2007 09:01:00"; tn.SetTimeZonePrecision(CTime::eHour); te = tn; tn.AddHour(-10); te.AddHour(+10); assert(tn.AsString() == "11/04/2007 00:01:00"); assert(te.AsString() == "11/04/2007 19:01:00"); }} }