如何将python时间戳字符串转换为历元?
我有以下字符串:如何将python时间戳字符串转换为历元?,python,datetime,timestamp,epoch,Python,Datetime,Timestamp,Epoch,我有以下字符串: mytime = "2009-03-08T00:27:31.807Z" 如何在python中将其转换为epoch 我试过: import time p = '%Y-%m-%dT%H:%M:%S' int(time.mktime(time.strptime(s, p))) 但是它不适用于31.807Z格式字符串中缺少的%fZ p = '%Y-%m-%dT%H:%M:%S.%fZ' 转换为历元的正确方法是使用datetime: from datetime import dat
mytime = "2009-03-08T00:27:31.807Z"
如何在python中将其转换为epoch
我试过:
import time
p = '%Y-%m-%dT%H:%M:%S'
int(time.mktime(time.strptime(s, p)))
但是它不适用于
31.807Z
格式字符串中缺少的%fZ
p = '%Y-%m-%dT%H:%M:%S.%fZ'
转换为历元的正确方法是使用datetime
:
from datetime import datetime
p = '%Y-%m-%dT%H:%M:%S.%fZ'
mytime = "2009-03-08T00:27:31.807Z"
epoch = datetime(1970, 1, 1)
print((datetime.strptime(mytime, p) - epoch).total_seconds())
from datetime import datetime
datetime.strptime("2009-03-08T00:27:31.807Z", '%Y-%m-%dT%H:%M:%S.%f%z')
>>> datetime.datetime(2009, 3, 8, 0, 27, 31, 807000, tzinfo=datetime.timezone.utc)
如果要忽略分数,请调用int。代码:
import datetime
epoch = datetime.datetime(1970, 1, 1)
mytime = "2009-03-08T00:27:31.807Z"
myformat = "%Y-%m-%dT%H:%M:%S.%fZ"
mydt = datetime.datetime.strptime(mytime, myformat)
val = (mydt - epoch).total_seconds()
print(val)
> 1236472051.81
repr(val)
> '1236472051.807'
注:
- 使用
时,返回的值不支持亚秒精度time.strtime()
用于微秒。解析时,它不必是完整的6位数字%f
Z
)的库
然后
分为两部分:
#!/usr/bin/env python
import time
from calendar import timegm
utc_time = time.strptime("2009-03-08T00:27:31.807Z", "%Y-%m-%dT%H:%M:%S.%fZ")
epoch_time = timegm(utc_time)
# -> 1236472051
要支持与闰秒对应的时间戳,例如
Wed July 1 2:59:60 MSK 2015
,您可以。Python 3.7+所讨论的字符串格式可以通过strptime
解析:
from datetime import datetime
p = '%Y-%m-%dT%H:%M:%S.%fZ'
mytime = "2009-03-08T00:27:31.807Z"
epoch = datetime(1970, 1, 1)
print((datetime.strptime(mytime, p) - epoch).total_seconds())
from datetime import datetime
datetime.strptime("2009-03-08T00:27:31.807Z", '%Y-%m-%dT%H:%M:%S.%f%z')
>>> datetime.datetime(2009, 3, 8, 0, 27, 31, 807000, tzinfo=datetime.timezone.utc)
另一个使用内置的datetime.fromsoformat()
:正如@jfs链接的线程中提到的,fromsoformat()
不会将“Z”字符解析为UTC,尽管这是定义的一部分。一个小的工作可以使它工作-有些人会认为这个讨厌,但毕竟是。
from datetime import datetime
mytime = "2009-03-08T00:27:31.807Z"
datetime.fromisoformat(mytime.replace("Z", "+00:00")).timestamp()
>>> 1236472051.807
这段代码在Python3.6中用于将日期时间字符串转换为UTC或本地时区的历元
from datetime import datetime, timedelta
from dateutil.tz import tzutc, tzlocal
mydate = '2020-09-25'
mytime = '06:00:00'
epoch1970 = datetime(1970, 1, 1, 0, 0, 0, tzinfo=tzutc())
myepochutc = int((datetime.strptime(mydate + ' ' + mytime, "%Y-%m-%d %H:%M:%S").replace(tzinfo=tzutc()) - epoch1970).total_seconds()*1000)
myepochlocal = int((datetime.strptime(mydate + ' ' + mytime, "%Y-%m-%d %H:%M:%S").replace(tzinfo=tzlocal()) - epoch1970).total_seconds()*1000)
#epoch will be in milliseconds
print(myepochutc) #if mydate/mytime was in utc
print(myepochlocal) #if mydate/mytime was in local timezone
dateutil
最近被添加回python包中,它是一个简单的单行程序,可以自己处理格式化
from dateutil import parser
strtime = '2009-03-08T00:27:31.807Z'
epoch = parser.parse(strtime).timestamp()
您是如何使用%S获取类似于
.807Z
?%S以小数形式显示number@JoranBeasley. 在我无限的智慧中,我预测它总是以Z
结束,我想你可以总是忽略Z
,而rstrip(“Z”)不使用UTC时间的time.mktime()
!以下是可能的终端字符。。。。大多数事情通常都是Z,但这封信的意思是,这抛弃了:/仍然是粗糙的可靠答案:)@J.F.Sebastian,是的,当你对joran的答案发表评论时,我读了这篇文章。我投了反对票,并留下了关于mktime()
的评论。“OP在问题中使用了坏代码”并不是将其放在答案中的有效借口。就我个人而言,我添加了一些类似于#XXX的错误,如果我必须包含损坏的代码,请不要在代码片段的顶部使用
。仅将有效答案放在底部某个位置是不够的。这可能是一个更可靠的解决方案。@PadraicCunningham:如果要拒绝使用错误格式的时间戳,那么它就不那么可靠了dateutil
可能接受太多。使用dateutil
来接受太多了。在Python2和Python3中,只能使用stdlib解析时间字符串timegm()
如果你不在乎几分之一秒就可以了。如果你不想丢失终端字母@JoranBeasley传递的信息就不行了:唯一允许的字母是Z。读。如果你得到“2009-03-08T00:27:31.807A”或任何祖鲁时间偏移怎么办?但是对于区域设置感知时间转换+1:)@JoranBeasley在实践中,RFC3339可以工作,除非您有一些特殊要求Z
是唯一允许的与字母相关的答案:只有没有上下文和额外文本的答案才不是最好的答案。您基本上是要求OP复制并粘贴您的答案,而不知道代码的作用。请提供解释。非常感谢。
from dateutil import parser
strtime = '2009-03-08T00:27:31.807Z'
epoch = parser.parse(strtime).timestamp()