C++ 可以让我使用 std::localtime() 获取当地时间,但是当我使用服务器位于不同大陆的在线编译器时,这会出现问题。如何获取 PST 时间而不是“本地”时间?
这是我正在使用的代码:
#include <ctime>
#include <iostream>
int main()
{
time_t secSinceEpoch = time(0);
tm* timeStruct = std::localtime(&secSinceEpoch);
int hour = timeStruct->tm_hour;
int min = timeStruct->tm_min;
std::cout << "Time in California is " << hour << ":" << min << std::endl;
return 0;
}
如何操作 localtime() 以便它返回洛杉矶的时间,而不是在线服务器所在的印度的时间?
这在 C++20 之前的 C++ 中无法移植完成。1
在 C++20 中是:
#include <chrono>
#include <format>
#include <iostream>
int main()
{
std::chrono::zoned_time zt{"America/Los_Angeles", std::chrono::system_clock::now()};
std::cout << "Time in California is " << std::format("{:%H:%M}", zt) << '\n';
}
输出示例:
Time in California is 13:22
zoned_time
是 time_zone const*
和基于 system_clock
的 time_point
的配对。格式化时,将使用 time_zone
将 sys_time
转换为 local_time
并对其进行格式化。 time_zone
可以通过 IANA 时区名称进行分配。
如果您想要计算机的当前本地时间,只需将
"America/Los_Angeles"
替换为 std::chrono::current_zone()
。
1 从技术上讲,这是夸张的。它可以完成。但这很难做到,这并不是问题的实际答案。为此,必须为 IANA 时区数据库构建一个解析器,并使用它将
system_clock::time_point
转换为 IANA 数据库中的任何本地时间。然后弄清楚如何格式化本地time_point
。这是一个执行此操作的示例库:https://github.com/HowardHinnant/date。这是成为 C++20 解决方案的库,如本答案中所述。