src/corelib/tools/qdatetime.cpp
branchRCL_3
changeset 5 d3bac044e0f0
parent 4 3b1da2848fc7
child 7 3f74d0d4af4c
equal deleted inserted replaced
4:3b1da2848fc7 5:d3bac044e0f0
    73 #include <private/qcore_mac_p.h>
    73 #include <private/qcore_mac_p.h>
    74 #endif
    74 #endif
    75 
    75 
    76 #if defined(Q_OS_SYMBIAN)
    76 #if defined(Q_OS_SYMBIAN)
    77 #include <e32std.h>
    77 #include <e32std.h>
       
    78 #include <tz.h>
    78 #endif
    79 #endif
    79 
    80 
    80 QT_BEGIN_NAMESPACE
    81 QT_BEGIN_NAMESPACE
    81 
    82 
    82 enum {
    83 enum {
  3719     res.tm_year = sysTime.wYear - 1900;
  3720     res.tm_year = sysTime.wYear - 1900;
  3720     brokenDown = &res;
  3721     brokenDown = &res;
  3721 #elif defined(Q_OS_SYMBIAN)
  3722 #elif defined(Q_OS_SYMBIAN)
  3722     // months and days are zero index based
  3723     // months and days are zero index based
  3723     _LIT(KUnixEpoch, "19700000:000000.000000");
  3724     _LIT(KUnixEpoch, "19700000:000000.000000");
  3724     TTimeIntervalSeconds utcOffset = User::UTCOffset();
       
  3725     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
  3725     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
  3726     TTime epochTTime;
  3726     TTime epochTTime;
  3727     TInt err = epochTTime.Set(KUnixEpoch);
  3727     TInt err = epochTTime.Set(KUnixEpoch);
  3728     tm res;
  3728     tm res;
  3729     if(err == KErrNone) {
  3729     if(err == KErrNone) {
  3730         TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
  3730         TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
  3731         utcTTime = utcTTime + utcOffset;
  3731         TRAP(err,
  3732         TDateTime utcDateTime = utcTTime.DateTime();
  3732             RTz tz;
  3733         res.tm_sec = utcDateTime.Second();
  3733             User::LeaveIfError(tz.Connect());
  3734         res.tm_min = utcDateTime.Minute();
  3734             CleanupClosePushL(tz);
  3735         res.tm_hour = utcDateTime.Hour();
  3735             res.tm_isdst = tz.IsDaylightSavingOnL(*tz.GetTimeZoneIdL(),utcTTime);
  3736         res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
  3736             User::LeaveIfError(tz.ConvertToLocalTime(utcTTime));
  3737         res.tm_mon = utcDateTime.Month();
  3737             CleanupStack::PopAndDestroy(&tz));
  3738         res.tm_year = utcDateTime.Year() - 1900;
  3738         if (KErrNone == err) {
  3739         res.tm_isdst = 0;
  3739             TDateTime localDateTime = utcTTime.DateTime();
  3740         brokenDown = &res;
  3740             res.tm_sec = localDateTime.Second();
       
  3741             res.tm_min = localDateTime.Minute();
       
  3742             res.tm_hour = localDateTime.Hour();
       
  3743             res.tm_mday = localDateTime.Day() + 1; // non-zero based index for tm struct
       
  3744             res.tm_mon = localDateTime.Month();
       
  3745             res.tm_year = localDateTime.Year() - 1900;
       
  3746             // Symbian's timezone server doesn't know how to handle DST before year 1997
       
  3747             if (res.tm_year < 97)
       
  3748                 res.tm_isdst = -1;
       
  3749             brokenDown = &res;
       
  3750         }
  3741     }
  3751     }
  3742 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  3752 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  3743     // use the reentrant version of localtime() where available
  3753     // use the reentrant version of localtime() where available
  3744     tzset();
  3754     tzset();
  3745     tm res;
  3755     tm res;
  3810     res.tm_isdst = (int)isdst;
  3820     res.tm_isdst = (int)isdst;
  3811     brokenDown = &res;
  3821     brokenDown = &res;
  3812 #elif defined(Q_OS_SYMBIAN)
  3822 #elif defined(Q_OS_SYMBIAN)
  3813     // months and days are zero index based
  3823     // months and days are zero index based
  3814     _LIT(KUnixEpoch, "19700000:000000.000000");
  3824     _LIT(KUnixEpoch, "19700000:000000.000000");
  3815     TTimeIntervalSeconds utcOffset = TTimeIntervalSeconds(0 - User::UTCOffset().Int());
       
  3816     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
  3825     TTimeIntervalSeconds tTimeIntervalSecsSince1Jan1970UTC(secsSince1Jan1970UTC);
  3817     TTime epochTTime;
  3826     TTime epochTTime;
  3818     TInt err = epochTTime.Set(KUnixEpoch);
  3827     TInt err = epochTTime.Set(KUnixEpoch);
  3819     tm res;
  3828     tm res;
  3820     if(err == KErrNone) {
  3829     if(err == KErrNone) {
  3821         TTime utcTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
  3830         TTime localTTime = epochTTime + tTimeIntervalSecsSince1Jan1970UTC;
  3822         utcTTime = utcTTime + utcOffset;
  3831         RTz tz;
  3823         TDateTime utcDateTime = utcTTime.DateTime();
  3832         if (KErrNone == tz.Connect()) {
  3824         res.tm_sec = utcDateTime.Second();
  3833             if (KErrNone == tz.ConvertToUniversalTime(localTTime)) {
  3825         res.tm_min = utcDateTime.Minute();
  3834                 TDateTime utcDateTime = localTTime.DateTime();
  3826         res.tm_hour = utcDateTime.Hour();
  3835                 res.tm_sec = utcDateTime.Second();
  3827         res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
  3836                 res.tm_min = utcDateTime.Minute();
  3828         res.tm_mon = utcDateTime.Month();
  3837                 res.tm_hour = utcDateTime.Hour();
  3829         res.tm_year = utcDateTime.Year() - 1900;
  3838                 res.tm_mday = utcDateTime.Day() + 1; // non-zero based index for tm struct
  3830         res.tm_isdst = (int)isdst;
  3839                 res.tm_mon = utcDateTime.Month();
  3831         brokenDown = &res;
  3840                 res.tm_year = utcDateTime.Year() - 1900;
       
  3841                 res.tm_isdst = (int)isdst;
       
  3842                 brokenDown = &res;
       
  3843             }
       
  3844         tz.Close();
       
  3845         }
  3832     }
  3846     }
  3833 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  3847 #elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
  3834     // use the reentrant version of gmtime() where available
  3848     // use the reentrant version of gmtime() where available
  3835     tm res;
  3849     tm res;
  3836     brokenDown = gmtime_r(&secsSince1Jan1970UTC, &res);
  3850     brokenDown = gmtime_r(&secsSince1Jan1970UTC, &res);