使用strftime将python日期时间转换为历元
我有一个UTC时间,我想从中得到自epoch以来的秒数 我正在使用strftime将其转换为秒数。以2012年4月1日为例使用strftime将python日期时间转换为历元,python,datetime,utc,epoch,strftime,Python,Datetime,Utc,Epoch,Strftime,我有一个UTC时间,我想从中得到自epoch以来的秒数 我正在使用strftime将其转换为秒数。以2012年4月1日为例 >>>datetime.datetime(2012,04,01,0,0).strftime('%s') '1333234800' 2012年4月1日,来自epoch的UTC为1333238400,但上面的返回值为1333324800,相差1小时 所以strftime似乎考虑了我的系统时间,并在某处应用了时区转换。我认为datetime是纯粹的天真 我怎样
>>>datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
2012年4月1日,来自epoch的UTC为1333238400,但上面的返回值为1333324800,相差1小时
所以strftime似乎考虑了我的系统时间,并在某处应用了时区转换。我认为datetime是纯粹的天真
我怎样才能避开这个问题?如果可能,避免导入其他库,除非是标准库。(我担心可移植性)。我在时区等方面遇到了严重问题。Python处理所有这些事情的方式(对我来说)相当混乱。使用calendar模块似乎一切正常(请参阅链接和)
如果要将python datetime转换为纪元后的秒数,可以显式执行:
>>> (datetime.datetime(2012,04,01,0,0) - datetime.datetime(1970,1,1)).total_seconds()
1333238400.0
在Python 3.3+中,您可以改为使用:
为什么不应使用
datetime.strftime(“%s”)
Python实际上不支持将%s作为strftime的参数(如果您检查它不在列表中),它工作的唯一原因是Python正在将信息传递给系统的strftime,它使用您的本地时区
>>> datetime.datetime(2012,04,01,0,0).strftime('%s')
'1333234800'
(很抱歉,我不想对现有答案发表评论)这在Python 2和3中适用:
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998
就在官方文件之后。。。
如果您在unix/epoch time中只需要一个时间戳,那么这一行可以工作:
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
并且仅取决于datetime
在python2和python3中使用python3.7
返回与以下格式之一的日期字符串相对应的日期时间
由date.isoformat()和datetime.isoformat()发出。明确地
此函数支持格式为的字符串
YYYY-MM-DD[*HH[:MM[:SS[.fff[fff]]][+HH:MM[:SS[.ffffff]]]],其中*
可以匹配任何单个字符
对于明确的时区独立解决方案,请使用pytz库
import datetime
import pytz
pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()
输出(float):1333238400.0我一直在疯狂地试图弄清楚为什么我经常看到strftime(“%s”),但它不在文档中。谢谢你,没什么!不要使用
.strftime(“%s”)
:它不受支持,不可移植,它可能会自动为aware datetime对象生成错误的结果,如果输入是UTC(如问题中所述)但本地时区不是UTC,则会失败UTC@earthmeLon你的括号错了。timedelta(减去两个datetimes)有总秒数,但datetimes没有。这对我不起作用:AttributeError:'datetime.timedelta'对象没有属性“总秒数”
@Michael该函数在Python 2.7中是新函数,您必须使用旧版本。对于2.7之前的版本,您可以执行td.seconds+td.days*24*3600
。这就丢弃了微秒部分。相关:我是唯一一个注意到在数字中使用八进制文字的人吗?相关较新的Python 3.3+有datetime.datetime.timestamp(datetime.datetime.utcnow())
对于相反的操作,请转到这里:这是因为time.mktime没有考虑微秒部分,对吗?正确。时间元组结构(基于C struct)没有微秒的空间,因此我们需要从datetime对象获取信息并将其添加到末尾。在我的机器上,即使我的时区是ET,它也能正常工作。这将根据系统的本地时间在不同的系统上为您提供不同的时间戳。+1因为它是唯一适用于问题中输入的答案。这是否可移植?这应该标记为正确答案,因为它回答了问题中的问题。vnice kudosThis‘有效’,但请注意问题:“我有一个UTC时间”此方法将始终使用系统的本地时区。无法指定时区。如果本例中的aprilFirst
是一个“aware”实例,并且使用了与系统时区不同的时区,则结果将不正确(时区在timetuple()
调用中丢失)。要获得“aware”datetime的正确答案,可以在最近的Python 3上使用awaredt.timestamp()。对于Python2来说更难;一种方法是使用箭头
库arrow.get(awaredt).timestamp
将正确地显示出来。这一点很好,@adamwillamson,但示例中的代码没有本地化datetime
对象,因此我假设“我有一个UTC时间”这意味着OP有一个不知道的datetime
对象,该对象被假定为UTC,他希望获得一个epoch
(如果datetime
碰巧知道这可能会改变事情)。另外,请记住,这个答案已经有将近8年的历史了,而且自(arrow
于2013年发布以来,已经发生了很多事情)写入time.time()
是一种不正确的方式(mktime()
可能在DST转换期间失败,而time()
继续工作)。除非本地时区是UTC(问题中的输入是UTC),否则它不会回答问题。即使输入代表本地时间,如果不使用tz数据库,并且如果本地时区多年来可能有不同的utc偏移量,例如2010-2015年的欧洲/莫斯科,则过去/未来日期的mktime()
也可能会失败,例如,使用utc时间(如问题中所述)或时区感知的datetime对象。如果你读了它;您理解为什么UTC输入(在问题中使用)比表示本地时间的原始datetime对象更可取1)这假设您现在要转换,而不是随机的datetime对象。2) 你不需要日历。time.mktime(randomDateTime.timetuple())+randomDateTime.微秒*1e-6@CharlesPlagertime.mktime不正确;它以本地时区解释参数,而OP希望以UTC解释时间(如calendar.timegm所做的)。如果您愿意,这是对我最准确的回答
import time
from datetime import datetime
now = datetime.now()
# same as above except keeps microseconds
time.mktime(now.timetuple()) + now.microsecond * 1e-6
>>> import time
>>> import calendar
>>> calendar.timegm(time.gmtime())
1504917998
created_timestamp = int((datetime.datetime.now() - datetime.datetime(1970,1,1)).total_seconds())
>>> created_timestamp
1522942073L
import datetime
import pytz
pytz.utc.localize(datetime.datetime(2012,4,1,0,0), is_dst=False).timestamp()