获取上午 10 点(或任意时间)的时区?
Get timezone where it's 10AM (or any arbitrary hour)?
有一段时间我一直在尝试解决这个问题,但逻辑一直在逃避我。在任何给定的语言上,计算现在给定时间所在的时区的逻辑是什么样的?
正如 Matt Johnson 指出的那样,我的第一个回答有一个错误。这是我的答案中的一个重大设计缺陷,我没有编辑那个答案,而是决定完全重新开始一个新答案。
为了确保这次我做对了,我遍历了所有 24 "requested" 小时 (00 - 23),并输出所有具有这些请求时间的地点。输出相当长,所以我只是给它一个link:
请注意,在此答案中,有些时间当前是早上 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 时区数据库的免费开源解析器:
有一段时间我一直在尝试解决这个问题,但逻辑一直在逃避我。在任何给定的语言上,计算现在给定时间所在的时区的逻辑是什么样的?
正如 Matt Johnson 指出的那样,我的第一个回答有一个错误。这是我的答案中的一个重大设计缺陷,我没有编辑那个答案,而是决定完全重新开始一个新答案。
为了确保这次我做对了,我遍历了所有 24 "requested" 小时 (00 - 23),并输出所有具有这些请求时间的地点。输出相当长,所以我只是给它一个link:
请注意,在此答案中,有些时间当前是早上 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 时区数据库的免费开源解析器: