В вашей системе время играет важную роль? Ваши пользователи/компоненты распределены по территории всего земного шара, или хотя бы нашей необъятной родины? Значит, вам нужны часовые пояса. Что ж, это просто. Самое сложное, что вам придется сделать — не запутаться. Об этом мы с вами и поговорим. Для начала вам нужно научиться правильно думать. Думая правильно, все остальное будет для вас либо самоочевидным, либо достаточно простым.
Начнем с часов. Все мы привыкли определять время, глядя на часы на стене. При работе с часовыми поясами такое время называется Wall clock time. В принципе, ничего плохого в нем нет, только в разных местах земного шара в один и тот же момент времени часы показывают разное время. Если задаться целью, можно придумать алгоритм перевода wall clock time одного часового пояса в wall clock time другого. Обычно надо прибавить/отнять разницу в часах между часовыми поясами, кроме (внимание) моментов перехода на летнее/зимнее время. Вот когда начинается переход, вычисления становятся по-настоящему сложными.
Нам же нужно что-то простое и пуленепробиваемое, как… целое число. Так появилось понятие момента во времени (instant in time, Unix time, POSIX time, time since (unix) epoch), который представляет собой число секунд (в Java — миллисекунд), прошедших с 1 января 1970 года, 00:00:00 по GMT. Момент времени одинаков по всему земному шару — если представить, что в кто-то нажал на «паузу» и течение времени остановилось, число, соответствующее моменту времени по всей Земле будет одно и то же, независимо от часового пояса. Если бы кто-то нажал на паузу через час после того, как на Гринвиче наступил новый 1970 год, момент во времени по всей Земле показывал бы 3 600,000. А сейчас, например, это уже число 1 280 720 431,859.
Итак, момент во времени — это универсальная конвертируемая валюта временных вычислений. Он зависит только от, хм, времени, моменты можно сравнивать (соответственно, определять, какое из событий произошло раньше, а какое позже), и в этом не участвует никакая ерунда, связанная с географическим положением, часовыми поясами и переводами часов, что кардинально повышает надежность таких вычислений. Собственно, так реализована работа со временем в Java (с версии 1.1), где java.util.Date представляет собой обертку над long-моментом во времени (датам ранее 1970 соответствуют отрицательные long-и), является Comparable, а все человеческо-календарные преобразования вынесены в отдельные классы Calendar и DateFormat.
Про преобразования. Обычному человеку мало что скажет число 1 280 720 431,859 (хотя пытливый читатель может вычислить по нему время, когда я писал эти строки), поэтому нужно уметь переводить момент во времени в wall clock time, и, соответственно, парсить обратно wall clock time в момент во времени. Вот для этих преобразований уже требуется знать часовой пояс, и эти вычисления совсем не тривиальные. Дело в том, что в разных странах/территориях/местах мало того, что разное смещение относительно GMT (время по Гринвичу), так еще и правила этих смещений исторически несколько раз менялись и продолжают меняться (вводят/отменяют летнее время, объединяют пояса — слышали про такую инициативу у нас, наверное?, или вспомним, например, мой родной город Новосибирск, который в начале девяностых перенесли из GMT+7 в GMT+6, а в начале века в нем вообще два пояса было — граница пояса проходила по реке Оби, и на разных берегах были разные пояса). Короче, чтобы не сойти с ума, вся эта историческая информация аккуратно ведется в виде базы данных Olson tz database, названной в честь основателя Arthur David Olson, хотя редактором является Paul Eggert. В этой базе данных каждому крупному населенному пункту соответствует код (Новосибирск, например, по этой базе называется Asia/Novosibirsk) и список всех его приключений по часовым поясам, начиная с 1970 года. Эта база используется во многих (всех?) Linux/Unix/BSD-системах, насчет Windows не скажу, в Java Runtime Environment (у нее, например, были какие-то апдейты, связанные исключительно с обновлением tz database), и так далее, см., в общем, Википедию. Алгоритм преобразований времени в/из этой базы мы рассматривать не будем, будем считать, что он есть у нас готовый. Он, собственно, практически везде и есть готовый.
- внутри программы работать только с моментами во времени;
- преобразование моментов во времени в wall clock time производить только во время ввода/вывода даты. Помните, что в этом преобразовании всегда (всегда!) участвует часовой пояс, поэтому нужно следить, какой именно (это не всегда видно, потому что по умолчанию берется текущий);
- еще один случай, когда требуется wall clock time, это календарные преобразования (вычислить начало следующего дня и т.п.). Здесь тоже нужно следить, чтобы эти преобразования происходили в правильном часовом поясе;
- при сохранении даты/времени в базу данных делать это в часовом поясе UTC.
- дисциплинирует (если вы забудете где-то в преобразованиях указать часовой пояс, то сразу увидите, что что-то не то, по крайней мере, если вы живете не в UTC);
- позволяет не запутаться в датах/временах, когда информация в БД поступает из разных часовых поясов — в базе время всегда в UTC;
- упрощает код, так как при преобразовании времени в/из БД можно не думать о часовом поясе, он всегда один и тот же.
Переводится naive в tz-aware datetime с помощью метода:
tzaware_datetime = some_timezone.localize(some_naive_datetime, is_dst=True)
(обратите внимание на второй параметр, он нужен как раз из-за неоднозначного преобразования), либо
another_tzaware_datetime = tzaware_datetime.astimezone(another_tz)
(перевод tz-aware даты-времени в другой часовой пояс).
Поскольку это все реализуется через один и тот же класс datetime.datetime и вся разница в наличии свойства tzinfo, нужно быть чертовски осторожным, чтобы не перепутать, где у нас даты с часовым поясом, а где нет. Здесь Питон хуже Джавы в том смысле, что в Джаве при распечатывании хочешь-не хочешь, а нужно DateFormat создать и часовой пояс указать, в Питоне же многие операции, в т.ч. и печать, могут и для наивных дат выполняться. Понятно, что в сколь-нибудь сложном приложении желательно позаботиться, чтобы все даты были с часовым поясом, потому что если в каком-то месте приложения окажется, что его нет, то уже фиг вычислишь, а какой он там должен быть. А с поясом и сравниваться даты будут корректно, и распечатываться, и вообще. Кроме того, поскольку при сохранении в/чтении из БД сохраняется только наивная часть (год месяц день час минута секунда микросекунда), единственный толковый способ с этим работать— это иметь в базе наивное представление в UTC.
Бонусы
- не в каждом году 365 дней;
- не в каждом дне 24 часа;
- к счастью, в каждом часе 60 минут;
- не в каждой минуте 60 секунд (может оказаться 59 и 61. 61-ая называется leap second, добавляется либо 30 июня, либо 31 декабря, в это время часы в UTC должны показывать 23:59:60. Добавление 61-ой секунды вызвано замедляющимся вращением Земли. Возможность отнять одну секунду предусмотрена для случаев, если Земля начнет вращаться быстрее, но эта возможность еще ни разу не потребовалась).
Хотя UTC и GMT очень похожи, но все-таки немного отличаются. Если GMT определяется по среднесолнечному времени в Королевской обсерватории в Гринвиче, то UTC отмеряется атомными часами (средневзвешенное время двухсот атомных часов в семидесяти лабораториях по всему миру, синхронизируемых через спутники). Расхождение GMT и UTC не должно превышать 0,9 секунды и компенсируется как раз добавлением leap seconds.
Ожидается, что хранение даты в 32 signed int в UNIX-системах приведет к проблеме 2038 года, когда 31 бит переполнится и последующим моментам во времени будут соответствовать отрицательные числа, что сломает все методы сравнения. Новые 64-х битные системы и программы уже используют для хранения времени 64 бита, но успеют ли такие системы полностью заменить 32-х разрядные к 2038 году?
Когда я начал активно работать с международными клиентами, одним из откровений для меня стал тот факт, что люди постоянно путают разные форматы часовых поясов. Ниже основные советы для тех, кто хочет разобраться в этом бардаке.
Существует очень простой стандарт определения часовых поясов — Greenwich Mean Time (GMT). Часовой пояс GMT пролегает в районе Исландии. Знаком и цифрой рядом обозначают, сколько часов отделяет территорию от пояса GMT. Например, в Великобритании GMT+1, в западной Европе GMT+2, в Москве GMT+3, в Нью-Йорке GMT-4, в Индии GMT+5:30.
Это очень простой и удобный способ определения часовых поясов. Всегда можно быстро посчитать разницу во времени между двумя поясами, договариваться о времени используя этот формат крайне просто. Также иногда используется формат UTC, который полностью совпадает с GMT.
К сожалению, в реальном мире кроме некоторых азиатских стран, формат GMT не популярен. В большинстве регионов, которые интересны для бизнеса, используются собственные часовые пояса. Вот самые основные из них, с которыми я сталкивался больше всего:
- CET (Central European Time) — Западная Европа
- EST (Eastern Standard Time ) — восточное побережье США (Нью-Йорк)
- PST (Pacific Standard Time) — западное побережье США (Калифорния)
Запомнить популярные часовые пояса несложно, недопонимание чаще всего возникает из-за перевода часов. В Европе и США часы переводят два раза в год, деля год на летнее и зимнее время. Проблема в том, что в отличие от GMT, наименования поясов выше фиксированные и не зависят от перевода часов.
Например, в западной Европе зимой GMT+1, а летом GMT+2. Но CET — фиксированный часовой пояс, аналогичный GMT+1. Таким образом технически летом в Европе CET не наблюдается, вместо него наблюдается CEST (Central European Summer Time). Но вместе с тем CEST практически не пользуются, и европейцы, говоря о своем часовом поясе, все равно говорят «CET».
На практике в 9 случаях из 10, когда говорят CET, имеют в виду время в Западной Европе, как зимой, так и летом. Однако, Google, например, всегда показывает технически верное значение CET — GMT+1 и встречаются люди, которые под CET подразумевают GMT+1 в любое время года.
В США на обоих побережьях точно такая же проблема. На восточном побережье летом наблюдается EDT (Eastern Daylight Time), при этом большинство людей все равно называет его EST. На западном побережье летом наблюдается PDT (Pacific Daylight Time), но все говорят PST. Отсутствие универсальных терминов часто приводит к путанице: как минимум приходится уточнять, как максимум, звонок или встреча назначены на разное время.
Представляю вам свой новый мини-проект, который помогает ориентироваться в часовых поясах. Итак, Timezoned.
А теперь я расскажу, что это и зачем.
Зачем и кому это нужно
В наше время глобализация — не пустой звук. Сейчас множество людей работает удаленно, зачастую, на компанию, которая находится в другом часовом поясе. К тому же, некоторые люди время от времени переезжают между часовыми поясами (релокация или просто отпуск).
Все это немного запутывает и усложняет жизнь, потому что вчера у тебя был один часовой пояс, сегодня — другой, а послезавтра — третий, да и разница во времени между условной работой меняется не только из-за этого, но и из-за перевода часов в разное время года.
Бывает и такое, что вам назначают встречу на «3PM UTC», и поди разберись, что это для вас значит (кстати, на этот вопрос может ответить Google!).
В общем, запутаться во всех этих часовых поясах очень просто, и в итоге приходится гуглить и разбираться, что за PST такое и какая разница между этим временем и вашим.
Коснулось это и меня, поэтому я решил сделать простую веб-страницу, которая поможет мне (а, может, и кому-то еще!) во всем этом ориентироваться. В итоге получился мини-проект Timezoned.
Как этим пользоваться
Сразу можно заметить, что страница на английском языке. Текста крайне мало, а английский дает максимальный охват, поэтому выбор был я остановил именно на нем. Вообще, философией проекта был «максимально простой и полезный MVP». So this is it.
Регистрация не требуется, все данные хранятся локально в браузере. Дизайн страницы адаптивный, поэтому одинаково хорошо работает на десктопе и телефоне.
В центре экрана вы видите карточку с текущим временем и вашим часовым поясом, который определяется автоматически.
Вы можете добавлять карточки с другими часовыми поясами (кнопка «Add clock»), но не более одной карточки на одну зону. Эти карточки можно редактировать, в том числе, задавать свой заголовок. По умолчанию заголовок берется из последнего сегмента часового пояса (название города).
У карточек также есть кнопка «Timeline», которая позволяет сравнить линейки часов этого часового пояса с вашим. Также есть такая же кнопка в меню, которая позволяет посмотреть линейки любых часовых поясов без добавления их на экран.
Ну и последняя кнопка «Converter» позволяет конвертировать время из формата типа «12:00PM UTC» в ваше локальное время.
Поиск часового пояса производится не только по его названию, но и по странам и отдельным городам, а также аббревиатурам. Например, «PST» (Pacific Standard Time) выдает 4 часовых пояса в GMT-8.
В линейках часов и на карточках красным цветом отображаются вчерашние время и дата, а зеленым — завтрашние.
Как это реализовано
Этот проект для меня был интересен не только полезностью (а делал я его и для самого себя), но и возможностью применить современные фронтенд технологии, такие как:
React, Next.js и TypeScript
Библиотеки компонентов Flowbite React и Headless UI
React Joyride (тур по странице)
Страница представляет собой SPA-приложение с серверным рендерингом. Настройки ваших часовых поясов хранятся в Local Storage браузера. Бэкенд как таковой отсутствует.
Исходники на GitHub, а деплоится сайт автоматически на бесплатной платформе Next.js Vercel.
Надеюсь, кому-то из вас будет полезной эта маленькая веб-страница! Буду рад предложениям и отзывам.
GMT (Greenwich Mean Time) – среднее время по Гринвичу, связанное с суточным вращением Земли.
В часах эта аббревиатура обозначает функцию одновременного отображения времени в двух часовых поясах. Часто функция GMT включена в более широкую функцию «Мировое время». В этом случае часы способны отображать время сразу в нескольких часовых поясах.
UTC (Universal Time Coordinated) – всемирное координированное время. Современная версия GMT с поправкой на более точное атомное время.
Вот что сообщает Википедия: «Время по UTC не переводится ни зимой, ни летом. Поэтому для тех мест, где есть переход на летнее время, меняется смещение относительно UTC».
Визуально определить, обладают ли часы данными функциями, очень просто. Достаточно наличия любого из приведенных ниже описаний:
- на циферблате стоит метка «GMT»/«UTC»/«Dual time»;
- вместо одного циферблата время отображается сразу на двух независимых циферблатах (как правило, один – с разметкой 1-12, другой – с разметкой 1-24) с отдельным набором стрелок для каждого. NB! Не всегда две разметки (1-12 и 1-24) говорят о наличии функции GMT. Иногда это просто способ отображения времени в двойном формате;
- по внешнему краю циферблата размещены названия городов в соответствии с их расположением в часовых поясах;
- большинство электронных часов обладают такой функцией.
GMT-функция необходима не только людям, которые часто путешествуют или находятся в командировке, но и родственникам, близким друзьям и деловым партнерам, разделенным морями и океанами. Хочется позвонить подруге в Америку? Взгляните на часы: у Вас обед, а она еще спит!
С функцией GMT у Вас перед глазами всегда есть «домашнее» время и время той местности, в которой Вы временно пребываете.
Время устанавливается либо вручную, либо автоматически, в зависимости от возможностей наручных часов. (Например, электронные часы сами переходят на нужное время, сверяясь с атомными часами).
Способы индикации тоже разные, рассмотрим их подробнее:
1) Самый обычный способ определения времени во втором часовом поясе – дополнительная центральная стрелка. Она указывает время на дополнительной 24-часовой шкале, которая может располагаться как во внутренней, так и во внешней части циферблата.
2) Иногда эта шкала и вовсе выносится за пределы циферблата – на безель. Тут главное не спутать GMT с дайверскими часами. Разметка будет не минутная, а 24-часовая, безель поворачивается только в одну сторону.
3) А иногда эта шкала дополняется/заменяется списком городов – тогда нужно выставлять местное время напротив нужного названия.
4) Самый простой способ – второй циферблат. А также третий, четвертый и т.д., вплоть до шести циферблатов, как это не поленились сделать мастера из IceLink.
5) Многие современные часы (в основном, среди японских брендов) вообще делают всю работу за Вас и, как уже было отмечено ранее, переключают местное время автоматически, ориентируясь по радиосигналу или GPS-приемнику.
Помимо непосредственно утилитарного значения, все эти функции имеют также значение эстетическое. Любой дополнительный элемент или усложнение украшает Ваши наручные часы, ну а от того, что одновременно и красиво и функционально, пользы больше!
Часовой пояс — это географический регион, в котором используется одно и то же стандартное время. LN обеспечивает информацию о мировых часовых поясах в сеансе Временные зоны (ttaad0160m000). В сеансе Часовые пояса (tcemm1100m000) в модуле Управление моделированием предприятия можно выбрать часовые пояса, которые вы хотите использовать, и добавить описание каждого часового пояса.
Компании с многозвенной структурой должны совместно использовать таблицу Часовые пояса (emm100).
LN регистрирует даты и моменты времени хозяйственных операций, таких как различные типы документов, операций, проводок, отгрузок и поступлений, во Всемирном скоординированном времени (UTC), которое является универсальным для всех географических местоположений в мире. Следовательно, логистическая компания не зависит от часовых поясов.
В модуле Управление пользователями в Tools нужно связать часовой пояс с каждым пользователем LN с пользовательским шаблоном данных. LN использует часовой пояс пользователя, чтобы воспроизвести даты и моменты времени операций, регистрируемых в Общие данные, в местном времени пользователя.
Чтобы определить часовые пояса для различных ресурсов, таких как подразделения и склады, LN использует часовой пояс, связанный с адресом ресурса.
LN использует часовой пояс рабочего центра, который действует как офис расчетов сборочной линии для расчета разности времени между сборочными линиями. Эта информация необходима для координации основных линий и линий подачи.
Заданные по умолчанию часовые пояса — это часовые пояса, вводимые в сеансе Штаты/Области (tcmcs1143m000) и в сеансе Страны (tcmcs0110s000), в этом порядке. Если вы не вводите заданный по умолчанию часовой пояс для страны, штата или области, вы должны ввести часовой пояс для каждого адреса.
Необходимо выбрать часовой пояс для каждой финансовой компании в модуле Управление моделированием предприятия. LN регистрирует проводки в Финансы с местной датой и временем. Когда операции передаются из логистической компании в Финансы, LN переводит дату и время операции из универсального скоординированного времени (UTC) в местное время и дату финансовой компании. Таким образом, в каждой финансовой компании суммы проводятся в правильных финансовых периодах.
LN также переводит дату и время вступления в силу курсов валюты и ставок налога, которые вы определяете в логистической компании, из универсального скоординированного времени UTC в местное время финансовой компании. Таким образом, применяются правильные курсы и ставки для перевода сумм в национальные валюты в Финансы и исчисления сумм налогов.
Так как Земля вращается вокруг своей оси, Солнце встаёт и заходит в разных частях нашей планеты в разное время. Но для точек, расположенных на одном меридиане, время одинаково. Это время называют местным .
Местное время — время, определяемое для данного места на Земле; зависит от географической долготы места и одинаково для всех точек на одном меридиане.
Пользоваться местным временем в быту невозможно, так как на каждом меридиане было бы своё собственное время. Для удобства Землю условно поделили на \(24\) часовых пояса.
При переходе из одного часового пояса в другой значения минут и секунд (времени) сохраняются, изменяется лишь значение часов. Хотя существуют некоторые страны, в которых местное время отличается от всемирного не только на целое количество часов, но ещё дополнительно на \(30\) или \(45\) мин.
Для того чтобы определить, какова разница во времени между двумя населёнными пунктами или другими географическими точками, необходимо для начала определить, к какому часовому поясу принадлежит каждая из них. После этого осуществить необходимый расчёт будет довольно просто. Например, нам требуется вычислить разницу во времени между Новосибирском и Рио-де-Жанейро . Для этого достаточно знать, что Новосибирск находится в часовом поясе \(UTC+7\), а Рио-де-Жанейро — \(UTC-3\). Отсюда следует, что разница во времени между этими городами составляет \(10\) часов. Например, когда в Новосибирске — \(10\) часов утра, в Рио наступает полночь . Аналогичным образом можно определить разницу во времени для всех других случаев.
Линия перемены дат — условная линия на поверхности земного шара, проходящая от полюса до полюса, по разные стороны которой местное время различается на сутки.
Время на территориях, которые расположены на запад и восток от этой линии, различается ровно на \(24\) часа. Каждый пересекающий линию перемены дат с востока на запад должен перевести календарь на один день вперёд.
Упрощённая иллюстрация связи между линией даты, датой и временем дня. Соседние даты отличаются друг от друга цветом
Путешественникам и бизнесменам, ведущим дела за рубежом, и странствующим по всему миру, функция второго часового пояса, или GMT, нужна как воздух. Так, при взгляде на часы можно видеть текущее время сразу в двух местах. Находясь за границей или в другом регионе, вы всегда знаете, который час у вас дома, а дома можете быть уверены, что звонок не разбудит вашего делового партнера за океаном.
Мужские швейцарские наручные механические часы Frederique Constant Classics Manufacture Worldtimer FC-718WM4H6
Так как мы связываем течение времени с положением солнца на небосклоне, то в разных местах земного шара оно отличается. Чтобы упорядочить отсчет времени, были приняты так называемые часовые пояса, их 24, как и часов в сутках. Отсчет ведется от нулевого, Гринвичского меридиана, согласно стандарту UTC, всемирного координированного времени. Оно основано не на суточном вращении земли, как GMT (среднее время по Гринвичу), а на точных атомных часах. Однако при появлении возможности установки в наручных часах времени второго часового пояса это усложнение назвали именно GMT.
В механических часах оно увеличивает количество используемых деталей и может весьма интересно изменить их привычный внешний вид. Чтобы дополнительное время легко считывалось, стрелку GMT окрашивают в контрастный или просто отличающийся от остальных цвет. Выделяют дополнительные циферблаты. На часы с функцией World Time наносят карту мира. Некоторые производители встраивают маленький глобус, или же вовсе оригинальничают и прячут функцию второго времени, убирая ее или относящиеся к ней шкалы на заднюю крышку часов.
Усложнение, показывающее время второго часового пояса, может называться по-разному: GMT (Greenwich Mean Time – среднее время по Гринвичу / нулевой меридиан), Dual time или World Time и т.д. В зависимости от модели часов вы можете одновременно видеть время сразу в двух часовых поясах, или же, переключив режим, узнать его в любом интересующем часовом поясе.
Един принцип: часы способны показывать и домашнее время, и время местности, где вы находитесь. Наручные часы с GPS, оснащенные новыми технологиями, способны запрашивать ваше местоположение и автоматически корректировать время. Но и механические часы давно умеют это делать.
Самый простой вариант реализации этой функции – использование дополнительной стрелки. Все управляется одной заводной головкой: вы просто выставляете стрелку в соответствии с нужным поясом. Сразу возникает проблема – вы не знаете, день или ночь там, где вас нет. Для ее решения применяется стрелка, делающая за сутки всего один оборот.
На безель или внутренний круг циферблата часов наносят 24-часовую шкалу, либо выносят стрелку на отдельный циферблат с соответствующей разметкой. Это очень удобно – один раз установили и затем нужен лишь взгляд, чтобы определить точное время. Не зря это, пожалуй, самый популярный в мире формат. В некоторых моделях стрелка заменяется на окошко с цифрами.
Еще один способ отображения – создание отдельного циферблата с часовой и минутной стрелкой. В некоторых моделях под отображение выделяют сразу несколько циферблатов. Их настройка производится независимо в случае с аналоговыми часами, или автоматически, если это цифровые дисплеи.
В наручных часаx c Мировым временем (World Time), вам доступно время сразу в нескольких городах мира. Принцип работы прост: на циферблате располагаются два диска, один с названиями городов, 24 или более (им вы управляете, вращая заводную головку), второй с 24-часовой шкалой, ее обычно окрашивают в разные цвета для облегчения восприятия день-ночь (этот диск зависит от часовой стрелки основного времени, но вращается против часовой стрелки). Вам останется поместить к отметке 12 название города, в часовом поясе которого вы находитесь, установить точное местное время и при этом время всех остальных городов отобразится на 24-часовой шкале.
На электронных дисплеях, как правило, выделено свое «место», окошко под каждую функцию или группу функций, настройка производится при переключении режима, а часы «запоминают» все данные, которые вы ввели. В случае с любыми часами, настраивая GMT, важно максимально точно следовать инструкции.