如何使用C++获取PST(洛杉矶)时区的时间?
获取洛杉矶(PST/PDT)时间的解决方案
std::localtime() 会直接依赖程序运行环境的系统时区,所以在印度服务器上只能返回印度本地时间。无法直接调整std::localtime()本身,但可以通过以下两种可靠方式获取洛杉矶时区的时间:
方案一:C++11及以上标准库(推荐)
从C++11开始,标准库的<chrono>模块提供了原生时区处理能力,推荐使用IANA时区标识符(如"America/Los_Angeles"),它会自动处理夏令时(PST与PDT的切换),比硬编码UTC偏移更稳定。
C++20及以上版本(用<format>简化输出)
#include <chrono> #include <format> #include <iostream> int main() { // 获取当前系统时间点 auto now = std::chrono::system_clock::now(); // 绑定到洛杉矶时区 std::chrono::zoned_time la_time{std::chrono::locate_zone("America/Los_Angeles"), now}; // 格式化输出小时和分钟 std::cout << "Time in California is " << std::format("{:%H:%M}", la_time) << std::endl; return 0; }
C11/C17版本(兼容旧标准)
如果编译器不支持C++20的<format>,可以将时间点转换为std::tm结构后输出:
#include <chrono> #include <ctime> #include <iostream> int main() { auto now = std::chrono::system_clock::now(); // 获取洛杉矶时区的转换规则 const auto& la_tz = std::chrono::locate_zone("America/Los_Angeles"); auto local_time = la_tz->to_local(now); // 转换为tm结构 std::tm tm{}; std::chrono::system_clock::to_time_t(local_time, &tm); std::cout << "Time in California is " << tm.tm_hour << ":" << tm.tm_min << std::endl; return 0; }
方案二:修改环境变量(兼容C++03及更早版本)
如果必须使用旧标准的std::localtime(),可以通过设置TZ环境变量指定时区,再调用tzset()刷新配置。注意这种方式是全局生效的,可能影响程序中其他依赖时区的逻辑:
#include <ctime> #include <iostream> #include <cstdlib> int main() { // 设置时区为洛杉矶 setenv("TZ", "America/Los_Angeles", 1); // 刷新时区配置 tzset(); 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; }
关键注意事项
- 不要直接硬编码UTC偏移(如PST为UTC-8、PDT为UTC-7),夏令时的切换规则可能随政策调整,使用IANA时区标识符更可靠。
- 部分在线编译器需要手动开启C++11及以上编译选项(如
-std=c++11或-std=c++20)才能支持<chrono>的时区功能。
内容的提问来源于stack exchange,提问作者Samuel van der Veen
相关产品推荐
相关产品推荐

