PDA

Просмотр полной версии : Часы. Летнее\зимнее время. Как проверить правильно ли работают?


Art_133
15.06.2009, 17:05
Привет. Вроде сделал украинские часы (http://133-design.com/time/) с переходом на летнее время, но не могу понять как проверить их работоспособность.
Я учитываю погрешность относительно гринвича. Летом эта погрешность составляет +3, зимой +2. Учитываю летний период присваиваю значение переменной shift = 3, и зимой shift = 2.
На компьютерном календаре меняю месяц и число (проверяю реакцию на летний\зимний периоды) - трейситься нормально. Но вот на стрелках как было 15.00 (на пример) так и осталось. Подскажите что я не так делаю? Или когда комп сам перейдёт на зимнее время то всё будет ок?
Если нужен исходник - я выложу.
Вот сам код:

// Обычное Украинское время (не летнее) относительно гринвича +2, летнее +3
// Погрешность относительно гринвича
var shift:Number;

//Экземпляр класса Date
var today:Date = new Date();
// Текущий месяц (добавляем 1 т.к. первый месяц года начинается с ноля)
var month:Number = today.getMonth() + 1;
// День
var day:Number = today.getDate();
// Год
var year:Number = today.getFullYear();


// Определяем год, т.к. летнее время начинается\заканчивается в разные числа разного года
switch (year) {
case 2009 :
// В 2009-м году летнее время с 29 марта по 25 октября
// Определяем летнее время сейчас или зимнее
if (summerTime(29, 3, 25, 10)) {
shift = 3;
} else {
shift = 2;
}
trace('2009');
break;

case 2010 :
// В 2010-м году летее время с 28 марта по 31 октября
// Определяем летнее время сейчас или зимнее
if (summerTime(28, 3, 31, 10)) {
shift = 3;
} else {
shift = 2;
}
trace('2010');
break;

default :
trace('default');
}

// Определяем летнее время сейчас или зимнее
// sDay, sMon - день и месяц начала летнего времени
// fDay, fMon - день и мецяс окончания летнего времени
function summerTime(sDay:Number, sMon:Number, fDay:Number, fMon:Number):Boolean {
if (month < sMon || month > fMon) {
return false;
}
if ((month == sMon && day < sDay) || (month == fMon && day > fDay)) {
return false;
}
return true;
}
///////////////////////////////////Крутим стрелки//////////////////////////////////////////////

s._rotation = today.getSeconds() * 6;
m._rotation = today.getMinutes() * 6;
h._rotation = (today.getUTCHours() + shift) * 30 + today.getMinutes() / 2;

c'v
20.07.2009, 01:44
Классный вопрос! Я над ним тоже голову ломаю. А вообще, было бы очень интересно, как написать код, который не на пару лет вперед, а на адцать лет вперед знал когда будет переход. Ведь если человеку можно сказать "последняя суббота такого-то месяца", то уж программе точно можно. Сколько не думал о таком if, ни к какому выводу не пришел...

В любом случае, мы же здесь явно не Америку открываем, наверняка этот вопрос десятки раз уже было освещен. Вот только где?.. Над запросом в google тоже приходится голову ломать… Help!

iNils
20.07.2009, 13:43
На мой взгляд, вы оба ерундой страдаете.
trace (new Date (2009, 9, 25, 1));//Sun Oct 25 01:00:00 GMT+0400 2009
trace (new Date (2009, 9, 25, 2));//Sun Oct 25 02:00:00 GMT+0300 2009
Видите у одной даты GMT+0400, а у другой GMT+0300? Это и есть показатель зимнего или летнего времени.
Узнается с помощью getTimezoneOffset().

Prior
02.04.2011, 23:55
у меня задача посложнее
мне надо сделать часики для разных часовых поясов например москва, киев, нью-йорк, токио
вот как подскажите там действовать, если в москве например уже непереводят часы а в багдаде, тбилиси кажись переводят
как учитывать такое

dark256
03.04.2011, 00:44
а никак. в юникс-дате нет такого параметра - "проверить включенность зимне-летнего времени в Багдаде" :)
getTimezoneOffset() - это тоже настройка из компа берется.

Сделайте собственную таблицу с параметрами-настройками городов и уже по ней сами выставляйте правильное время. А по getTimezoneOffset() вы лишь можете ЛОКАЛЬНЫЕ часы выставить на ноль, на гринвич. Все.