我想要很多方法在两个系统上进行转换。我正在寻找一种快速简便的方法来做到这一点。
我想要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
答案 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