2013-07-02 4 views
1

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

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

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

+0

Что вы пытаетесь достичь? –

+0

Я ничего не знаю, но [я бы начал с этого списка] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473 (v = vs.85) .aspx) –

+0

@TimoGeusch Я пытаюсь добавить день к времени, то есть 11 утра в определенный день, и получить то же время (11 часов утра) на следующий день, даже если есть переход на летнее время. – dlanod

ответ

1

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

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

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

+0

Кроме того, вы можете использовать TAI. UTC имеет прыжки секунд :( – youdontneedtothankme

1

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

Вы работаете в категории времени катания. UTC для измерения мгновенное время. Время календаря может иметь разрывы для изменений ДСТ, но мгновенного времени нет.

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

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

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

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

Для C++ вы должны изучить использование Boost's Date and Time. Они используют стандартную базу данных (ака «ZoneInfo») и обсуждают ее использование here. Вероятно, вы захотите использовать 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 и других. подталкивания, вероятно, имеет наиболее комплексную реализацию даты/времени для C++, но не где рядом столь же просто, как библиотеки, как Noda Time for .Net

UPDATE

Я пришел, чтобы реализовать поддержку, которые повышают в для IANA/Олсонские временные зоны испорчены. Их time zone data file удаляет богатую историю базы данных часовых поясов IANA/Olson, что существенно воссоздает все проблемы часовых поясов POSIX, которые я описал в the timezone tag wiki. Поэтому я больше не рекомендую использовать Boost для преобразования часового пояса.

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

Смежные вопросы