пятница, 17 мая 2013 г.

Пост о времени :)

Когда-то уже давно Джоэл Спольски написал отличный пост в своём блоге - "Абсолютный минимум, который каждый разработчик программного обеспечения обязательно должен знать о Unicode и наборах символов". Приведу небольшую цитату - самое главное о кодировках:
"запомните, пожалуйста, один очень важный факт. Строка не имеет никакого смысла, если вы не знаете, в какой кодировке она записана... Нет такого понятия, как простой текст. Если у вас есть строка - в памяти, в файле или почтовом сообщении, то вы должны знать, в какой она кодировке, иначе вы не сможете правильно интерпретировать её или показать пользователям"
Так вот, нечто подобное - весьма подобное - можно сказать и о времени и датах. Сколько ошибок и нестыковок обнаруживается в софте, написанном теми программистами, которые (почему-то) считают, что есть просто дата и время. Абсолютные, везде и всюду, без учёта часовых поясов, без перевода часов на летнее/зимнее время, без високосных лет и корректировочных секунд.
В этом посте я не буду вдаваться в технические детали или в особенности реализации на конкретном языке разработки, но постараюсь объяснить базовые принципы.

В одной из статей встретил удобное и образное выражение - "треугольник данных о времени". О чём речь? Дело в том, что при решении связанных с понятием времени задач приходится работать с тремя основными величинами:
timestamp: 1367221379575
Часовой пояс timezone: Europe/Minsk GMT+03:00
Дата/время date: понедельник, 29 апреля 2013, 10:42:59
Фактически, эти величины тесно взаимосвязаны - чтобы вычислить одну из них, нужно знать две другие. А потому можно изобразить их вершинами треугольника.
"Треугольник" времени
timestamp - это точный показатель момента времени. Прямо сейчас, в данный момент времени, во всём мире timestamp одинаковый. Каждую секунду он  увеличивается на 1000.
Задачка про время.
Q: Разработчик Вася работает во Владивостоке и в своём коде вызывает System.currentTimeMillis(). Девелопер Петя сидит в офисе в Москве и в своём коде тоже пишет System.currentTimeMillis(). Если каждый из них запустит свой код так, чтобы вызов System.currentTimeMillis() произошёл одновременно, как будут соотноситься полученные ими значения?
A: Вернёт одно и тоже значение в один момент времени во всех точках земного шара, не имеет значение, в каком часовом поясе находится JVM. Если хотите, об этом можно думать, как точка во времени. Но смысл этого числа - количество миллисекунд, прошедших с 1970-01-01 00:00:00 UTC (именно UTC, а не с момента, когда 1970-01-01 было ноль часов в поселении на Магадане).
Часовой пояс (временная зона, timezone) - это величина, показывающая смещение времени в конкретном месте относительно UTC, т. е. относительно нулевого часового пояса (ранее в качестве эталона использовалось GMT - среднее время по Гринвичу). Смещение может быть положительным (восточнее UTC) или отрицательным (западнее UTC).
Записывается в виде UTC-7 или UTC+3. Например, UTC+3 означает, что в Минске (собственно, и во всей Беларуси и в других странах этого же пояса) местное время смещено на 3 часа вперёд относительно UTC. Если в Лондоне (нулевой пояс) полночь, то в Минске 3 часа ночи; если в Лондоне 22 часа - то в Минске уже 1 час следующего дня - т. е. всегда местное время опережает UTC на те же 3 часа.
Также для задания часового пояса часто используется формат типа "Europe/Minsk GMT+03:00". Но следует обратить внимание, что некоторые библиотеки работают только в терминах UTC (например, та же joda-time).
И, наконец, дата/время - это то, что мы видим, когда смотрим на часы. Начало работы в 08:00, обед с 12 до 13 и т. д.




Полезные и разные ссылки по теме:
Работа с датами в java
Java Date and Time Tutorial
Как нужно работать с часовыми поясами
Как перестать думать о часовых поясах и начать жить (несмотря на громкое название)
otvety.google.ru: цифровые часы

Комментариев нет:

Отправить комментарий