Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/282.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用strftime将python日期时间转换为历元_Python_Datetime_Utc_Epoch_Strftime - Fatal编程技术网

使用strftime将python日期时间转换为历元

使用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是纯粹的天真 我怎样

我有一个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是纯粹的天真


我怎样才能避开这个问题?如果可能,避免导入其他库,除非是标准库。(我担心可移植性)。

我在时区等方面遇到了严重问题。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()