16

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

4

3 回答 3

14

WinRT 的 C++/CX 投影在许多方面与托管 (C#/VB) 投影不同,其中最主要的一种是基本类型的投影(例如PointSizeStringDateTime)。

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

因此,在 .NET 中,有符号的 32 位整数在 C++ 中变为 a 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课程的信息,但文档不正确;它不支持解析并且不打算(仅格式化)。

于 2012-07-23T22:05:51.193 回答
4

std::get_time做的伎俩?页面底部的示例建议您可以使用语言环境将日期字符串解析为tm结构。我想您可以然后将tmstruct 转换为正确的 WinRT DateTime

于 2012-07-26T11:53:09.727 回答
0

我使用这段代码:

auto cal = ref new Windows::Globalization::Calendar(); cal->AddSeconds(additionalSeconds); return cal->GetDateTime();

使用 Windows::Globalization::Calendar,您拥有所需的所有美好时光功能:https ://msdn.microsoft.com/library/windows/apps/br206724

于 2016-03-15T07:26:33.400 回答