| Index: Source/wtf/DateMath.cpp
|
| diff --git a/Source/wtf/DateMath.cpp b/Source/wtf/DateMath.cpp
|
| index 1c901b712d3aee23be9ea78c6c68e416efcab2d2..9873a2a74f99a2185a829b2a90662e0b946784d4 100644
|
| --- a/Source/wtf/DateMath.cpp
|
| +++ b/Source/wtf/DateMath.cpp
|
| @@ -103,7 +103,6 @@ namespace WTF {
|
|
|
| static const double hoursPerDay = 24.0;
|
| static const double secondsPerDay = 24.0 * 60.0 * 60.0;
|
| -static const double secondsPerHour = 60.0 * 60.0;
|
|
|
| static const double maxUnixTime = 2145859200.0; // 12/31/2037
|
|
|
| @@ -195,22 +194,6 @@ static inline double msToMilliseconds(double ms)
|
| return result;
|
| }
|
|
|
| -static int msToMinutes(double ms)
|
| -{
|
| - double result = fmod(floor(ms / msPerMinute), minutesPerHour);
|
| - if (result < 0)
|
| - result += minutesPerHour;
|
| - return static_cast<int>(result);
|
| -}
|
| -
|
| -static int msToHours(double ms)
|
| -{
|
| - double result = fmod(floor(ms/msPerHour), hoursPerDay);
|
| - if (result < 0)
|
| - result += hoursPerDay;
|
| - return static_cast<int>(result);
|
| -}
|
| -
|
| int monthFromDayInYear(int dayInYear, bool leapYear)
|
| {
|
| const int d = dayInYear;
|
| @@ -358,7 +341,7 @@ static int equivalentYearForDST(int year)
|
| return year;
|
| }
|
|
|
| -int32_t calculateUTCOffset()
|
| +static double calculateUTCOffset()
|
| {
|
| #if OS(WIN)
|
| TIME_ZONE_INFORMATION timeZoneInformation;
|
| @@ -370,32 +353,8 @@ int32_t calculateUTCOffset()
|
| tm localt;
|
| getLocalTime(&localTime, &localt);
|
|
|
| - // Get the difference between this time zone and UTC on the 1st of January of this year.
|
| - localt.tm_sec = 0;
|
| - localt.tm_min = 0;
|
| - localt.tm_hour = 0;
|
| - localt.tm_mday = 1;
|
| - localt.tm_mon = 0;
|
| - // Not setting localt.tm_year!
|
| - localt.tm_wday = 0;
|
| - localt.tm_yday = 0;
|
| - localt.tm_isdst = 0;
|
| -#if HAVE(TM_GMTOFF)
|
| - localt.tm_gmtoff = 0;
|
| -#endif
|
| -#if HAVE(TM_ZONE)
|
| - localt.tm_zone = 0;
|
| -#endif
|
| -
|
| -#if HAVE(TIMEGM)
|
| - time_t utcOffset = timegm(&localt) - mktime(&localt);
|
| -#else
|
| - // Using a canned date of 01/01/2009 on platforms with weaker date-handling foo.
|
| - localt.tm_year = 109;
|
| - time_t utcOffset = 1230768000 - mktime(&localt);
|
| -#endif
|
| -
|
| - return static_cast<int32_t>(utcOffset * 1000);
|
| + // tm_gmtoff includes any daylight savings offset, so subtract it.
|
| + return static_cast<double>(localt.tm_gmtoff * msPerSecond - (localt.tm_isdst > 0 ? msPerHour : 0));
|
| #endif
|
| }
|
|
|
| @@ -409,29 +368,17 @@ static double calculateDSTOffsetSimple(double localTimeSeconds, double utcOffset
|
| else if (localTimeSeconds < 0) // Go ahead a day to make localtime work (does not work with 0)
|
| localTimeSeconds += secondsPerDay;
|
|
|
| - //input is UTC so we have to shift back to local time to determine DST thus the + getUTCOffset()
|
| - double offsetTime = (localTimeSeconds * msPerSecond) + utcOffset;
|
| -
|
| - // Offset from UTC but doesn't include DST obviously
|
| - int offsetHour = msToHours(offsetTime);
|
| - int offsetMinute = msToMinutes(offsetTime);
|
| -
|
| // FIXME: time_t has a potential problem in 2038
|
| time_t localTime = static_cast<time_t>(localTimeSeconds);
|
|
|
| tm localTM;
|
| getLocalTime(&localTime, &localTM);
|
|
|
| - double diff = ((localTM.tm_hour - offsetHour) * secondsPerHour) + ((localTM.tm_min - offsetMinute) * 60);
|
| -
|
| - if (diff < 0)
|
| - diff += secondsPerDay;
|
| -
|
| - return (diff * msPerSecond);
|
| + return localTM.tm_isdst > 0 ? msPerHour : 0;
|
| }
|
|
|
| // Get the DST offset, given a time in UTC
|
| -double calculateDSTOffset(double ms, double utcOffset)
|
| +static double calculateDSTOffset(double ms, double utcOffset)
|
| {
|
| // On Mac OS X, the call to localtime (see calculateDSTOffsetSimple) will return historically accurate
|
| // DST information (e.g. New Zealand did not have DST from 1946 to 1974) however the JavaScript
|
| @@ -881,4 +828,11 @@ String makeRFC2822DateString(unsigned dayOfWeek, unsigned day, unsigned month, u
|
| return stringBuilder.toString();
|
| }
|
|
|
| +double convertToLocalTime(double ms)
|
| +{
|
| + double utcOffset = calculateUTCOffset();
|
| + double dstOffset = calculateDSTOffset(ms, utcOffset);
|
| + return (ms + utcOffset + dstOffset);
|
| +}
|
| +
|
| } // namespace WTF
|
|
|