我有一个C ++ / CX应用程序,从文件处理的一些数据。 它在那里表示用于保存日期的文化一个字符串,它有一定的日期。 我需要将它们从字符串到平台::日期时间转换。 我听说的Windows ::全球化:: DateTimeFormatting是使用类,但我不知道如何使用它为。 有没有人有一个例子吗?
Answer 1:
的WinRT的C ++ / CX突起从管(C#/ VB)投影的不同之处多种方式,而最重要的一个是在基本类型(如的投影Point
, Size
, String
和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
类和文档不正确; 它不支持解析,并且不打算(只格式化)。
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