WinRT 的 C++/CX 投影在很多方面与托管 (C#/VB) 投影不同,其中最主要的区别之一是基本类型的投影(例如Point
, Size
, String
, and DateTime
).
托管投影将这些类型投影为 .NET 类型(具有 BCL 的所有底层支持),而 C++ 投影通常最低限度地投影这些类型以进行互操作,期望用户依赖 C++ 库支持来实现更高级的功能。
因此,在 .NET 中,有符号的 32 位整数变为System.Int32
(及其相关.Parse
功能)在 C++ 中你会得到一个常规的 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
类,并且文档不正确;它不支持解析并且无意(仅格式化)。