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.
Несомненно. Получите библиотеку времени и времени, и пусть это будет с вами для вас. – NathanOliver
Посмотрите местное время и tzset. – cup
Если вы работаете с .NET, изучите класс TimeZoneInfo для обработки даты и времени. –