在 Windows C++ 中将字符串解析为日期的区域感知
Posted
技术标签:
【中文标题】在 Windows C++ 中将字符串解析为日期的区域感知【英文标题】:Locale-aware parsing of strings to dates in Windows C++ 【发布时间】:2016-01-11 23:14:20 【问题描述】:我正在使用 Windows C++ 代码:
我正在尝试解析由 3rd 方软件返回的表示日期的字符串,但我想让该解析取决于所使用的语言环境。现在,我返回的日期格式如下:“mm-dd-YYYY tt:ss A”,但如果我将语言环境切换到加拿大,那么我返回的字符串是“dd -mm-YYYY tt:ss A"
如您所见,月份和日期被交换了。有没有办法检索当前语言环境使用的日期格式?甚至更好,有没有办法根据用户的语言环境将字符串解析为不同的日期?
#include "stdafx.h"
#include <iostream>
#include <sstream>
#include <locale>
#include <iomanip>
#include <ctime>
#include <sstream>
int _tmain(int argc, _TCHAR* argv[])
// Region 1: Go from current time to locale-specific date / time.
std::time_t ct = std::time(nullptr);
std::tm tm = *std::localtime(&ct);
// Save the time in a stringstream to be later used as input
std::stringstream time_str;
time_str.imbue(std::locale(""));
time_str << std::put_time(&tm, "%x %X");
// print the saved stringstream
std::cout << std::locale("").name().c_str() << ": " << time_str.str() << "\n";
// Region 2: Parse from a local-specific date and time string to time (Parsing is failing)
std::tm t = ;
std::istringstream iss(time_str.str().c_str());
iss.imbue(std::locale(""));
iss >> std::get_time(&t, "%x, %X"); // I would expect this to parse my string above correctly.
if (iss.fail())
std::cout << "Parse failed\n";
else
std::cout << std::asctime(&t) << '\n';
return 0;
【问题讨论】:
根据en.wikipedia.org/wiki/Date_format_by_country 格式 mm-dd-YYYY 不被任何国家使用。我最好请第 3 方提供有意义的输出。 我现在更新了我的程序以使用与用户当前区域设置相同的格式。我不明白为什么解析失败,如果我传递的字符串与我用 std::put_time(&tm, "%x %X"); 打印的字符串相同 【参考方案1】:<iomanip>
中有一个std::get_time
。根据您的需要,您可以使用其%x
转换来读取区域设置的标准日期格式。
如果这不符合您的格式,您可能需要查看time_get
方面。这有一个date_order
成员函数来告诉您当前语言环境的首选顺序(mdy、dmy、ymd 或 ydm)。然后,您可以使用它来选择输入格式(如果您使用 get_time
或 time_get
进行读取,请选择格式字符串)。
【讨论】:
在 get_time 的示例程序中,我一直在默认调用中遇到崩溃,直到我将其更改为:ss.imbue(std::locale("en-US"));。然后程序就因解析错误而失败。我在哪里可以找到我可以通过的有效语言环境> @Flethuseo:由实现来记录它支持的语言环境名称(除了“C”语言环境,它们都需要支持,但这只是默认情况下发生的情况)。 当我尝试使用当前语言环境解析字符串时,出现“解析失败”。我的理解是,我将使用 %x 和 %X 来获取日期和时间,并使用这两个东西的区域设置格式。我将编辑我的帖子以说明我在这方面的进展。【参考方案2】:put_time()
和 get_time()
使用的格式不同
对于 put_time(),您使用 "%x %X"
,而对于 get_time(),您使用 "%x, %X"
希望对你有帮助
【讨论】:
以上是关于在 Windows C++ 中将字符串解析为日期的区域感知的主要内容,如果未能解决你的问题,请参考以下文章