语言环境"en_US"中 std::time_get::get_time() 的正确时间格式是什么?

What is the correct time format for std::time_get::get_time() in locale "en_US"?

本文关键字:get time 时间 格式 是什么 US std 语言 en 环境      更新时间:2023-10-16

locale("en_US")中,我无法按std::time_get::get_time()读取时间。我尝试了以下格式,但它不起作用。当我将区域设置更改为locale("en_GB")时,它运行良好。那么区域设置"en_US"的正确时间格式是什么?

来源是:

void try_get_time_from_str(const std::string& s) {
    std::istringstream str(s);
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::tm t;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::time_get<char> >(str.getloc()).get_time(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            str, err, &t
        );
    str.setstate(err);
    if(str) {
        std::cout << "Hours: "   << t.tm_hour << ' '
                  << "Minutes: " << t.tm_min  << ' '
                  << "Seconds: " << t.tm_sec  << 'n';
    } else {
        std::cout << "Parse failed. Unparsed string: ";
        std::copy(ret, std::istreambuf_iterator<char>(),
                  std::ostreambuf_iterator<char>(std::cout));
        std::cout << 'n';
    }
}
int main() {
    std::locale::global(std::locale("en_US"));
    try_get_time_from_str("01:01:01");
    try_get_time_from_str("1:01:01");
    try_get_time_from_str("1:1:1");
    try_get_time_from_str("01:01");
    try_get_time_from_str("1:01");
    try_get_time_from_str("1:1");
    try_get_time_from_str("01:01:01 PM");
    try_get_time_from_str("1:01:01 PM");
    try_get_time_from_str("1:1:1 PM");
    try_get_time_from_str("01:01 PM");
    try_get_time_from_str("1:01 PM");
    try_get_time_from_str("1:1 PM");
    return 0;
}

结果是:

Parse failed. Unparsed string: 01:01:01
Parse failed. Unparsed string: 1:01:01
Parse failed. Unparsed string: 1:1:1
Parse failed. Unparsed string: 01:01
Parse failed. Unparsed string: 1:01
Parse failed. Unparsed string: 1:1
Parse failed. Unparsed string: 01:01:01 PM
Parse failed. Unparsed string: 1:01:01 PM
Parse failed. Unparsed string: 1:1:1 PM
Parse failed. Unparsed string: 01:01 PM
Parse failed. Unparsed string: 1:01 PM
Parse failed. Unparsed string: 1:1 PM

我尝试以locale("en_US")格式"%X"输出时间,结果是"10:27:06 AM"。文档说默认格式是 "%X" 对于std::time_get::get_time(),但它确实无法读取。

PS:我在LINUX上使用g++(GCC)4.4.7 20120313(Red Hat 4.4.7-3)。

它看起来像一个编译器错误。拥有 g++ 4.72 并运行:

#include <ctime>
#include <iostream>
#include <locale>
#include <sstream>
void try_get_time_from_str(const std::string& s) {
    std::istringstream str(s);
    std::ios_base::iostate err = std::ios_base::goodbit;
    std::tm t;
    std::istreambuf_iterator<char> ret =
        std::use_facet<std::time_get<char> >(str.getloc()).get_time(
            std::istreambuf_iterator<char>(str),
            std::istreambuf_iterator<char>(),
            str, err, &t
        );
    str.setstate(err);
    if(str) {
        std::cout << "Hours: "   << t.tm_hour << ' '
                  << "Minutes: " << t.tm_min  << ' '
                  << "Seconds: " << t.tm_sec  << 'n';
    } else {
        std::cout << "Parse failed. Unparsed string: ";
        std::copy(ret, std::istreambuf_iterator<char>(),
                  std::ostreambuf_iterator<char>(std::cout));
        std::cout << 'n';
    }
}
int main() {
    std::time_t timestamp;
    std::time ( &timestamp );
    std::tm * now = std::localtime ( &timestamp );
    std::cout <<  "GB: ";
    {
        std::locale::global(std::locale("en_GB.utf8"));
        std::ostringstream out;
        std::use_facet< std::time_put<char> >(out.getloc()).put(
            out,
            out,
            ' ',
            now,
            'X');
        try_get_time_from_str(out.str());
    }
    std::cout <<  "US: ";
    {
        std::locale::global(std::locale("en_US.utf8"));
        std::ostringstream out;
        std::use_facet< std::time_put<char> >(out.getloc()).put(
            out,
            out,
            ' ',
            now,
            'X');
        try_get_time_from_str(out.str());
    }
    return 0;
}

给:

GB: Hours: 14 Minutes: 59 Seconds: 53
US: Parse failed. Unparsed string: 02:59:53 PM