WinRT使用DateTimeFormatter类将时间戳转换为人类可读日期。在C ++ CX中,您将传递一个DateTime实例,其中包含UTC时间的时间戳,让它发挥其魔力。
但是,我有一个应用程序在本地时间内消耗时间戳。我想格式化它们并将它们显示给我的用户,但如果我按原样传递时间戳,DateTimeFormatter将假定它的UTC并将尝试再次将其转换为本地时间,从而导致错误次。
如何使用WinRT显示本地时间?有没有办法将当地时间转回UTC时间?
时间戳是从消耗它们的机器生成的,因此不存在时区混淆的风险。相反,生成UTC时间戳在技术上也是可行的,但这样做会相当不方便,而且只有在它是唯一的方法时我才会回归到它。
答案 0 :(得分:2)
值得庆幸的是,File StoreToSystemTime,TzSpecificLocalTimeToSystemTime和SystemTimeToFileTime都可用于Windows应用商店。有了它,就可以创建一个函数来将本地改回UTC。
uint64 LocalTimeToUtcTime(uint64 local)
{
LARGE_INTEGER largeTime;
largeTime.QuadPart = local;
FILETIME intermediate;
intermediate.dwHighDateTime = largeTime.HighPart;
intermediate.dwLowDateTime = largeTime.LowPart;
SYSTEMTIME systemLocal, systemUtc;
if (!FileTimeToSystemTime(&intermediate, &systemLocal))
{
// handle error
}
if (!TzSpecificLocalTimeToSystemTime(nullptr, &systemLocal, &systemUtc))
{
// handle error
}
if (!SystemTimeToFileTime(&systemUtc, &intermediate))
{
// handle error
}
largeTime.HighPart = intermediate.dwHighDateTime;
largeTime.LowPart = intermediate.dwLowDateTime;
return largeTime.QuadPart;
}
答案 1 :(得分:2)
您可以使用Windows::Globalization::Calendar
课程来处理当地时间,也可以使用任何时区的时间。
如果您没有明确设置,Calendar
默认为本地时区。然后,您可以使用GetDateTime()
检索可与Windows::Foundation::DateTime
一起使用的DateTimeFormatter
实例。
Calendar^ cal = ref new Calendar();
cal->SetToMin();
cal->Year = 2014;
cal->Month = 7;
cal->Day = 14;
cal->Hour = 12;
cal->Minute = 34;
cal->Second = 56;
DateTime dt = cal->GetDateTime();
DateTimeFormatter^ dtf = ref new DateTimeFormatter("shortdate shorttime");
String^ result = dtf->Format(dt);
Logger::WriteMessage(result->Data());