从UNIX时间到2000年1月1日开始的时间戳转换

时间:2016-03-03 04:42:33

标签: python datetime unix timestamp epoch

我正在尝试与使用时间戳的API进行交互,该时间戳的开始时间与UNIX纪元不同。它似乎开始计算2000-01-01,但我不确定如何进行转换或此日期时间格式的名称是什么。

当我在1456979510发送消息时,我收到回复,说它已收到510294713.
两者之间的差异是946684796(有时是94668479 7 )秒,大约是30年。

任何人都可以让我知道两者之间转换的正确方法吗?或者我是否可以在Python中直接生成它们?

由于

修改

我应该提到的另一个细节是这是Zigbee设备的API。我在他们的文档中找到了以下数据类型:

  

1.3.2.7绝对时间
  这是绝对时间的无符号32位整数表示。绝对时间以秒为单位   从2000年1月1日午夜开始。

我仍然不确定在两者之间转换的最简单方法

5 个答案:

答案 0 :(得分:8)

时间 1970年1月1日00:00:00 被视为UNIX epoch。因此,如果要将UNIX时间转换为具有2000年1月1日的纪元(比如2000年纪元)的时间戳,最简单的方法是简单地从UNIX时间减去2000年1月1日的UNIX时间。 / p>

<2000 time> = <UNIX time> - <January 1, 2000 UNIX time>

<UNIX time> = <2000 time> + <January 1, 2000 UNIX time>

2000年1月1日,UNIX时间 946684800

编辑:文档确实说

  

绝对时间是从2000年1月1日午夜开始测量的。

因此,946684800是应该用于计算的精确时差。您计算的几秒钟差异可归因于网络延迟或其他一些延迟。

答案 1 :(得分:3)

嗯,在2000-01-01T00:00:00Z和1970-01-01T00:00:00Z之间有946684800秒。因此,您可以为946684800设置一个常量,并在Unix时间戳中添加或减去。

您在数字中看到的变化与发送和接收数据时的延迟有关,也可能是由于时钟同步或缺少时钟。由于这些是完整的秒数,并且你的数字是3到4秒,所以我猜你的计算机和你的设备之间的时钟也是3到4秒不同步。

答案 2 :(得分:2)

编辑:OP添加了详细信息,指定时间从午夜开始,因此绝对时间与J2000不同,后者始于< EM>中午。但由于标题是“从2000年1月1日开始的时间戳”,我将这个答案用于未来的求职者。

<强>解答:

您提到的时间戳似乎是J2000.0提到的here

由于Unix和J2000纪元时间是常数,因此您可以定义一个常量来存储差异。

如果您有数学倾向,以下链接提供有关转换的一些信息

  1. http://www.giss.nasa.gov/tools/mars24/help/algorithm.html请参阅步骤A-2
  2. http://onegeek.org/software/smeg/current/src/time.c(C档案),

    C文件中的#define部分包含以下内容

    #define J2000 2451545.0 /* you-know-when */

    #define U1970 -10957.5 /* unix epoch relative to J2000 */

答案 3 :(得分:1)

这两次的差异确实是30年:

>>> import datetime
>>> d1 = datetime.datetime.fromtimestamp(1456979510)
>>> d1.ctime()
'Wed Mar  2 20:31:50 2016'
>>> d2 = datetime.datetime.fromtimestamp(510294713)
>>> d2.ctime()
'Mon Mar  3 20:31:53 1986'

可以创建一个变量以保持差异转换:

>>> conv_factor = (d1 - d2).total_seconds()
>>> conv_factor
946684797.0
>>> conv_time = d2 + datetime.timedelta(seconds=conv_factor)
>>> conv_time
datetime.datetime(2016, 3, 2, 20, 31, 50)
>>> conv_time.ctime()
'Wed Mar  2 20:31:50 2016'

减去conv_factor可以转换另一个方向。

答案 4 :(得分:0)

Unix epoch:1970-1-1,00:00:00

J2000纪元:2000-1-1,12:00:00

时间间隔为:946684800秒(

陷阱是python将使用本地时区从datetime到timestamp进行转换。如下图所示:

import datetime
import time, calendar
dt = datetime.datetime(1970, 1, 1, 0, 0) # datetime.datetime, default is computer's local time zone
tt = dt.timetuple()
print(tt) # time.struct_time
print("Unix Timestamp: ",time.mktime(tt))      # struct_time in local time
print("Unix Timestamp: ",calendar.timegm(tt))  # struct_time in UTC

因此,如果您想将时间戳转换回日期时间,请使用以下代码:

t = 0  # Unix timestamp
t2000 = t+946728000
#value = datetime.datetime.fromtimestamp(t2000)   # from local time
dt= datetime.datetime.utcfromtimestamp(t2000)     # from UTC time
print(dt.timetuple())
print(dt.strftime('%Y-%m-%d %H:%M:%S'))

网上有一个不错的转换工具:https://www.unixtimestamp.com/index.php