Datetime 使用WinRT格式化本地时间戳

Datetime 使用WinRT格式化本地时间戳,datetime,windows-runtime,c++-cx,Datetime,Windows Runtime,C++ Cx,WinRT使用该类将时间戳转换为人类可读的日期。在C++CX中,您将向它传递一个实例,其中包含UTC时间的时间戳,并让它发挥神奇的作用 但是,我有一个使用本地时间的时间戳的应用程序。我想格式化它们并将它们显示给我的用户,但如果我按原样传递时间戳,DateTimeFormatter将假定它是UTC,并将尝试再次将其转换为本地时间,从而导致错误的时间 如何使用WinRT显示本地时间?有没有办法把当地时间变回UTC时间 时间戳是从使用它们的机器生成的,因此没有时区混淆的风险。从技术上讲,生成UTC时间

WinRT使用该类将时间戳转换为人类可读的日期。在C++CX中,您将向它传递一个实例,其中包含UTC时间的时间戳,并让它发挥神奇的作用

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

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


时间戳是从使用它们的机器生成的,因此没有时区混淆的风险。从技术上讲,生成UTC时间戳也是可行的,但这会很不方便,我想回到这一点上来,除非这是唯一的方法。

谢天谢地,FileTimeToSystemTime、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;
}

谢天谢地,FileTimeToSystemTime、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;
}
您可以使用该类处理本地时间或任何时区的时间

如果未明确设置本地时区,
日历默认为本地时区。然后可以使用
GetDateTime()
检索可与
DateTimeFormatter
一起使用的
Windows::Foundation::DateTime
实例

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());
您可以使用该类处理本地时间或任何时区的时间

如果未明确设置本地时区,
日历默认为本地时区。然后可以使用
GetDateTime()
检索可与
DateTimeFormatter
一起使用的
Windows::Foundation::DateTime
实例

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

我想我会使用带有时间戳的FileTimeToSystemTime来获取填充它所需的信息?我想这取决于时间戳的格式。举个例子会很有用。从1601年1月1日开始,用100ns的切片表示,由
GetSystemTimeAsFileTime
返回。现在我又回到了它,我发现如果我必须用它的人类可读的表示形式来编一个日期,日历将非常方便,但它不太擅长使用本地时间戳(使用与DateTime的UniversalTime相同的格式)并使其通用。就我个人而言,我讨厌
Windows::Globalization::Calendar
。它让我想起了太多的
java.util.Calendar
…如果你有更好的路线,那就千方百计使用它。:)我想我会使用带有时间戳的FileTimeToSystemTime来获取填充它所需的信息?我想这取决于时间戳的格式。举个例子会很有用。从1601年1月1日开始,用100ns的切片表示,由
GetSystemTimeAsFileTime
返回。现在我又回到了它,我发现如果我必须用它的人类可读的表示形式来编一个日期,日历将非常方便,但它不太擅长使用本地时间戳(使用与DateTime的UniversalTime相同的格式)并使其通用。就个人而言,我讨厌
Windows::Globalization::Calendar
。它让我想起了太多的
java.util.Calendar
…如果你有更好的路线,那么尽一切可能使用它。:)这是合理的,假设您的输入适合解释为本地化的
FILETIME
。这是合理的,假设您的输入适合解释为本地化的
FILETIME