我try 了strftime,它有%z和%Z,但这些都是像+0800和pst这样的输出.我想要更长的名字,比如America/洛杉矶.是否有函数调用来执行此操作?

推荐答案

在C++20之前,还没有一种标准的方法来实现这一点,即使到那时,也只有最新的MSVC实现了它(GCC即将实现它).

在C++20中,有一个类型std::chrono::time_zone,它有一个名为name()的成员函数,它将返回string,如"America/Los Angeles".

它的用法可能如下:

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std;
    using namespace std::chrono;

    zoned_time local_now{"America/Los_Angeles", system_clock::now()};
    cout << local_now << " " << local_now.get_time_zone()->name() << '\n';
}

它只为我输出:

2022-12-31 07:34:41.482431 PST America/Los_Angeles

或者,如果您的计算机的本地时区当前设置为"America/Los Angeles",则zoned_time的 struct 可能如下所示:

    zoned_time local_now{current_zone(), system_clock::now()};

如果您只需要时区名称,而不是当前时间,则可以将其进一步简化为:

cout << current_zone()->name() << '\n';

在C++20之前,我所知道的获得这种功能的唯一方法是使用我的免费、开放源码的C++20 chrono preview library,它可以与C++11/14/17一起工作.

C++相关问答推荐

Apple Libm的罪恶功能

通过管道将一个子系统的标准输出发送到另一个子系统的标准输出

ARM64 ASIMD固有的加载uint8_t* 到uint16x8(x3)?

C在声明带有值的数组时,声明大小有用吗?

为什么我不能只在内存地址中添加一个int来寻址任何数组?

解决S随机内存分配问题,实现跨进程高效数据共享

如何有效地编写代码来判断两个元素数量相同的数组即使在不同的位置也具有相同的元素?

在编写代码时,Clion比vscode有更多的问题指示器

在C中创建任意类型的只读指针参数

如何在双向表中实现线程安全,每个条目仅使用4位,同时避免任何全局锁?

发送和接收的消息中的Unix域套接字不匹配

在我的函数中实现va_arg的问题

将char*铸造为空**

令人困惑的返回和 scanf 问题相关

为什么实现文件中的自由函数默认没有内部链接?

C 预处理器中的标记分隔符列表

为什么使用 C 引用这个 char 数组会导致 Stack smasing?

char* 上的 free() 被 valgrind 识别为无效

C 初学者 - struct 中的字符串不需要 Malloc

从 COBOL 调用外部 C 库