如何在 C++ 中生成具有系统区域格式的当前日期时间?

How to generate current datetime with system's regional format in C++?

我正在寻找一种方法来以与系统区域一致的方式格式化当前系统日期时间。

例如,美国的系统会是这样的: 2022 年 1 月 31 日 1:59:00 下午

欧洲的系统应该是这样的: 31-01-2022 13:59:00

我对使用 Boost 进行了一些试验,但似乎无法准确了解我在此处指定的内容;是否有任何库或实现可以让我实现这一目标?谢谢。

您需要查询timezone,然后在输出时间戳时使用格式说明符。请参阅 https://man7.org/linux/man-pages/man3/strftime.3.html, and also https://man7.org/linux/man-pages/man3/tzset.3.html 中对 %c 的评论。至于链接,它是 libc 的一部分,因此将 -lc 添加到编译器调用中就足够了

首先,我们通过将 empty-name 语言环境 (locale("")) 注入输出流来为用户的默认设置配置语言环境。然后我们使用 locale-dependent 日期和时间格式 std::put_time. For example: Live On Coliru

#include <ctime>
#include <iomanip>
#include <iostream>

int main() {
    std::time_t raw_now = time(nullptr);

    std::tm now = *localtime(&raw_now);

    std::cout.imbue(std::locale(""));
    std::cout << std::put_time(&now, "My locale: %x %X\n");

    // For comparison, how we'd expect it to show up for a 
    // user configured for Great Britain:
    std::cout.imbue(std::locale("en_GB.UTF-8"));
    std::cout << std::put_time(&now, "Great Britain: %x %X\n");
}

在我的机器上(针对美国配置),这会产生以下输出:

My locale: 02/16/2022 06:05:48 PM
Great Britain: 16/02/22 18:05:48

还有一种 %c 格式来生成日期和时间,但这(至少通常)包括星期几(例如,Wed 16 Feb 2022 18:11:53 PST),这与什么不符你好像想要。

作为 side-note:所有编译器都应该至少接受 "C""" 作为语言环境名称。任何其他名称(如我在上面使用的 en_GB.UTF-8)取决于编译器。如果您使用不同的编译器,您可能需要不同的字符串(我在 Linux 上使用 g++ 进行测试)。