Windows: use SystemTimeToTzSpecificLocalTime instead of localtime_s.
The localtime_s function produces incorrect results for russian time zone. BUG=chromium:417640 LOG=Y R=yangguo@chromium.org Review URL: https://codereview.chromium.org/654843012 Cr-Commit-Position: refs/heads/master@{#24922} git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@24922 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
parent
f118921e3b
commit
2b26c7a144
@ -346,41 +346,26 @@ void Win32Time::SetToCurrentTime() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
int64_t FileTimeToInt64(FILETIME ft) {
|
||||||
|
ULARGE_INTEGER result;
|
||||||
|
result.LowPart = ft.dwLowDateTime;
|
||||||
|
result.HighPart = ft.dwHighDateTime;
|
||||||
|
return static_cast<int64_t>(result.QuadPart);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// Return the local timezone offset in milliseconds east of UTC. This
|
// Return the local timezone offset in milliseconds east of UTC. This
|
||||||
// takes into account whether daylight saving is in effect at the time.
|
// takes into account whether daylight saving is in effect at the time.
|
||||||
// Only times in the 32-bit Unix range may be passed to this function.
|
// Only times in the 32-bit Unix range may be passed to this function.
|
||||||
// Also, adding the time-zone offset to the input must not overflow.
|
// Also, adding the time-zone offset to the input must not overflow.
|
||||||
// The function EquivalentTime() in date.js guarantees this.
|
// The function EquivalentTime() in date.js guarantees this.
|
||||||
int64_t Win32Time::LocalOffset(TimezoneCache* cache) {
|
int64_t Win32Time::LocalOffset(TimezoneCache* cache) {
|
||||||
cache->InitializeIfNeeded();
|
FILETIME local;
|
||||||
|
SYSTEMTIME system_utc, system_local;
|
||||||
Win32Time rounded_to_second(*this);
|
FileTimeToSystemTime(&time_.ft_, &system_utc);
|
||||||
rounded_to_second.t() = rounded_to_second.t() / 1000 / kTimeScaler *
|
SystemTimeToTzSpecificLocalTime(NULL, &system_utc, &system_local);
|
||||||
1000 * kTimeScaler;
|
SystemTimeToFileTime(&system_local, &local);
|
||||||
// Convert to local time using POSIX localtime function.
|
return (FileTimeToInt64(local) - FileTimeToInt64(time_.ft_)) / kTimeScaler;
|
||||||
// Windows XP Service Pack 3 made SystemTimeToTzSpecificLocalTime()
|
|
||||||
// very slow. Other browsers use localtime().
|
|
||||||
|
|
||||||
// Convert from JavaScript milliseconds past 1/1/1970 0:00:00 to
|
|
||||||
// POSIX seconds past 1/1/1970 0:00:00.
|
|
||||||
double unchecked_posix_time = rounded_to_second.ToJSTime() / 1000;
|
|
||||||
if (unchecked_posix_time > INT_MAX || unchecked_posix_time < 0) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
// Because _USE_32BIT_TIME_T is defined, time_t is a 32-bit int.
|
|
||||||
time_t posix_time = static_cast<time_t>(unchecked_posix_time);
|
|
||||||
|
|
||||||
// Convert to local time, as struct with fields for day, hour, year, etc.
|
|
||||||
tm posix_local_time_struct;
|
|
||||||
if (localtime_s(&posix_local_time_struct, &posix_time)) return 0;
|
|
||||||
|
|
||||||
if (posix_local_time_struct.tm_isdst > 0) {
|
|
||||||
return (cache->tzinfo_.Bias + cache->tzinfo_.DaylightBias) * -kMsPerMinute;
|
|
||||||
} else if (posix_local_time_struct.tm_isdst == 0) {
|
|
||||||
return (cache->tzinfo_.Bias + cache->tzinfo_.StandardBias) * -kMsPerMinute;
|
|
||||||
} else {
|
|
||||||
return cache->tzinfo_.Bias * -kMsPerMinute;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user