УкраїнськаEnglishmRussian
Вход/Новый
В теме нет новых постов

[BugWrong] Куда девается 1 час?


Автор Сообщение
Сообщение создано: 14. 08. 2013 [19:36]
dell
Путин Краб
Создатель темы
Зарегистрирован(а) с: 09.04.2013
Сообщения: 28
Вывожу на экран следующую конструкцию:
JAVASCRIPT
(SYS.time()%86400)/3600;

Т.е. имеем время с эпохи UNIX, берем остаток от деления числа секунд в сутках, получаем число секунд от 0.00. Для удобства делим его на число секунд в часе. Получаем число часов от 0.00. Это число должно быть независящим от того, какой сейчас день. Ведь берем мы именно целые дни. Тем не менее это не так. Если мы ставим дату в компьютере до 1980 года, то у нас правильно считает. Если же выше, например 1981, то число часов от 0.00 становится меньше на 1 час, почему?
Это нужно было для того, чтобы привязаться к определенному времени в сутках, а тут смещение произошло.
OpenSCADA 0.8.0.7
Сообщение создано: 15. 08. 2013 [08:06]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"dell" wrote:

Т.е. имеем время с эпохи UNIX, берем остаток от деления числа секунд в сутках, получаем число секунд от 0.00. Для удобства делим его на число секунд в часе. Получаем число часов от 0.00. Это число должно быть независящим от того, какой сейчас день. Ведь берем мы именно целые дни. Тем не менее это не так. Если мы ставим дату в компьютере до 1980 года, то у нас правильно считает. Если же выше, например 1981, то число часов от 0.00 становится меньше на 1 час, почему?

Время это не ошибка OpenSCADA, поскольку она его не формирует!

А меньше по причине того, что время на компьютере не в UTC, а согласно зоне. Т.е для UTC нулевое время это 1970-01-01 00:00:00, т.е остатка в часах нет, а для зоны, скажем моей (GMT+3): 1970-01-01 03:00:00, т.е. остаток в часах на разницу в зоне. Естественно, что абсолютное выравнивание в секундах на интервалах более часа будет иметь разницу три часа. Мало того, если производится переход на летнее время и обратно, то этот остаток будет меняться на +1 летом и обратно зимой.

Чтобы этого не было нужно брать значение часов для нулевого времени вашей зоны и добавлять при округлении, и вычитать после. У меня эта проблема сравнительно недавно на графиках всплывала, если ставить размер окна в сутки.

Learn, learn and learn better than work, work and work.
Сообщение создано: 16. 08. 2013 [06:09]
dell
Путин Краб
Создатель темы
Зарегистрирован(а) с: 09.04.2013
Сообщения: 28
C UTC c Вами согласен, у нас вообще +5 часов, и это учитываем. Проблема то в том, что переломными становятся года 1980 и 1981. Все, что до 1980, считается верно, всё что после 1981 включительно - пропадает 1 час. Месяц, день не меняю. Просто изменяю дату в ОС, и появляется разница. Зимнего времени тоже нет, да и даже если бы было, месяц и число мы же не меняем.
Если OpenSCADA время не формирует, то откуда она его берет? Может тут дело в самой ОС? Хотя проверял на 2 системах. Не вылезет ли подобная ошибка в будущем?
Сообщение создано: 16. 08. 2013 [08:13]
roman
Roman Savochenko
Moderator
Contributor
Developer
Зарегистрирован(а) с: 12.12.2007
Сообщения: 3750
"dell" wrote:

C UTC c Вами согласен, у нас вообще +5 часов, и это учитываем.

Значит не совсем учитываете.
Откройте функцию tmStrPTime() в конфигураторе и поглядите на её результат при вызове с 0.

"dell" wrote:

Проблема то в том, что переломными становятся года 1980 и 1981. Все, что до 1980, считается верно, всё что после 1981 включительно - пропадает 1 час.

Значит таблица TZ для вашего региона только с этого момента и прописана.

"dell" wrote:

Зимнего времени тоже нет, да и даже если бы было, месяц и число мы же не меняем.

До 2010 кажется было!

"dell" wrote:

Если OpenSCADA время не формирует, то откуда она его берет?

Прямо у системной функции time().

"dell" wrote:

Может тут дело в самой ОС? Хотя проверял на 2 системах. Не вылезет ли подобная ошибка в будущем?

Дело во временной зоне.
У меня ничего нигде не вылазит.

P.S. Мне не понятно зачем Вы вообще так делаете? Если Вам нужно получить время на день+месяц+год при нулевом часе+минуте+секунде то есть функция mktime(), которая может использоваться для навигации по годам, месяцам, дням, часам, минутам и секундам. Например, эта функция как-раз полезна при формировании документов с чёткими границами, особенно для месяцев, которые не одинаковы в размере.

Learn, learn and learn better than work, work and work.



13461