src/corelib/tools/qdatetime.cpp
branchRCL_3
changeset 5 d3bac044e0f0
parent 4 3b1da2848fc7
child 7 3f74d0d4af4c
--- a/src/corelib/tools/qdatetime.cpp	Fri Feb 19 23:40:16 2010 +0200
+++ b/src/corelib/tools/qdatetime.cpp	Fri Mar 12 15:46:37 2010 +0200
@@ -75,6 +75,7 @@
 
 #if defined(Q_OS_SYMBIAN)
 #include <e32std.h>
+#include <tz.h>
 #endif
 
 QT_BEGIN_NAMESPACE
@@ -3721,23 +3722,32 @@
 #elif defined(Q_OS_SYMBIAN)
     // months and days are zero index based
     _LIT(KUnixEpoch, "19700000:000000.000000");
-    TTimeIntervalSeconds utcOffset = User::UTCOffset();
     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
     TTime epochTTime;
     TInt err = epochTTime.Set(KUnixEpoch);
     tm res;
     if(err == KErrNone) {
         TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
-        utcTTime = utcTTime + utcOffset;
-        TDateTime utcDateTime = utcTTime.DateTime();
-        res.tm_sec = utcDateTime.Second();
-        res.tm_min = utcDateTime.Minute();
-        res.tm_hour = utcDateTime.Hour();
-        res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
-        res.tm_mon = utcDateTime.Month();
-        res.tm_year = utcDateTime.Year() - 1900;
-        res.tm_isdst = 0;
-        brokenDown = &res;
+        TRAP(err,
+            RTz tz;
+            User::LeaveIfError(tz.Connect());
+            CleanupClosePushL(tz);
+            res.tm_isdst = tz.IsDaylightSavingOnL(*tz.GetTimeZoneIdL(),utcTTime);
+            User::LeaveIfError(tz.ConvertToLocalTime(utcTTime));
+            CleanupStack::PopAndDestroy(&tz));
+        if (KErrNone == err) {
+            TDateTime localDateTime = utcTTime.DateTime();
+            res.tm_sec = localDateTime.Second();
+            res.tm_min = localDateTime.Minute();
+            res.tm_hour = localDateTime.Hour();
+            res.tm_mday = localDateTime.Day() + 1; // non-zero based index for tm struct
+            res.tm_mon = localDateTime.Month();
+            res.tm_year = localDateTime.Year() - 1900;
+            // Symbian's timezone server doesn't know how to handle DST before year 1997
+            if (res.tm_year < 97)
+                res.tm_isdst = -1;
+            brokenDown = &res;
+        }
     }
 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
     // use the reentrant version of localtime() where available
@@ -3812,23 +3822,27 @@
 #elif defined(Q_OS_SYMBIAN)
     // months and days are zero index based
     _LIT(KUnixEpoch, "19700000:000000.000000");
-    TTimeIntervalSeconds utcOffset = TTimeIntervalSeconds(0 - User::UTCOffset().Int());
     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
     TTime epochTTime;
     TInt err = epochTTime.Set(KUnixEpoch);
     tm res;
     if(err == KErrNone) {
-        TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
-        utcTTime = utcTTime + utcOffset;
-        TDateTime utcDateTime = utcTTime.DateTime();
-        res.tm_sec = utcDateTime.Second();
-        res.tm_min = utcDateTime.Minute();
-        res.tm_hour = utcDateTime.Hour();
-        res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
-        res.tm_mon = utcDateTime.Month();
-        res.tm_year = utcDateTime.Year() - 1900;
-        res.tm_isdst = (int)isdst;
-        brokenDown = &res;
+        TTime localTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
+        RTz tz;
+        if (KErrNone == tz.Connect()) {
+            if (KErrNone == tz.ConvertToUniversalTime(localTTime)) {
+                TDateTime utcDateTime = localTTime.DateTime();
+                res.tm_sec = utcDateTime.Second();
+                res.tm_min = utcDateTime.Minute();
+                res.tm_hour = utcDateTime.Hour();
+                res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
+                res.tm_mon = utcDateTime.Month();
+                res.tm_year = utcDateTime.Year() - 1900;
+                res.tm_isdst = (int)isdst;
+                brokenDown = &res;
+            }
+        tz.Close();
+        }
     }
 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
     // use the reentrant version of gmtime() where available