Convert python datetime to epoch with strftime
我有一个以UTC为单位的时间,从这个时间开始我要用从epoch开始的秒数。
我正在使用strftime将其转换为秒数。以2012年4月1日为例。
1 2
| >>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800' |
2012年4月1日,来自epoch的UTC是1333238400,但上面返回的是1333234800,这与1小时不同。
所以看起来strftime考虑了我的系统时间,并在某处应用了时区转换。我以为datetime纯粹是幼稚的?
我怎么能避开那个?如果可能,避免导入其他库,除非标准。(我有可移植性问题)。
- 相关:在python中将datetime.date转换为UTC时间戳
- 我是唯一一个注意到在数字中使用八进制文字的人吗?
- 相关的python问题:datetime.strftime("%s")应遵守tzinfo
- 更新的python 3.3+有datetime.datetime.timestamp(datetime.datetime.utcnow())
如果要将Python日期时间转换为自epoch以来的秒数,可以显式执行此操作:
1 2
| >>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0 |
号
在python 3.3+中,您可以使用timestamp():
1 2
| >>> datetime.datetime(2012,4,1,0,0).timestamp()
1333234800.0 |
为什么不使用EDOCX1[1]
python实际上不支持将%s作为strftime的参数(如果您查看http://docs.python.org/library/datetime.html strftime和strptime行为,它不在列表中),它工作的唯一原因是python将信息传递给系统的strftime,而strftime使用您的本地时区。
1 2
| >>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800' |
。
- 我疯狂地想弄明白为什么我经常看到strftime("%s"),但它不在文档中。谢谢你没什么,这个!
- 不要使用.strftime("%s"):它不受支持,它不可移植,它可能会为一个已知的日期时间对象静默地产生错误的结果,如果输入是在UTC中(如问题所示),它会失败,但本地时区不是UTC
- 在这种情况下,它为什么会失败?我和MkTime也有类似的问题。
- attributeError:"datetime.datetime"对象没有"total_seconds"属性
- @瓜子你的支架是错的。TimeDelta(减去两个日期时间)有总的秒数,但日期时间没有。
- 这比time.mktime方法快3倍。)
- 这对我不起作用:AttributeError: 'datetime.timedelta' object has no attribute 'total_seconds'。
- @michael这个函数在python 2.7中是新的,您必须使用旧版本。对于2.7之前的版本,可以执行td.seconds + td.days*24*3600。这将丢弃微秒部分。
- @托马索巴布格里:如果答案是错误的,不管它有多快。
- @J.F.Sebastian也许答案有点过于简单了,但是如果加上TZ处理呢?这对我来说很好,但是不能说太多关于可移植性的问题…
- @Tommasobarbugli:我是说mktime(utc_dt)是错误的,除非当地时间是UTC。第二个示例(utc_dt - epoch).total_seconds()是正确的(在浮点精度范围内)。不需要TZ处理。结果不是1970年以来经过的秒数(由于闰秒),而是正确的posix时间戳("从epoch开始的秒数")。
- 如何以毫秒为单位超越时代,当然我可以乘以1000,但是否有任何功能使strftime直接以毫秒为单位返回时代。
- @你只要把它乘以1000
- 在我看来,做这种手工减法运算是一种反模式。- 1
- 不适用于Windows7、python 2.7.12,错误:invalid format string。
- %s不是正确的格式化方式。你应该一直使用.timestamp()。通过艰苦的学习:(
- 要使用此方法在cywin上获取本地epoch,需要执行以下操作:(datetime.utcnow()-datetime(1970,1,1)).total_seconds()。是的,UTCNow使它成为当地的纪元!!)如果没有它,你会在Cygwin上得到一个奇怪的时区!
我对时区等有严重的问题。python处理所有这些事情的方式(对我来说)非常混乱。使用日历模块似乎一切正常(请参阅链接1、2、3和4)。
1 2 3 4 5
| >>> import datetime
>>> import calendar
>>> aprilFirst=datetime.datetime(2012, 04, 01, 0, 0)
>>> calendar.timegm(aprilFirst.timetuple())
1333238400 |
- +1因为它是问题输入的唯一答案。
- 这是便携式的吗?
- 应该是的,是的
- 这应该被标记为正确的答案,因为这回答了问题所在。Vnice荣誉
- 这个"有效",但请注意问题说明:"我有一个UTC时间",这个方法将始终使用系统的本地时区。无法指定时区。如果本例中的aprilFirst是一个‘aware’实例,并且使用了与系统时区不同的时区,则结果将不正确(该时区在timetuple()调用中丢失)。要获得"感知"日期时间的正确答案,可以在最近的python 3上使用awaredt.timestamp()。对于python 2来说,它更困难;一种方法是使用arrow库。arrow.get(awaredt).timestamp会把它弄好的。
- 很好,@adamwilliamson,但是示例中的代码并没有本地化datetime对象,所以我假设"我在UTC中有时间"意味着操作人员有一个不知道的datetime对象,假设该对象是在UTC中,他希望得到epoch(如果datetime碰巧意识到这可能确实会改变铰链)。另外,请记住,这个答案已经有8年的历史了,从那以后发生了很多事情(例如,arrow于2013年发布)。
1 2 3 4 5
| import time
from datetime import datetime
now = datetime.now()
time.mktime(now.timetuple()) |
- 写入time.time()的方法不正确(mktime()可能在DST转换期间失败,而time.time()继续工作)。除非本地时区是UTC(输入的是UTC),否则它不会回答这个问题。即使输入代表一个本地时间,如果不使用TZ数据库,并且本地时区在过去/未来几年中可能有不同的UTC偏移量,例如2010-2015年的欧洲/莫斯科,那么mktime()也可能在过去/未来的日期中失败,而是使用UTC时间(如问题所示)或时区感知的日期时间对象。
- 这里还有更多关于将本地时间(如.now()返回)转换为epoch时间戳(由mktime()返回)的问题。如果你读了它,你就会明白为什么UTC输入(在问题中使用)比一个简单的表示本地时间的datetime对象更可取。
1 2 3 4 5 6
| import time
from datetime import datetime
now = datetime.now()
# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6 |
。
(抱歉,我不想对现有答案发表评论)
- 这是因为time.mktime不考虑微秒部分,对吗?
- 对的。时间tuple结构(基于c strut)在微秒内没有空间,因此我们需要从datetime对象中获取信息并将其添加到末尾。
- 除非本地时区是UTC,否则它不会回答问题。
- 在我的机器上,即使我的时区是ET,这也能正常工作。
- 这将根据系统的本地时间,在不同的系统上为您提供不同的时间戳。
如果您只需要在unix/epoch时间中使用时间戳,那么这一行可以工作:
1 2 3
| created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L |
而且只取决于datetime。在python2和python3中工作
这在python 2和3中有效:
1 2 3 4
| >>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998 |
。
只是按照官方文件……https://docs.python.org/2/library/time.html模块时间
- 1)这假定您现在要转换,而不是一个随机的日期时间对象。2)你不需要日历。time.mktime(randomtime.timetuple())+randomtime.microsecond*1e-6
- @charlesplager time.mktime不正确;它解释本地时区中的参数,而op希望用UTC解释时间(如calendar.timegm所做)。
- 这是对我最准确的回答,如果你想用格林威治标准时间转换你的时间,并且你想在转换为纪元时间戳时保持这种方式。
- 按照你的答案,calendar.timegm(datetime.strptime("2019-05-03t05:40:09.77049‌&误8203;4+00:00"[:16],"%y-%m-%dt%h:%m').timetuple())我有UTC格式的时间戳,不管你在哪个系统上运行都会给我正确的时间戳,诀窍是使用strptime.timetumple
对于显式的时区无关的解决方案,请使用pytz库。
1 2 3 4
| import datetime
import pytz
pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp() |
。
输出(浮动):1333238400.0
在python 3.7中
Return a datetime corresponding to a date_string in one of the formats
emitted by date.isoformat() and datetime.isoformat(). Specifically,
this function supports strings in the format(s)
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]]][+HH:MM[:SS[.ffffff]]]], where *
can match any single character.
号
https://docs.python.org/3/library/datetime.html datetime.datetime.fromisoformat