使用c++获取不同时区的时间

问题描述 投票:0回答:1

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() 以便它返回洛杉矶的时间,而不是在线服务器所在的印度的时间?

time timezone localtime ctime
1个回答
0
投票

这在 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 解决方案的库,如本答案中所述。

© www.soinside.com 2019 - 2024. All rights reserved.