我试图解码包含UNIX日期戳的二进制数据(1970年1月1日00:00:00 UTC时间的毫秒数)并且无法理解为什么我无法准确地将8字节的数组{UInt8,1}转换为(最终)适合转换为DateTime对象的Float64。我的输入示例是来自名为2007-11-23T00:00:00
的变量的以下数组:
Float64((Int64(arr[1]) << 56) | (Int64(arr[2]) << 48) | (Int64(arr[3]) << 40) | (Int64(arr[4]) << 32) | (Int64(arr[5]) << 24) | (Int64(arr[6]) << 16) | (Int64(arr[7]) << 8) | Int64(arr[8]))
表示日期时间值1.195794e12
然后我尝试使用位移转换以下内容:
1.195794e9
这给了我julia> Dates.unix2datetime(1.195794e9)
2007-11-23T05:00:00
除以1000得到<div class="right-body-2">
,这给了我正确的输入函数Dates.unix2datetime()的大小,它给出了:
<a>
虽然很接近但不完全是我2007-11-23T00:00:00(我5小时休息)。
任何人都可以了解我误入歧途的地方吗?有人提供更简单,更简单的方法吗?在C中,可以使用联盟轻松地在数组表示和目标类型之间进行转换,但Julia中的联合与C完全不同(为什么我需要除以1000,我认为我可以使用e9表示直接地)
答案 0 :(得分:2)
TL; DR我认为您的原始unix时间戳代表您找到的日期!
你从哪里获得arr
输入数组?
您开始时的arr
确实代表1.195794e12
,因为可以稍微简洁一点地显示:
parse(Int64,join(bits.(arr)),2)
- &gt; 1.195794e12
你需要除以1000,从毫秒到秒。
unix2datetime(x) -> DateTime
Takes the number of seconds since unix epoch 1970-01-01T00:00:00 and converts to the corresponding DateTime.
但似乎您的arr
代表
Int64(Dates.datetime2unix(DateTime(2007, 11, 23, 0, 0, 0))*1000)
- &gt; 1195776000000
while Int64(Dates.datetime2unix(DateTime(2007, 11, 23, 5, 0, 0))*1000)
- &gt; 1195794000000