使用strftime将python datetime转换为epoch

Noe*_*oel 193 python datetime utc strftime epoch

我有一段时间在UTC,从那里我想要自纪元以来的秒数.

我使用strftime将其转换为秒数.以2012年4月1日为例.

>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
Run Code Online (Sandbox Code Playgroud)

2012年4月1日UTC的纪元是1333238400但是这个上面返回1333234800,相差1小时.

所以看起来strftime正在考虑我的系统时间并在某个地方应用时区转换.我以为datetime纯粹是天真的?

我怎么能绕过那个?如果可能的话,避免导入其他库,除非标准.(我有可移植性问题).

jle*_*ahy 356

如果你想将python日期时间转换为epoch以来的秒数,你可以明确地做到:

>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0
Run Code Online (Sandbox Code Playgroud)

在Python 3.3+中你可以使用timestamp():

>>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0
Run Code Online (Sandbox Code Playgroud)

为什么你不应该使用 datetime.strftime('%s')

Python实际上不支持%s作为strftime的参数(如果你查看http://docs.python.org/library/datetime.html#strftime-and-strptime-behavior它不在列表中),那么唯一的它工作的原因是因为Python将信息传递给系统的strftime,它使用你的本地时区.

>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
Run Code Online (Sandbox Code Playgroud)

  • 不要使用`.strftime("%s")`:它不受支持,它不可移植,它可能会无意识地为一个有意识的日期时间对象产生错误的结果,如果输入是UTC,则它会失败(如问题中所示) )但当地时区不是UTC (51认同)
  • 我一直在疯狂地想弄清楚为什么我会看到strftime("%s")很多,但它不在文档中.谢谢你这个! (6认同)
  • @Michael这个函数是Python 2.7中的新功能,你必须使用旧版本.对于2.7之前的版本,您可以执行`td.seconds + td.days*24*3600`.这会丢弃微秒部分. (3认同)
  • @earthmeLon你的包围是错误的.Timedeltas(通过减去两个日期时间)具有total_seconds,但是datetime不具有. (2认同)
  • 这对我不起作用:`AttributeError:'datetime.timedelta'对象没有属性'total_seconds' (2认同)

Bor*_*jaX 99

我和Timezones等有严重的问题.Python处理所有碰巧相当令人困惑的方式(对我而言).事情似乎使用日历模块(参见链接被精细工作1,2,34).

>>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400
Run Code Online (Sandbox Code Playgroud)

  • +1因为它是唯一适用于问题输入的答案. (6认同)
  • 这是“有效的”,但请注意以下问题:“我有UTC时间”此方法将始终使用系统的本地时区。无法指定时区。如果本例中的“ aprilFirst”是一个“感知”实例,并且使用的时区与系统的时区不同,则结果将不正确(时区在“ timetuple()”调用中丢失)。为了获得正确的日期时间答案,您可以在最新的Python 3上使用“ awaredt.timestamp()”。对于Python 2来说,难度更大;一种方法是使用`arrow`库。`arrow.get(awaredt).timestamp`会正确处理。 (2认同)

sro*_*oss 33

import time
from datetime import datetime
now = datetime.now()

time.mktime(now.timetuple())
Run Code Online (Sandbox Code Playgroud)

  • 这是编写 `time.time()` 的错误方法(`mktime()` 可能在 DST 转换期间失败,而 `time.time()` 继续工作)。除非本地时区是 UTC(问题中的输入是 UTC),否则它不会回答问题。即使输入代表本地时间,如果不使用 tz 数据库,并且本地时区多年来可能具有不同的 utc 偏移量(例如欧洲/莫斯科),那么“mktime()”对于过去/未来的日期也可能会失败2010-2015 年——使用 UTC 时间(如问题中所示)或时区感知日期时间对象。 (2认同)

Cha*_*ger 15

import time
from datetime import datetime
now = datetime.now()

# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6
Run Code Online (Sandbox Code Playgroud)

(对不起,它不会让我对现有答案发表评论)


Mar*_*ter 7

如果您只需要 unix /epoch 时间的时间戳,则这一行有效:

created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
Run Code Online (Sandbox Code Playgroud)

并且只依赖datetime 于 python2 和 python3 中的作品