获取上午 10 点(或任意时间)的时区?

Get timezone where it's 10AM (or any arbitrary hour)?

有一段时间我一直在尝试解决这个问题,但逻辑一直在逃避我。在任何给定的语言上,计算现在给定时间所在的时区的逻辑是什么样的?

正如 Matt Johnson 指出的那样,我的第一个回答有一个错误。这是我的答案中的一个重大设计缺陷,我没有编辑那个答案,而是决定完全重新开始一个新答案。

为了确保这次我做对了,我遍历了所有 24 "requested" 小时 (00 - 23),并输出所有具有这些请求时间的地点。输出相当长,所以我只是给它一个link:

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

执行此操作的算法是简单地遍历所有时区,获取当前本地时间,并将该时间的小时与 "requested" 小时进行比较。这是代码:

#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