从Python中的epoch(unix time)开始,如何将datetime对象转换为毫秒?

Sup*_*ing 324 python datetime epoch

我有一个Python datetime对象,我想转换为unix时间,或自1970年代以来的秒/毫秒.

我该怎么做呢?

Sop*_*ert 443

在我看来,最简单的方法是

import datetime

epoch = datetime.datetime.utcfromtimestamp(0)

def unix_time_millis(dt):
    return (dt - epoch).total_seconds() * 1000.0
Run Code Online (Sandbox Code Playgroud)

  • 到目前为止,这是最好的解决方案(如果python版本> 2.7).因为'%s`的实现是依赖于操作系统的!因此,无论在哪个OS上,任何人都希望代码能够可靠地运行,不应该使用`%s`.对于2.3 <py ver <2.7.可以简单地构建一个`total_seconds()`,如下所示:`delta.days*86400 + delta.seconds + delta.microseconds/1e6` (32认同)
  • 为什么`datetime.utcfromtimestamp(0)`为什么返回没有tzinfo的日期时间?它就在方法名称中,**utc**fromtimestamp.为了使它不天真,我必须做一些像`datetime.utcfromtimestamp(0).replace(tzinfo = pytz.UTC)`.如果`dt`是时区感知的话,这是必要的,否则你会得到`TypeError:不能减去偏移 - 初始和偏移感知日期时间 (30认同)
  • 注意:`dt`必须是UTC(非本地).参见[Python 2.6/3支持的类似答案](http://stackoverflow.com/a/8778548/4279) (12认同)
  • 值得一提的是,如果你想要的只是这里定义的真正的unix时间戳http://en.wikipedia.org/wiki/Unix_time(因此只会使用这个答案中的unix_time函数)那么你应该包装delta.total_seconds( )使用int来避免以float结尾 (7认同)
  • amphibient:恢复您的编辑,因为文档声称utcfromtimestamp是datetime.datetime的类方法,repl似乎同意. (4认同)

esh*_*han 126

在Python 3.3中,添加新方法.

datetime.timestamp()
Run Code Online (Sandbox Code Playgroud)

https://docs.python.org/3.3/library/datetime.html#datetime.datetime.timestamp

  • 注意:`.timestamp()`方法假定一个天真的输入日期时间在本地时区(并且本地时间可能不明确).如果是UTC格式,则使用[`dt.replace(tzinfo = timezone.utc).timestamp()`而不是](http://stackoverflow.com/a/8778548/4279). (24认同)
  • datetime.timestamp()将epoch秒作为float返回.获得miliseconds:int(datetime.timestamp()*1000) (10认同)
  • 在https://docs.python.org/3/library/datetime.html#datetime.datetime.timestamp-这个非人类友好文档的精神中,这个答案不是一个可复制和粘贴的例子.是:`datetime.datetime.timestamp(datetime.datetime.now())` (8认同)
  • datetime.datetime.now()。timestamp()也可以工作 (2认同)
  • 在3.6(至少)中,datetime.timestamp()假定时区朴素(tzinfo = None)日期时间采用UTC。所以总是最好设置您的时区:`datetime.datetime.now(pytz.timezone('Europe / Paris'))。timestamp()== datetime.datetime.now(pytz.utc).timestamp()== datetime .datetime.utcnow()。timestamp()`,但(始终)不等于“ datetime.datetime.now()。timestamp()”(如果本地tz为UTC,则最后一个仅等于其余部分)。 ) (2认同)
  • 为了您的兴趣,相反的是]`fromtimestamp`\(https://docs.python.org/3/library/datetime.html#datetime.datetime.fromtimestamp) (2认同)

mik*_*iku 94

>>> import datetime
>>> # replace datetime.datetime.now() with your datetime object
>>> int(datetime.datetime.now().strftime("%s")) * 1000 
1312908481000
Run Code Online (Sandbox Code Playgroud)

或者时间模块的帮助(没有日期格式化):

>>> import datetime, time
>>> # replace datetime.datetime.now() with your datetime object
>>> time.mktime(datetime.datetime.now().timetuple()) * 1000
1312908681000.0
Run Code Online (Sandbox Code Playgroud)

http://pleac.sourceforge.net/pleac_python/datesandtimes.html的帮助下回答

文档:

  • 只有第二准确​​度 (22认同)
  • 顺便说一句,strftime("%s")为我返回一个空字符串.第二种方式很好. (5认同)
  • Python不支持'%s',例如,它可能在Windows上不存在.`.timetuple()`返回`tm_isdst = -1`它强制`mktime()`猜测.在DST期间可能猜错(50%的错误几率+/-小时).'%s'和`mktime()`都可能使用错误的utc偏移量来表示过去的日期.你需要一个历史时区db,比如`pytz`模块提供的,可以将本地时间可靠地转换为POSIX时间戳(除非OS已经提供了这样的db) (5认同)

wor*_*ins 14

您可以使用Delorean在空间和时间旅行!

import datetime
import delorean
dt = datetime.datetime.utcnow()
delorean.Delorean(dt, timezone="UTC").epoch
Run Code Online (Sandbox Code Playgroud)

http://delorean.readthedocs.org/en/latest/quickstart.html  


est*_*ani 13

我是这样做的:

from datetime import datetime
from time import mktime

dt = datetime.now()
sec_since_epoch = mktime(dt.timetuple()) + dt.microsecond/1000000.0

millis_since_epoch = sec_since_epoch * 1000
Run Code Online (Sandbox Code Playgroud)

  • @JFSebastian感谢您的注意!的确没有考虑。如果您的服务器是本地时间而不是UTC,则有所不同。我还没有发现(但是)任何其他有说服力的理由将服务器设置为UTC以外的任何其他方式。我的moto是“写UTC,阅读本地时间”,所以您始终知道自己要住的地方... (2认同)
  • 您始终可以使用calendar.timegm而不是mktime来避免mktime尝试猜测时区的问题. (2认同)

Ank*_*wal 13

来自模块Python 2.7文档的推荐time

在时间表示之间转换

  • 你误解了并且弄错了方法.在上述功能中,秒已经准备就绪.您可以将其转换为毫秒,但它将是一秒钟的精度. (5认同)
  • 仅适用于秒,而不是毫秒. (3认同)

cor*_*ord 7

from datetime import datetime
from calendar import timegm

# Note: if you pass in a naive dttm object it's assumed to already be in UTC
def unix_time(dttm=None):
    if dttm is None:
       dttm = datetime.utcnow()

    return timegm(dttm.utctimetuple())

print "Unix time now: %d" % unix_time()
print "Unix timestamp from an existing dttm: %d" % unix_time(datetime(2014, 12, 30, 12, 0))
Run Code Online (Sandbox Code Playgroud)