#define TICKS_PER_SECOND 10000000
#define EPOCH_DIFFERENCE 11644473600LL
time_t convertWindowsTimeToUnixTime(long long int input){
long long int temp;
temp = input / TICKS_PER_SECOND; //convert from 100ns intervals to seconds;
temp = temp - EPOCH_DIFFERENCE; //subtract number of seconds between epochs
return (time_t) temp;
}
... (as above)
long long secs;
time_t t;
secs = (windowsTicks / WINDOWS_TICK - SEC_TO_UNIX_EPOCH);
t = (time_t) secs;
if (secs != (long long) t) // checks for truncation/overflow/underflow
return (time_t) -1; // value not representable as a POSIX time
return t;
SELECT timestamp,
FROM_UNIXTIME(ROUND((((timestamp) / CAST(10000000 AS UNSIGNED INTEGER)))
- CAST(11644473600 AS UNSIGNED INTEGER),0))
AS Converted FROM events LIMIT 100
9条答案
按热度按时间7nbnzgx91#
很简单:窗口时期开始于1601-01- 01 T00:00:00 Z。它比UNIX/Linux纪元(1970-01- 01 T00:00:00 Z)早11644473600秒。Windows刻度以100纳秒为单位。因此,从UNIX epoch获取秒的函数将如下:
w9apscun2#
FILETIME类型是自1601年1月1日以来以100ns递增的数字。
要将其转换为unix time_t,您可以使用以下命令。
然后你可以使用ctime函数来操作它。
nzkunb0c3#
(我发现我不能在注解中输入可读代码,所以……)
请注意,Windows可以表示POSIX纪元时间范围之外的时间,因此转换例程应该适当地返回“超出范围”指示。最简单的方法是:
bq8i3lrv4#
老问题的新答案
使用C++11的
<chrono>
加上这个免费的开源库:https://github.com/HowardHinnant/date
可以很容易地将这些时间戳转换为
std::chrono::system_clock::time_point
,也可以将这些时间戳转换为公历中的人类可读格式:对我来说,这输出:
在Windows上,您实际上可以跳过
floor
,并获得精度的最后一个十进制数字:在优化打开的情况下,子表达式
(sys_days{1970_y/jan/1} - sys_days{1601_y/jan/1})
将在编译时转换为days{134774}
,后者将进一步在编译时转换为完整表达式所需的任何单位(秒、100纳秒等)。底线是:这是非常可读和非常有效的。v8wbuo2f5#
除法和加法的解决方案将无法在夏令时正常工作。
下面是一个可以工作的代码片段,但它是针对windows的。
iswrvxsc6#
假设您询问的是FILETIME结构,那么FileTimeToSystemTime会按照您的要求执行操作,您可以从它生成的SYSTEMTIME结构中获取秒数。
91zkwejq7#
这里基本上是相同的解决方案,除了这个正确地从Ldap编码负数,并在转换之前删除最后7位数字。
uurity8g8#
如果有人需要将其转换为MySQL
2jcobegt9#
这里也有一个纯C#ian的方法来做这件事。
以下是我的即时窗口中两种方法的结果: