Логическое управление временем с учетом перехода на летнее время

Есть ли способ логически (не совсем) добавить период времени к местному времени и получить действительное местное время в будущем?

Например, добавление одного дня к 11 часам утра в день 1 становится 11 часами утра в день 2, даже если между тем есть изменение летнего времени (+/- один час)? Если время не существует, оно может вернуть ошибку или следующее действительное время.

Стандартные механизмы C ++, функции Windows API, классы STL и / или Boost — все в порядке.

1

Решение

Это зависит от вашей семантики.

Если вы заинтересованы в том, что местное время может быть ровно через полдня, тогда да: вы переводите в UTC, добавляете полдня и переводите обратно в местное время.

С другой стороны, если вы работаете в основном по местному времени (мы делаем это, например, при прогнозировании нагрузки на электроэнергию), вы можете пойти другим путем, т.е. «Через сколько часов будет наше событие на полдня в будущем?»: вы относитесь к местному времени, как к UTC, добавляете полдня, затем относитесь к нему как к местному времени и переводите обратно в UTC для проверки работоспособности — у вас есть знать, что некоторые локальные времена не существуют, а некоторые локальные времена неоднозначны.

1

Другие решения

Если вы начинаете с местного времени, такого как 2013-07-02 18:30:00 и вы просто хотите перейти к следующему календарный день в то же время, несмотря на предложения других — вы действительно не хочу задействовать UTC.

Вы работаете с точки зрения календарное время. UTC для измерения мгновенное время. Календарное время может иметь разрывы для изменений летнего времени, но мгновенное время — нет.

Когда вы добавляете день к мгновенному времени вы всегда добавляете ровно 24 часа. Но когда вы добавляете день к календарному времени, вы продвигаете календарь на одну позицию дня. Это тонко, но отчетливо отличается. Календарный день может иметь 23, 24 или 25 фактических часов.

Когда дело доходит до разрывов, вам придется иметь дело с переходом «весна-вперед», когда часы пропускают час. Если вы добавите день и окажетесь в этом промежутке, вы будете иметь в виду время, которого нет в календаре. Вы должны решить, что вы хотите, чтобы произошло в этом случае. Должен ли он перейти к следующему возможному времени? Или это ошибка? Или, возможно, вы добавите еще один час в этом случае. Тебе решать.

Другой разрыв — это переход «откат», когда часы откатываются на час назад. Может быть два фактические моменты, на которые может ссылаться эта единственная календарная позиция — но так как вы были только заинтересованный в календарном времени это не должно повлиять на вас напрямую. если ты делать Если вы хотите узнать, к какому моменту он привязан, вам снова нужно будет принять решение — возможно, с использованием некоторой бизнес-логики или опроса пользователя через пользовательский интерфейс.

Чтобы узнать, где находятся разрывы, вам потребуется база данных часовых поясов. IANA база данных является стандартом де-факто.

Для C ++ вы должны изучить использование Дата и время повышения служба поддержки. Они используют стандартную базу данных (она же «ZoneInfo») и обсуждают ее использование Вот. Вы, вероятно, хотите использовать local_time,

Если возможно, держитесь подальше от настроек часового пояса POSIX, таких как PST8DSTХотя Boost их поддерживает, они загадочны и, как правило, их трудно использовать на международном уровне. Часовые пояса IANA имеют ключи поиска, состоящие из области и местоположения, такие как America/New_York или же Europe/London,

Также посмотрите в Boost на local_time::ambiguous_result а также local_time::time_label_invalid, Те скажут вам, если вы находитесь в разрыве.

Я также скажу, что (ИМХО) работа с местными датами, часовым поясом, летним временем и т. Д. много более сложный в C ++, чем в любом другом языке. Есть отличные решения для PHP, Python, .Net, Ruby и других. Boost, вероятно, имеет наиболее полную реализацию даты / времени для C ++, но это не так просто, как библиотека, как Нода Время для .Net

ОБНОВИТЬ

Я понял, что поддержка Boost для часовых поясов IANA / Olson имеет недостатки. Их файл данных часового пояса удаляет богатую историю базы данных часовых поясов IANA / Olson, которая по существу воссоздает все проблемы часовых поясов POSIX, которые я описал в тег часового пояса вики. Поэтому я больше не рекомендую использовать Boost для преобразования часовых поясов.

Вместо этого рассмотрим ICU, или функции часового пояса Библиотека GNU C (как описано здесь) — оба из них полностью используют данные часового пояса IANA / Olson.

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector