datetime - 如何解析 Metro (C++/CX) 应用程序中的日期?

标签 datetime microsoft-metro windows-runtime c++-cx

我有一个 C++/CX 应用程序正在处理文件中的一些数据。它有一个字符串代表用于保存日期的区域性,并且它有一些日期。我需要将它们从字符串转换为 Platform::DateTime。我听说Windows::Globalization::DateTimeFormatting是要使用的类,但我不知道如何使用它。有人有例子吗?

最佳答案

WinRT 的 C++/CX 投影在很多方面与托管 (C#/VB) 投影不同,其中最重要的一个是基本类型的投影(例如 Point大小字符串日期时间)。

托管投影将这些类型投影为 .NET 类型(具有 BCL 的所有底层支持),而 C++ 投影通常最低限度地投影这些类型以实现互操作,期望用户依赖 C++ 库支持来实现更高级的功能。

因此,在 .NET 中,有符号的 32 位整数在 C++ 中变为 System.Int32 (及其相关的 .Parse 功能),您将得到常规的 C++ int 并预计使用 CRT 功能 (_wtoi) 来完成类似的任务。这种差异通常会导致不同投影之间的“功能差距”,其中更痛苦的问题之一是处理 DateTime 结构(该结构在 BCL 中拥有非常丰富的支持)。

我设法得到的解决方案是从 COleDateTime 类(通过包含 ATLComTime.h 找到)开始,然后转到 COleDateTime->SYSTEMTIME->FILETIME->_ULARGE_INTEGER->Windows::Foundation::DateTime。这是一项严肃的练习,但 COleDateTime 类具有您所需的特定于语言的解析功能。

LCID lcid = LocaleNameToLCID(L"es-es", LOCALE_ALLOW_NEUTRAL_NAMES); //parse language tag to get locale ID

COleDateTime dt;
dt.ParseDateTime(L"12 enero, 2012 10:00:01", 0, lcid); //parse date string based on language

//get system time struct
SYSTEMTIME st;
dt.GetAsSystemTime(st);

//COleDateTime is in local timezone, DateTime is in UTC, so we need to convert
SYSTEMTIME st_utc;
TzSpecificLocalTimeToSystemTime(nullptr, &st, &st_utc);

//get filetime struct to get a time format compatible with DateTime
FILETIME ft;
SystemTimeToFileTime(&st_utc, &ft);

//use _ULARGE_INTEGER to get a uint64 to set the DateTime struct to
_ULARGE_INTEGER ulint = {ft.dwLowDateTime, ft.dwHighDateTime};

Windows::Foundation::DateTime wfdt;
wfdt.UniversalTime = ulint.QuadPart;

我询问过有关 DateTimeFormatter 类的信息,但文档不正确;它不支持解析并且无意(仅格式化)。

关于datetime - 如何解析 Metro (C++/CX) 应用程序中的日期?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11615998/

相关文章:

c# - 强制枢轴项目在显示之前预加载

windows-8 - BackgroundUploader.getCurrentUploadsAsync()返回我做过的大多数传输

php - 在 PHP 中增加日期的最简单方法?

sql-server - 获取几列之间的最小值

javascript - jQuery 和 Windows 8 JavaScript Metro 风格应用程序

c# - 使用 DataContractSerializer 和 DataProtectionProvider 序列化和加密对象

sql - 获取两个日期之间的工作日数(周日、周一、周二)SQL

php - 当我们有各自地点的当前时间和时区时,两个城市/国家之间的时差

c# .net Windows 8 App TcpClient 代码端口到 StreamSocket

c# - ContentControl 上的绑定(bind)内容在 DataTemplateSelector 中为空