使用WinRT格式化本地时间戳

时间:2014-07-04 20:49:59

标签: datetime windows-runtime c++-cx

WinRT使用DateTimeFormatter类将时间戳转换为人类可读日期。在C ++ CX中,您将传递一个DateTime实例,其中包含UTC时间的时间戳,让它发挥其魔力。

但是,我有一个应用程序在本地时间内消耗时间戳。我想格式化它们并将它们显示给我的用户,但如果我按原样传递时间戳,DateTimeFormatter将假定它的UTC并将尝试再次将其转换为本地时间,从而导致错误次。

如何使用WinRT显示本地时间?有没有办法将当地时间转回UTC时间?

时间戳是从消耗它们的机器生成的,因此不存在时区混淆的风险。相反,生成UTC时间戳在技术上也是可行的,但这样做会相当不方便,而且只有在它是唯一的方法时我才会回归到它。

2 个答案:

答案 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());