如何将Unix / Linux时间转换为Windows时间

我想要在两个系统之间进行多种转换。 我正在寻找一个快速简单的方法来做到这一点。

我想Python方式,excel,openoffice calc方式,访问方式,命令行方式。 任何其他方式,你做的也会很好。 换个方式(从Windows到Linux)也是很好的

我从我的一些脚本输出,包括自1970年以来的秒数,但我想转换为Windows时间。 所以当它被导入到数据库时,它不会搞乱时间。

在Linux中,使用gettimeofday可以从1970年1月1日起以微秒(10 ^ -6秒)的速度获得时间。

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

这是一个C的方式。 将Unix / Linux时间转换为Windows FILETIME

从find的例子

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 

这在转换time_t值到文件时间中描述 ,它提供了示例C代码。

概要:

 filetime = (unixtime * 10000000) + 116444736000000000 0x3DE43B0C → 0x01C295C4:91150E00 (2002-11-27 03:25:00 +0000) 

(也很有帮助的是如何从相当长的一段距离识别不同类型的时间戳 。)


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

 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; } 

在办公室里,你可以用我从开放办公室得到的这个结果转换成4ms。 开放办公室http://user.services.openoffice.org/en/forum/viewtopic.php?f=13&t=606#p2484

(unix time / 86400)+ 25569 =你的日期

取(unix time 1300973245.0592268670 /以秒计(86400))+ 25569(自1899年以来的天数)=(40626.5607)2011/03/24 13:27:24

开放式办公日期很容易找出把0放在一列,并格式化到目前为止。

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

我预计这将是在办公室2007年,但是

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

我不知道为什么开放式办公室的0日期与windows相比是不同的。 现在唯一的问题是报告的时间比年轻两岁。 然后是创建文件的实际日期。 应该说2009年不是2011年。

这是我的查找命令拉日期而不是创建日期的问题。

找到./sd-mmc-card/ -iname * .jpg -printf“%h /%f \ t%f \ t%a \ t%Ax \ t%AT \ t%A @ \ n”

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

找到./sd-mmc-card/ -iname * .jpg -printf“%h /%f \ t%f \ t%t \ t%T @ \ n”

由于某种原因,上述公式从创建时间开始下降了两个小时。

星期五三月27 17:08:18.0000000000 2009 | 2009/03/27 15:08:18

所以我只是加了0.08333(2小时)的公式。

(unix time / 86400)+ 25569 + 0.08333 =你的日期

我一直在寻找类似的东西(在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; } 

编辑 :一对夫妇在线评论不清楚在二读; 更新(也添加元音“天真”)。

在linux中你可以做到以下几点,

以秒为单位的unix时间戳

 date -d @1267619929 Wed Mar 3 14:38:49 SAST 2010 

日期字符串到unixtime邮票。

 date -d 2016-08-09 +%s 1470693600 

采取从https://stackoverflow.com/a/2371288/619760

然后应用来自另一个帖子的数学来获取在MS Office中识别的日期值

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