我正在尝试与使用时间戳的API进行交互,该时间戳的开始时间与UNIX纪元不同。它似乎开始计算2000-01-01,但我不确定如何进行转换或此日期时间格式的名称是什么。
当我在1456979510发送消息时,我收到回复,说它已收到510294713.
两者之间的差异是946684796(有时是94668479 7 )秒,大约是30年。
任何人都可以让我知道两者之间转换的正确方法吗?或者我是否可以在Python中直接生成它们?
由于
修改
我应该提到的另一个细节是这是Zigbee设备的API。我在他们的文档中找到了以下数据类型:
1.3.2.7绝对时间
这是绝对时间的无符号32位整数表示。绝对时间以秒为单位 从2000年1月1日午夜开始。
我仍然不确定在两者之间转换的最简单方法
答案 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纪元时间是常数,因此您可以定义一个常量来存储差异。
如果您有数学倾向,以下链接提供有关转换的一些信息
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