Возможно, это может быть полезным free, open source, C++11/14 timezone library. Вы можете использовать его для преобразования UTC в свой часовой пояс или из любого произвольного IANA timezone или между любыми двумя произвольными IANA timezones. Библиотека была перенесена на gcc, clang и VS. Но для этого требуется <chrono>
.
Ниже приводится краткое описание того, как вы можете получить текущее время UTC, а затем перевести его в Берлин по местному времени, а затем перевести время в Берлин по местному времени, а затем преобразовать местное время Берлина в UTC. Это все довольно просто, используя современные C++ синтаксис и тип безопасности:
#include "tz.h"
#include <iostream>
int
main()
{
using namespace date;
using namespace std::chrono;
auto utc = system_clock::now();
auto berlin = make_zoned("Europe/Berlin", utc);
auto local = make_zoned(current_zone(), berlin);
auto utc2 = berlin.get_sys_time();
std::cout << format("%F %T %Z", utc) << '\n';
std::cout << format("%F %T %Z", berlin) << '\n';
std::cout << format("%F %T %Z", local) << '\n';
std::cout << format("%F %T %Z", utc2) << '\n';
}
Это просто выход для меня:
2016-07-05 01:41:29.207335 UTC
2016-07-05 03:41:29.207335 CEST
2016-07-04 21:41:29.207335 EDT
2016-07-05 01:41:29.207335 UTC
Да, вы можете даже переход часовых поясов с какими бы то ни точность ваших std::chrono::sytem_clock
поддерживает, и разобрать и форматировать эту точность.
Если эта библиотека дает вам какие-либо проблемы, вы можете получить помощь здесь при переполнении стека, или chat here, или open an issue here, или найти мой адрес электронной почты и связаться со мной напрямую.
Эта библиотека полностью задокументирована и рассчитана на то, чтобы оставаться в курсе последних IANA timezone database (даже если вам нужен latest mess the Egyptian politicians have made - изменение правила часового пояса с уведомлением за 3 дня). И если ваши временные метки устарели (скажем, с 1940-х годов), не волнуйтесь. Эта библиотека полностью поддерживает полную историю часового пояса, которую предоставляет IANA. То есть, если есть данные в IANA timezone database, эта библиотека извлекает и использует ее без ошибок.
Вы также можете легко и эффективно формировать литературу даты в местном масштабе, если это полезно для вашего приложения. Например, вот как вы бы указать 15:30 в первый понедельник июля 2016 года в Берлине (<chrono>
литералы требуют C++ 14):
auto meet = make_zoned("Europe/Berlin", local_days{2016_y/jul/mon[1]} + 15h + 30min);
std::cout << meet << '\n';
Выход:
2016-07-04 15:30:00 CEST
Если вы хотите чтобы выяснить, какое время офиса в Нью-Йорке есть дистанционный в этой встрече:
std::cout << make_zoned("America/New_York", meet) << '\n';
выход:
2016-07-04 09:30:00 EDT
Надеюсь, это поможет.
[Возможный дубликат] (http://stackoverflow.com/questions/761791/converting-between-local-times-and-gmt-utc-in-c-c). Google - ваш друг. –
Тема, которую вы предлагаете, отличается. И я попробовал погулять. – user14416
Не могли бы вы прояснить (в самом вопросе), почему ваша тема отличается? –