#actionscript-3 #datetime #date #utc #localtime
#actionscript-3 #дата и время #Дата #utc #местное время
Вопрос:
У меня проблема. Используя Date()
функции, которые AS3 предоставляет изначально, я преобразую время UTC в локальное машинное время.
Проблема, с которой я столкнулся, заключается в следующем, посмотрите на month
и hour
.
2011-10-07 18:45:00 -> 2011-10-07 21:45:00
2011-11-07 18:45:00 -> 2011-11-07 20:45:00
Вероятно, это связано с переходом на летнее время, но я подумал, что встроенные функции для обработки дат учитывают это.
Я прав, в этом проблема? Я должен сам учитывать переход на летнее время? Или это что-то другое?
Комментарии:
1. UTC и GMT одинаковы … не уверен, что ты имеешь в виду?
2. Я имел в виду GMT 2. Местное время — GMT 2, но после 10-го месяца года все часы показывают на 1 час раньше. Я посмотрел зимнее время, и это происходит 31 октября. Наверное, так оно и есть. Но не уверен, как с этим справиться, поскольку я думал, что дата AS3 делает все даты мумбо-юмбо.
3. Сохраняете ли вы где — нибудь информацию о часовом поясе? Где выполняется код AS3 ? Работает ли он на компьютере с правильными настройками часового пояса?
4. Привет. Информация о часовом поясе берется с устройства. Он запускается на мобильном устройстве как приложение AIR.
Ответ №1:
Из документации по дате:
Класс Date обрабатывает переход на летнее время по-разному, в зависимости от операционной системы и версии среды выполнения… Объект Date определяет, используется ли летнее время в текущем языковом стандарте, и если это так, он определяет дату и время перехода от стандартного к летнему времени.
Исходя из этого, я полагаю, это означает, что объект Date будет определять летнее время для текущего времени. Если вы смотрите на дату в будущем, я думаю, вам нужно будет справиться со смещением самостоятельно.
Я использовал этот код в прошлом для учета летнего времени, найденного на computus.org:
public static function getTimezone():Number
{
// Create two dates: one summer and one winter
var d1:Date = new Date( 0, 0, 1 )
var d2:Date = new Date( 0, 6, 1 )
// largest value has no DST modifier
var tzd:Number = Math.max( d1.timezoneOffset, d2.timezoneOffset )
// convert to milliseconds
return tzd * 60000
}
public static function getDST( d:Date ):Number
{
var tzd:Number = getTimezone()
var dst:Number = (d.timezoneOffset * 60000) - tzd
return dst
}
Комментарии:
1. Хм, это интересно. Я проверю это завтра и вернусь. Спасибо.
2. Это сработало, спасибо. Я не уверен, хорошо ли это работает для других часовых поясов, кроме моего, но то, что я сделал, было:
myDate.hours =1 getDST(converted)/MILLISECONDS_IN_A_DAY;
Ответ №2:
Если вы просто хотите вернуть значение даты 2 из UTC 0, используя оператор select, и учитывая, что вам не нужно обслуживать DLST, примером может быть Южная Африка, тогда для меня сработало следующее:
SELECT [FieldA]
,DATEADD(hour,2([DateField])) AS [NewDate]
FROM [Table]