将Unix/Linux时间转换为Windows时间的方法

4
我希望你能提供多种在两个系统之间进行转换的方法。我正在寻找一种快速简便的方法。
我想要Python方法、Excel、OpenOffice Calc方法、Access方法、命令行方法。如果您有其他方法,也可以分享。反过来(从Windows到Linux)也是不错的选择。
我的一些脚本输出包含自1970年以来的秒数,但我想将其转换为Windows时间。这样,在导入数据库时就不会出现时间混乱的问题。

在Linux中,您可以使用gettimeofday获取自1970年1月1日以来微秒(10^-6秒)的时间。

在Windows中,包含一个64位值,表示自1601年1月1日(UTC)以来的100纳秒间隔数。

以下是C语言的示例:将Unix/Linux时间转换为Windows FILETIME 查找的示例输出:
find ./sd-mmc-card/ -iname *.jpg -printf "%h/%f\t%f\t%a\t%Ax\t%AT\t%A@\n" > dbtime.txt

./sd-mmc-card/0117.jpg    0117.jpg    Thu Mar 24 15:27:25.0059226867 2011    24/03/2011    15:27:25.0592268670    1300973245.0592268670
5个回答

11

这在将 time_t 值转换为文件时间中有描述,其中提供了示例 C 代码。

概要:

filetime = (unixtime * 10000000) + 116444736000000000

0x3DE43B0C → 0x01C295C4:91150E00 (2002-11-27 03:25:00 +0000)

通常更容易解析人类可读的时间戳,例如 "2002-11-27 03:25:00" (printf %AF %AT),使用 strptime() 或类似方法。

(另外有帮助的是如何远距离识别不同类型的时间戳。)


2
BOOL PbyteTimeToUnixTime(PBYTE pTime, LONGLONG *pUnixTime)
{
    SYSTEMTIME  stSystemTime;
    FILETIME    stFileTime;

    //CONVERT SYSTEMTIME 
    memset(&stSystemTime, 0, sizeof(stSystemTime));
    stSystemTime.wYear      = ((pTime[0] << 8) + pTime[1]);
    stSystemTime.wMonth     = pTime[2];
    stSystemTime.wDay       = pTime[3];
    stSystemTime.wHour      = pTime[4];
    stSystemTime.wMinute    = pTime[5];
    stSystemTime.wSecond    = pTime[6];

    // SYSTEMTIME -> FILETIME 変換
    if (SystemTimeToFileTime(&stSystemTime, &stFileTime) == FALSE) {
        return FALSE;
    }

    // FILETIME -> UNIXTIME
    *pUnixTime  = stFileTime.dwHighDateTime;
    *pUnixTime  <<= 32;
    *pUnixTime  += stFileTime.dwLowDateTime;
    *pUnixTime  -= 116444736000000000;
    *pUnixTime  /= 10000000;
    *pUnixTime  -= 32400;           // JST -> GMT 

    return TRUE;
}

1

在办公室里,您可以使用我从开放办公室论坛中获得的这个公式进行转换。

开放办公室http://user.services.openoffice.org/en/forum/viewtopic.php?f=13&t=606#p2484

(Unix时间/86400) + 25569 = 您的日期

将(Unix时间1300973245.0592268670 /每天的秒数(86400))+ 25569(自1899年以来的天数)=(40626.5607) 2011/03/24 13:27:24

开放办公室日期很容易计算,只需在一列中输入0并将其格式化为日期即可。

0 = 1899/12/30 00:00:00
25569 = 1970/01/01 00:00:00 #自1899年至1970年的天数
40626.5607 = 2011/03/24 13:27:24

我原以为这个在Office 2007中是一样的,但是

0 = 1900/01/00 00:00
365 = 1900/12/30 00:00
25569 = 1970/01/01 00:00 # 这是一样的

我不知道为什么Open Office中的日期和Windows中的不同。现在唯一的问题是它所报告的时间比实际创建文件的时间晚了两年。应该说是2009而不是2011。

这是我的查找命令将访问日期替换为创建日期的问题。

find ./sd-mmc-card/ -iname *.jpg -printf "%h/%f\t%f\t%a\t%Ax\t%AT\t%A@\n"

它应该是%t和%T@,\t是制表符。

find ./sd-mmc-card/ -iname *.jpg -printf "%h/%f\t%f\t%t\t%T@\n"

由于某些原因,上面的公式会导致时间减少两小时。

2009年3月27日星期五17:08:18.0000000000 | 2009/03/27 15:08:18
所以我只需将0.08333(2小时)添加到公式中。
(unix时间/86400) + 25569 + 0.08333 = 您的日期

微软为了保持兼容性而增加了额外的闰年,这就是为什么Open Office会比实际年份早一年的原因。http://en.wikipedia.org/wiki/Y2k#Resulting_bugs_from_date_programming - nelaaro

1

我一直在寻找类似的东西(在 Windows 和 Linux 时间/时代之间进行转换),最终使用 MSDN 和将 Unix/Linux 时间转换为 Windows FILETIME中的一些片段编写了一个程序。

这个程序朴素地使用 Win32 复制了 Linux 中的 gettimeofday()

#include <windows.h>
/**
 * number of seconds from 1 Jan. 1601 00:00 to 1 Jan 1970 00:00 UTC
 */
#define EPOCH_DIFF 11644473600LL

void gettimeofday(ULARGE_INTEGER* microsecondsAsULINT)
    {
        FILETIME ftTime;
        SYSTEMTIME stTime;

        // Get the current system time
        GetSystemTime(&stTime);
        // Convert it to filetime which is # of 100ns periods since Jan 1, 1601
        SystemTimeToFileTime(&stTime, &ftTime);
        // Move it into the return result
        microsecondsAsULINT->HighPart = ftTime.dwHighDateTime;
        microsecondsAsULINT->LowPart = ftTime.dwLowDateTime;
        // Convert to UTC by subtracting epoch difference as 100ns periods
        microsecondsAsULINT->QuadPart -= (EPOCH_DIFF*10000000);
        // Convert to microseconds ([# of 100ns periods]/10 = [# of 1us periods])
        microsecondsAsULINT->QuadPart = microsecondsAsULINT->QuadPart/10;
    }

编辑:第二遍阅读中有几个行内注释不太清楚;已更新(还在"naïvely"上添加了umlauts)。


0
在Linux中,您可以执行以下操作:
以秒为单位的Unix时间戳
date -d @1267619929  
Wed Mar  3 14:38:49 SAST 2010

将日期字符串转换为Unix时间戳。
date -d 2016-08-09 +%s  
1470693600

摘自https://dev59.com/qXE95IYBdhLWcg3wSsCD#2371288

然后应用其他帖子中的数学方法,以获得在 MS Office 中被识别的日期值

echo $(( $(date -d '2016-08-08T00:00:00-0000' +%s) / 86400 + 25569 ))  
42590  

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接