我得到了一个格式为“2009-05-28T16:15:00”的日期时间字符串(我相信这是ISO 8601)。一个比较黑的选项似乎是使用时间来解析字符串。Strptime并将元组的前六个元素传递给datetime构造函数,例如:

datetime.datetime(*time.strptime("2007-03-04T21:08:12", "%Y-%m-%dT%H:%M:%S")[:6])

我还没有找到一种“更干净”的方式来做这件事。有吗?


当前回答

您应该密切关注时区信息,因为在比较不支持tz的日期时间和支持tz的日期时间时可能会遇到麻烦。

最好总是让它们具有tz-aware(即使只是作为UTC),除非您真的知道为什么这样做没有任何用处。

#-----------------------------------------------
import datetime
import pytz
import dateutil.parser
#-----------------------------------------------

utc = pytz.utc
BERLIN = pytz.timezone('Europe/Berlin')
#-----------------------------------------------

def to_iso8601(when=None, tz=BERLIN):
  if not when:
    when = datetime.datetime.now(tz)
  if not when.tzinfo:
    when = tz.localize(when)
  _when = when.strftime("%Y-%m-%dT%H:%M:%S.%f%z")
  return _when[:-8] + _when[-5:] # Remove microseconds
#-----------------------------------------------

def from_iso8601(when=None, tz=BERLIN):
  _when = dateutil.parser.parse(when)
  if not _when.tzinfo:
    _when = tz.localize(_when)
  return _when
#-----------------------------------------------

其他回答

由于Python 3.7并且没有外部库,您可以使用datetime模块中的fromisoformat函数:

datetime.datetime.fromisoformat('2019-01-04T16:41:24+02:00')

Python 2不支持%z格式说明符,所以如果可能的话,最好在所有地方显式使用Zulu时间:

datetime.datetime.strptime("2007-03-04T21:08:12Z", "%Y-%m-%dT%H:%M:%SZ")

我还没有尝试过,但是pyiso8601承诺支持这一点。

我更喜欢使用dateutil库进行时区处理和通常可靠的日期解析。如果您要得到一个ISO 8601字符串,例如:2010-05-08T23:41:54.000Z,那么使用strptime解析它会很有趣,特别是如果您事先不知道是否包含时区。pyiso8601有几个问题(检查他们的跟踪器),我在使用过程中遇到了,它已经几年没有更新了。相比之下,Dateutil一直很活跃,对我来说很有效:

from dateutil import parser
yourdate = parser.parse(datestring)

Isodate似乎有最完整的支持。

两种方法:

Epoch到ISO时间:

isoTime = time.strftime('%Y-%m-%dT%H:%M:%SZ', time.gmtime(epochTime))

ISO时间到纪元:

epochTime = time.mktime(time.strptime(isoTime, '%Y-%m-%dT%H:%M:%SZ'))