如何分析在地铁(C ++ / CX)应用程序的日期?(How do I parse a date i

2019-07-30 14:02发布

我有一个C ++ / CX应用程序,从文件处理的一些数据。 它在那里表示用于保存日期的文化一个字符串,它有一定的日期。 我需要将它们从字符串到平台::日期时间转换。 我听说的Windows ::全球化:: DateTimeFormatting是使用类,但我不知道如何使用它为。 有没有人有一个例子吗?

Answer 1:

的WinRT的C ++ / CX突起从管(C#/ VB)投影的不同之处多种方式,而最重要的一个是在基本类型(如的投影PointSizeStringDateTime )。

被管理的投影投射这些类型作为.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类和文档不正确; 它不支持解析,并且不打算(只格式化)。



Answer 2:

std::get_time做的伎俩? 在页面底部的例子表明您可以使用一个区域设置成解析日期字符串tm结构。 我想象那么你可以转换tm结构到正确的WinRT的DateTime



Answer 3:

我用这个代码:

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

随着Windows ::全球化::日历,你有你需要的所有美好时光功能: https://msdn.microsoft.com/library/windows/apps/br206724



文章来源: How do I parse a date in a Metro (C++/CX) app?