Я был в тупике, пытаясь решить это какое-то время, но логика ускользает от меня. На каком-либо заданном языке логика будет выглядеть так, чтобы вычислять временные интервалы, где это сейчас?Получить часовую зону, где 10AM (или любой произвольный час)?
ответ
В моем первом ответе была ошибка, указанная Matt Johnson. В моем ответе был такой главный недостаток дизайна, что вместо редактирования этого ответа я решил полностью начать новый ответ.
Чтобы убедиться, что на этот раз у меня все было правильно, я зациклился на все 24 «запрошенных» часа (00-23) и вывел все места с запрошенными часами. Выход довольно длительный, и поэтому я просто дать ссылку на него:
Обратите внимание, что в этом ответе, бывают случаи, когда он находится в настоящее время 6 утра (к примеру), но с разными датами :
Time is 06:00
Etc/GMT+11 2016-01-27 06:00:00 GMT+11
Etc/GMT-13 2016-01-28 06:00:00 GMT-13
Pacific/Auckland 2016-01-28 06:00:00 NZDT
Pacific/Chatham 2016-01-28 06:45:00 CHADT
Pacific/Enderbury 2016-01-28 06:00:00 PHOT
Pacific/Fakaofo 2016-01-28 06:00:00 TKT
Pacific/Niue 2016-01-27 06:00:00 NUT
Pacific/Pago_Pago 2016-01-27 06:00:00 SST
Pacific/Tongatapu 2016-01-28 06:00:00 TOT
алгоритм делает это просто перебирает все часовые пояса, получить текущее местное время, и сравнить час этого времени на «запрошенный» час. Вот код:
#include "tz.h"
#include <chrono>
#include <iomanip>
#include <iostream>
int
main()
{
for (int hh = 0; hh < 24; ++hh)
{
using namespace std::chrono;
using namespace date;
auto& db = get_tzdb();
auto now = floor<hours>(system_clock::now());
auto target = hours{hh};
std::cout << "Time is " << make_time(target + 0min) << '\n';
for (auto& z : db.zones)
{
auto zt = make_zoned(&z, now);
auto local_time = zt.get_local_time();
auto dp = floor<days>(local_time);
auto time = make_time(local_time - dp);
if (time.hours() == target)
{
std::cout << std::setw(30) << std::left << z.name() << " "
<< zt << '\n';
}
}
std::cout << '\n';
}
}
Обратите внимание, что сравнение времени я использую только сравнивая час, и игнорируя все и мельче (минуты, секунды) и бегового (дни).
Это использует бесплатно, с открытым исходным кодом парсер базы данных часовых поясов IANA:
Да - это выглядит правильно. Благодаря!!! (Почувствуйте ваши библиотеки BTW - сейчас я смотрю ваш видеоролик CppCon.) –
@MattJohnson: И спасибо * вы * за то, что указали мою тупую ошибку. Служит мне для того, чтобы быть в спешке ... –
Не глупо вообще. Большинство не поймают этого. Разумеется, модульные тесты, но я редко тестирую свои образцы StackOverflow .. lol. –
отрабатывает "сейчас" для UTC. выработайте delta от utc для желаемого времени. поиск всех известных временных зон, которые имеют этот дельта – Vorsprung
@Vorsprung ... в этот конкретный момент времени UTC. –
@MattJohnson Да, стоит помнить, что изменение времени перехода на летнее время означает, что разные места имеют разные смещения в разное время года. – Vorsprung