2016-01-27 1 views
2

Я был в тупике, пытаясь решить это какое-то время, но логика ускользает от меня. На каком-либо заданном языке логика будет выглядеть так, чтобы вычислять временные интервалы, где это сейчас?Получить часовую зону, где 10AM (или любой произвольный час)?

+0

отрабатывает "сейчас" для UTC. выработайте delta от utc для желаемого времени. поиск всех известных временных зон, которые имеют этот дельта – Vorsprung

+0

@Vorsprung ... в этот конкретный момент времени UTC. –

+0

@MattJohnson Да, стоит помнить, что изменение времени перехода на летнее время означает, что разные места имеют разные смещения в разное время года. – Vorsprung

ответ

2

В моем первом ответе была ошибка, указанная Matt Johnson. В моем ответе был такой главный недостаток дизайна, что вместо редактирования этого ответа я решил полностью начать новый ответ.

Чтобы убедиться, что на этот раз у меня все было правильно, я зациклился на все 24 «запрошенных» часа (00-23) и вывел все места с запрошенными часами. Выход довольно длительный, и поэтому я просто дать ссылку на него:

http://codepad.org/PpnAiewF

Обратите внимание, что в этом ответе, бывают случаи, когда он находится в настоящее время 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:

http://howardhinnant.github.io/date/tz.html

https://github.com/HowardHinnant/date

+0

Да - это выглядит правильно. Благодаря!!! (Почувствуйте ваши библиотеки BTW - сейчас я смотрю ваш видеоролик CppCon.) –

+0

@MattJohnson: И спасибо * вы * за то, что указали мою тупую ошибку. Служит мне для того, чтобы быть в спешке ... –

+0

Не глупо вообще. Большинство не поймают этого. Разумеется, модульные тесты, но я редко тестирую свои образцы StackOverflow .. lol. –