在Julia中将unix日期转换为/来自Array {UInt8,1}时遇到问题

时间:2017-01-20 18:11:04

标签: julia

我试图解码包含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表示直接地)

1 个答案:

答案 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