- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
在 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”。并且文档说 std::time_get::get_time()
的默认格式是“%X”,但它确实无法读取。
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 ( ×tamp );
std::tm * now = std::localtime ( ×tamp );
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
关于c++ - 语言环境 "en_US"中 std::time_get::get_time() 的正确时间格式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21852642/
有什么方法可以告诉 std::time_get get_date 现在是几世纪?我们处理 1900 年之前的日期。是否有更好的 C++ 日期时间库可以做到这一点?我们有一个处理几种文化的内部解决方案,
在 locale("en_US") 中,我无法通过 std::time_get::get_time() 读取时间。我尝试了以下格式,但它不起作用。当我将区域设置更改为 locale("en_GB")
我已使用 std::time_get::get_date() 方法从以下来源读取日期: std::cin std::istringstream 基于 string s,其值已从 std::getlin
我是一名优秀的程序员,十分优秀!