Python日期时间到纪元

Python日期时间到纪元,python,python-3.x,python-2.7,Python,Python 3.x,Python 2.7,在repl.it(python 3.6.1)上给出:1526379900000 及 在我的本地计算机上:1526397900000(python 2.7.14) 为什么?? 将datetime对象转换为历元的推荐方法是什么?尝试以下方法: t='20180515102500' d=datetime.strptime(t, "%Y%m%d%H%M%S") millis_since_epoch = int(time.mktime(d.timetuple())) * 1000 print(millis

在repl.it(python 3.6.1)上给出:1526379900000 及 在我的本地计算机上:1526397900000(python 2.7.14)

为什么?? 将datetime对象转换为历元的推荐方法是什么?

尝试以下方法:

t='20180515102500'
d=datetime.strptime(t, "%Y%m%d%H%M%S")
millis_since_epoch = int(time.mktime(d.timetuple())) * 1000
print(millis_since_epoch)

如果有帮助,请告诉我

您的问题是您使用的是naive
datetime
(以及
struct_tm
等等)对象。因此,您要问的是,2018年5月15日10:25:00“无论本机上的本地时区是什么”与Unix时代有多远。如果您在两台时区相隔5小时的机器上运行它,您将得到相隔5*3600*1000毫秒的结果

建议的方法是:

t='20180515102500'
d=datetime.datetime.strptime(t, "%Y%m%d%H%M%S")
print(d)
epoch = datetime.datetime.utcfromtimestamp(0)


def unix_time_millis(dt):
  return (dt - epoch).total_seconds() * 1000

unix_time_millis(d)
…或:

d.timestamp() # returns difference from epoch as float seconds
(很明显,如何将其中一个转换为浮点毫秒或其他任何您需要的值。)

但这两个都不会有任何区别,因为您仍然在使用幼稚的datetime对象。(至少你没有从
时间
模块中混入其他类型,也没有丢掉精度,但你没有解决你的问题。)


你问题的解决取决于你想做什么。这些是UTC时间戳吗?它们是在你知道的带外已知时区的时间戳吗

如果一切都是UTC,最好的方法是显式地创建UTC对象,但最简单的方法是(特别是当您需要在2.7中运行代码时):

这将为您提供一个表示自该纪元起0 UTC秒的原始日期时间,并将其从表示自该纪元起X UTC秒的原始日期时间中减去,因此您将得到一个表示X秒(特别是17666天,37500秒)的
timedelta
,而不考虑系统使用的时区

或者,对现有代码的最小更改是使用
utctimetuple
而不是
timetuple
,它以更复杂的方式完成相同的事情。

在python 3.6中:

d - datetime.utcfromtimestamp(0)
例如:

datetime.timestamp()

你使用的是天真的日期时间。大概是
repl.it
在距离本地时区5小时的时区内运行,因此它的结果是5小时后的结果。如果你不想使用“这台机器上的任何本地时间”,你必须决定你想要什么。UTC?带有偏移量或时区的时间戳?无论如何,将datetime对象转换为与历元的偏移量的推荐方法是只对其调用
timestamp()
(如果需要毫秒而不是秒,则乘以1000),或者减去历元(作为
datetime
)并使用
timedelta
结果。但两者都不能解决你的问题;您将得到相同的结果。作为旁注,为什么要将
浮点值
转换为
int
,然后乘以1000?您真的想确保即使以毫秒为单位,也不会有亚秒精度吗?谢谢,我在python中“假设”datetime与java的LocalDateTime类似,它没有时区。是的,这些是UTC时间戳。@user1179299 Python有一个单独的类,用于朴素的本地、时区和UTC日期时间。你使用它的方式,他们是天真的本地人。但是,如果您希望它像Java的
LocalDateTime
,为什么您会惊讶于它像Java的
LocalDateTime
?LocalDateTime总是没有时区,另一方面python的DateTime可以支持不同的风格。我认为他们是一样的。你的回答有什么解释吗?
datetime.timestamp()
import datetime

timestamp = datetime.datetime.now().timestamp()
t = datetime.strptime(gr_dt_string, "%Y-%m-%dT%H:%M:%S")
if six.PY2:
    gr_mili = int((t - datetime.fromtimestamp(0)).total_seconds()) * 1000
else:
    gr_mili = int(t.timestamp() * 1000)