Если вы начинаете с местным временем, такие как 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 целиком.
Что вы пытаетесь достичь? –
Я ничего не знаю, но [я бы начал с этого списка] (http://msdn.microsoft.com/en-us/library/windows/desktop/ms725473 (v = vs.85) .aspx) –
@TimoGeusch Я пытаюсь добавить день к времени, то есть 11 утра в определенный день, и получить то же время (11 часов утра) на следующий день, даже если есть переход на летнее время. – dlanod