我一直难以解决这个问题,但逻辑一直在逃避我。在任何给定的语言中,计算现在给定时间的时区的逻辑是什么样的?
答案 0 :(得分:2)
我的第一个答案有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';
}
}
请注意,我使用的时间比较只是比较小时,而忽略了更精细(分钟,秒)和courser(天)的所有内容。
这使用IANA时区数据库的这个免费的开源解析器: