【问题标题】:Convert UNIX epoch time to SYSTEMTIME将 UNIX 纪元时间转换为 SYSTEMTIME
【发布时间】:2015-09-17 17:18:44
【问题描述】:

在我的 C++ windows 应用程序中,我将 SYSTEMTIME 转换为格式化字符串,如下所示:

    SYSTEMTIME systemTime;
    GetSystemTime(&systemTime);
    char pSystemTime[50];
    sprintf_s(pSystemTime, 50, "%04d%02d%02d%02d%02d%02d%03u\0", systemTime.wYear, systemTime.wMonth,
                                                                              systemTime.wDay, systemTime.wHour,
                                                                              systemTime.wMinute, systemTime.wSecond,
                                                                              systemTime.wMilliseconds);

现在我有一个自 UNIX 纪元以来的毫秒时间。

long time = 1442524186;  //for example

如何将这么长的纪元时间转换为 SYSTEMTIME 以便我也可以将其格式化为字符串?

【问题讨论】:

  • 这个提议在我看来在语义上是错误的SYSTEMTIME 类型的值仅由代表当前系统时间的 GetSystemTime 生成。此类型不适用于一般用途。您是否研究过格式化 UNIX 时间戳本身的方法?这就是我会做的,当然。

标签: c++


【解决方案1】:
static UINT64 FileTimeToMillis(const FILETIME &ft)
{
    ULARGE_INTEGER uli;
    uli.LowPart = ft.dwLowDateTime; // could use memcpy here!
    uli.HighPart = ft.dwHighDateTime;

    return static_cast<UINT64>(uli.QuadPart/10000);
}

static void MillisToSystemTime(UINT64 millis, SYSTEMTIME *st)
{
    UINT64 multiplier = 10000;
    UINT64 t = multiplier * millis;

    ULARGE_INTEGER li;
    li.QuadPart = t;
    // NOTE, DON'T have to do this any longer because we're putting
    // in the 64bit UINT directly
    //li.LowPart = static_cast<DWORD>(t & 0xFFFFFFFF);
    //li.HighPart = static_cast<DWORD>(t >> 32);

    FILETIME ft;
    ft.dwLowDateTime = li.LowPart;
    ft.dwHighDateTime = li.HighPart;

    ::FileTimeToSystemTime(&ft, st);
}

来源:https://stackoverflow.com/a/11123106/2385309

编辑:另见:https://stackoverflow.com/a/26486180/2385309 您可能需要为纪元时间毫秒添加/减去 11644473600000

【讨论】:

  • 当我经过一个时间,例如1442535162 到网站epochconverter.com 它给出了格林威治标准时间:2015 年 9 月 18 日星期五 00:12:42 格林威治标准时间,这是正确的,但是当我将它传递给 MillisToSystemTime 函数时,SYSTEMTIME 值不正确,因为它说 wYear=1601, wMonth=1 , wDayOfWEeek=3...
  • 您需要将该数字乘以 1000 毫秒,因此请尝试使用 1442524186000
  • 但它已经乘以 10000,如何将 1442535162 乘以 1000 得到 1442524186000??
【解决方案2】:

MillisToSystemTime 中的行应该是这样的:

UINT64 t = multiplier * millis + 116444736000000000

【讨论】:

    猜你喜欢
    • 2012-01-30
    • 2015-07-08
    • 2016-09-15
    • 2015-12-22
    • 2013-01-08
    • 2011-07-25
    • 2021-07-09
    • 2018-12-27
    相关资源
    最近更新 更多