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

时间:2016-01-27 15:17:05

标签: date timezone timezone-offset

我一直难以解决这个问题,但逻辑一直在逃避我。在任何给定的语言中,计算现在给定时间的时区的逻辑是什么样的?

1 个答案:

答案 0 :(得分: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';
    }
}

请注意,我使用的时间比较只是比较小时,而忽略了更精细(分钟,秒)和courser(天)的所有内容。

这使用IANA时区数据库的这个免费的开源解析器:

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

https://github.com/HowardHinnant/date