2016-12-13 6 views
0

В python я делаю следующее для преобразования между часовыми поясами. Он также заботится о корректировках дневного света, поэтому мне не нужно беспокоиться об этом. Каков эквивалентный способ сделать это на C++, не беспокоясь о летних сбережениях?Эквивалентное преобразование часового пояса C++?

import datetime 
from pytz import timezone 

# Create timezones 
londontz = timezone("Europe/London") 
nyctz = timezone("US/Eastern") 

# Set today as 5pm London time 
today = datetime.date.today() 
time = datetime.time(17, 0, 0) 
londondt = londontz.localize(datetime.datetime.combine(today, time)) 

# Convert the London close time to NYC time (this will auto-adjust for DST) 
nycdt = londondt.astimezone(nyctz) 
+3

Несомненно. Получите библиотеку времени и времени, и пусть это будет с вами для вас. – NathanOliver

+0

Посмотрите местное время и tzset. – cup

+0

Если вы работаете с .NET, изучите класс TimeZoneInfo для обработки даты и времени. –

ответ

1

C++ не включает в себя такую ​​функциональность в стандартной библиотеке (пока все равно).

Тем не менее, вы определенно хотите оставить это в библиотеке, если это вообще возможно. Эта библиотека, в свою очередь, будет делегировать большую часть реальной работы в базу данных, поскольку принципиально невозможно правильно моделировать все как фактический алгоритм.

Учитывая то, о чем вы просите, Howard Hinnant's date library будет очевидным первым выбором.

+0

получил, спасибо. Я бы мог использовать только стандартные библиотеки – holtc

+0

@holtc. Пять баксов говорят, что Говард Хиннант придерживается как можно ближе к стандартным библиотекам. Даже если вы не можете напрямую использовать свою библиотеку по какой-то причине, вы, вероятно, можете получить от нее идеи. – user4581301

+1

@holtc: В этом случае вы почти застряли в дублировании своей библиотеки. Я бы усердно работал, чтобы получить разрешение на использование его кода. В настоящее время эта функциональность не существует в стандартной библиотеке C++. Если/когда он добавлен в стандартную библиотеку, шансы * очень * хорошие, что интерфейс будет основан на его библиотеке (если вы этого не знаете, Говард использовал для председательства в рабочей группе комитета комитета C++ и все еще в комитете). –

1

FWIW, вот синтаксис, который Howard Hinnant's library (MIT лицензии с открытым исходным кодом) будет использовать для этой задачи:

#include "tz.h" 
#include <iostream> 

int 
main() 
{ 
    using namespace date; 
    using namespace std::chrono; 

    // Set today as 5pm London time 
    auto londontz = locate_zone("Europe/London"); 
    auto today = floor<days>(make_zoned(londontz, 
             system_clock::now()).get_local_time()); 
    auto londondt = make_zoned(londontz, today + 17h); 

    // Convert the London close time to NYC time (this will auto-adjust for DST) 
    auto nycdt = make_zoned("US/Eastern", londondt); 

    // print it out 
    std::cout << "London : " << londondt << '\n'; 
    std::cout << "New York: " << nycdt << '\n'; 
} 

Первое, что нужно сделать, это найти «today» в соответствии с «Europe/London» , Это делается путем получения текущего времени, перевода этого времени в текущее время в Лондоне, а затем усечения текущего локального времени на текущую локальную дату (с floor<days>()).

Установлен today, добавив 17h к нему очень легко.

И тогда строительство nycdt от londondt также очень легко.

Это просто выход для меня:

London : 2016-12-13 17:00:00 GMT 
New York: 2016-12-13 12:00:00 EST 

Хочу отметить, что строгий перевод исходного кода определяет today как локальная дата компьютера. Это также возможно:

auto today = floor<days>(make_zoned(current_zone(), 
            system_clock::now()).get_local_time()); 

То есть, использовать current_zone() вместо конкретного часового пояса. Но лучше всего предположить, что использование current_zone() для определения даты на самом деле является логической ошибкой в ​​примере. Эта библиотека помогает найти такие логические ошибки и легко их исправить.

Решения, включающие только std :: lib, сбрасываются до API многопоточного программирования, разработанного несколько десятилетий назад. Вы должны изменить часовой пояс компьютера на Лондон, сделать переходы между этим локальным и UTC, а затем изменить часовой пояс компьютера на NY и сделать конверсии между , которые местных и UTC. Мало того, что подвержен ошибкам, он не является потокобезопасным, если у вас несколько потоков в зависимости от текущего локального часового пояса. Кроме того, нет стандартного способа даже указать «Европа/Лондон» и «США/Восток» со старым C api. Вы можете сделать это с расширениями POSIX.

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