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

时间:2011-03-25 08:40:43

标签: windows linux ms-office datetime

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

我想要Python方式,excel,openoffice方法,访问方式,命令行方式。你做任何其他方式也会很好。走另一条路(从Windows到Linux)也不错

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

  

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

     

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

这是一种C方式。 Convert Unix/Linux time to 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 个答案:

答案 0 :(得分:9)

这在Converting a time_t Value to a File Time中有描述,它提供了示例C代码。

要点:

filetime = (unixtime * 10000000) + 116444736000000000

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

How to recognize different types of timestamps from quite a long way away也很有帮助。)


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

答案 1 :(得分:1)

在办公室,你可以转换我从开放办公室四分钟获得的这个fomrulae。 开放式办公室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

我预计这在2007年的办公室会是相同的,但是

  

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

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

这是我的find命令拉取访问日期而不是创建日期的问题。

  

找到./sd-mmc-card/ -iname * .JPG -printf “%H /%F \吨%F \吨%一\吨%斧\吨%AT \吨%A @ \ n” 个< / p>

它应该是%t和%T @ \ t是标签。

  

找到./sd-mmc-card/ -iname * .JPG -printf “%H /%F \吨%F \吨%吨\吨%T @ \ n” 个

出于某种原因,上述公式比创建的时间减少了两个小时。

  

Fri Mar 27 17:08:18.0000000000 2009 | 2009/03/27 15:08:18

所以我只需在公式中添加0.08333(2小时)。

  

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

答案 2 :(得分:1)

我一直在寻找类似的东西(在Windows和Linux时代/时代之间进行转换),最后使用MSDN和Convert Unix/Linux time to 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;
    }

编辑:在第二次阅读时,几个内联评论不清楚;更新(也在天真地添加了变形符号'。'

答案 3 :(得分:1)

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

答案 4 :(得分:0)

在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