如何将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()
    时,返回的值不支持亚秒精度
  • %f
    用于微秒。解析时,它不必是完整的6位数字

dateutil是我发现的唯一一个正确处理时区偏移标识符(
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()