在Julia中将unix日期转换为数组{UInt8,1}或从数组{UInt8,1}转换unix日期时遇到问题

在Julia中将unix日期转换为数组{UInt8,1}或从数组{UInt8,1}转换unix日期时遇到问题,julia,Julia,我试图解码包含UNIX日期戳的二进制数据(时间单位为毫秒,从1970年1月1日的UTC 00:00:00开始),但无法理解为什么我无法准确地将8字节的数组{UInt8,1}转换为(最终)适合转换为DateTime对象的Float64。我的输入示例是来自名为arr的变量的以下数组: 8-element Array{UInt8,1}: 0x00 0x00 0x01 0x16 0x6a 0xe0 0x68 0x80 它表示2007-11-23T00:00:00的日期时间值 然后,我尝试使用位移位进行

我试图解码包含UNIX日期戳的二进制数据(时间单位为毫秒,从1970年1月1日的UTC 00:00:00开始),但无法理解为什么我无法准确地将8字节的数组{UInt8,1}转换为(最终)适合转换为DateTime对象的Float64。我的输入示例是来自名为
arr
的变量的以下数组:

8-element Array{UInt8,1}:
0x00
0x00
0x01
0x16
0x6a
0xe0
0x68
0x80
它表示
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]))
这很接近,但不完全是我从2007-11-23T00:00:00开始的(我休息了5个小时)


有谁能说明我误入歧途的地方吗?有谁能提供一种更短、更简单的方法?在C中,可以使用并集轻松地在数组表示和目标类型之间进行转换,但Julia中的并集与C完全不同(为什么我需要除以1000,我想我可以直接得到e9表示)

TL;DR我想你原来的unix时间戳代表了你找到的日期

您从哪里获得的
arr
输入数组

您开始时使用的
arr
确实代表
1.195794e12
,可以用更简洁的文字显示:

parse(Int64,join(bits.(arr)),2)
->
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)
-->
1195776000000


虽然
Int64(Dates.datetime2unix(DateTime(2007,11,23,5,0,0))*1000)
-->-->
1195794000000

五个小时的差异…听起来像是北美东海岸的时区偏移量…
arr
是我的本地测试变量,其中包含UInt8数组。我意识到我需要除以1000从毫秒到秒,但我的问题是,为什么unix2datetime()函数需要秒作为输入,而不是自然毫秒?该函数的文档声明它以UNIX时间作为输入(这应该意味着它以毫秒为输入)。五小时的差异确实表明时区可能是造成差异的原因。但在这种情况下,我会认为我的解释是-5小时(不是+5小时)见。这是自UTC纪元以来的秒数。如果
arr
是由时区感知程序生成的,那么它可能会显示午夜(当地时间),但会将其存储为上午5点(UTC)。
unix2datetime(x) -> DateTime
Takes the number of seconds since unix epoch 1970-01-01T00:00:00 and converts to the corresponding DateTime.