【问题标题】:python ISO 8601 date formatpython ISO 8601日期格式
【发布时间】:2016-03-06 19:36:30
【问题描述】:

我正在尝试像这样格式化日期,

2015-12-02T12:57:17+00:00

这是我的代码

time.strftime("%Y-%m-%dT%H:%M:%S%z", time.gmtime())

给出这个结果,

2015-12-02T12:57:17+0000

我看不到可以提供正确格式 +00:00 的 %z 的任何其他变体?解决这个问题的正确方法是什么?

【问题讨论】:

  • 使用 %z 的偏移量始终采用 +0000 的形式,在小时/分钟之间没有符号。这就是你所需要的吗?
  • 不,isoformat 不能解决它。并且 %z 是平台相关的。我认为您应该为 UTC 部分想出一个解析解决方案。
  • 是的,我需要做的就是包含“:”符号。所以自己自定义解析就是答案?
  • 不幸的是,没有默认字符串。只有 %z 与 UTC 一起使用,它总是返回相同的格式,而没有 : 介于两者之间
  • Wikipedia says +00:00+0000 都是正确且可接受的。

标签: python iso8601 strftime


【解决方案1】:

这对你有用:

Python - Convert UTC datetime string to local datetime

我复制了代码以使其更容易解决,我表明这是另一个人的答案。

from datetime import datetime,tzinfo,timedelta

class Zone(tzinfo):
    def __init__(self,offset,isdst,name):
        self.offset = offset
        self.isdst = isdst
        self.name = name
    def utcoffset(self, dt):
        return timedelta(hours=self.offset) + self.dst(dt)
    def dst(self, dt):
            return timedelta(hours=1) if self.isdst else timedelta(0)
    def tzname(self,dt):
         return self.name

GMT = Zone(0,False,'GMT')
EST = Zone(-5,False,'EST')

print datetime.utcnow().strftime('%m/%d/%Y %H:%M:%S %Z')
print datetime.now(GMT).strftime('%m/%d/%Y %H:%M:%S %Z')
print datetime.now(EST).strftime('%m/%d/%Y %H:%M:%S %Z')

t = datetime.strptime('2011-01-21 02:37:21','%Y-%m-%d %H:%M:%S')
t = t.replace(tzinfo=GMT)
print t
print t.astimezone(EST)

我已经在我的 Python Notebook 中尝试过,效果很好。

【讨论】:

    【解决方案2】:

    如果“%z”选项是平台相关的,那么之后添加: 怎么样?

    t_str = time.strftime("%Y-%m-%dT%H:%M:%S%z", time.gmtime())
    t_str = t_str if t_str[-3] == ':' else  t_str[:-2] + ':' + t_str[-2:]
    

    【讨论】:

    • 这很好,但在一台我的机器上它不起作用。我应该查看转换规则以确定原因,但它会产生以下结果:'2015-12-02T16:26:30Argentina Standard Ti:me'
    • 我有完全相同的“问题”(相同的操作系统,相同的输出),但由于用户只想添加一个“:”,所以我就这样离开了。
    【解决方案3】:

    我开发了这个功能:

    def iso_8601_format(dt):
        """YYYY-MM-DDThh:mm:ssTZD (1997-07-16T19:20:30-03:00)"""
    
        if dt is None:
            return ""
    
        fmt_datetime = dt.strftime('%Y-%m-%dT%H:%M:%S')
        tz = dt.utcoffset()
        if tz is None:
            fmt_timezone = "+00:00"
        else:
            fmt_timezone = str.format('{0:+06.2f}', float(tz.total_seconds() / 3600))
    
        return fmt_datetime + fmt_timezone
    

    【讨论】:

      【解决方案4】:

      在 dateutil [1] 和 pandas [2] 的帮助下

      import dateutil
      import pandas as pd
      
      any_date = '20180716'
      d = dateutil.parser(any_date)
      # d -> datetime.datetime(2018, 7, 16, 0, 0)
      
      d = dateutil.parser.isoparse('2018-07-16')
      # d -> datetime.datetime(2018, 7, 16, 0, 0)
      d = dateutil.parser.isoparse('20180716')
      # d -> datetime.datetime(2018, 7, 16, 0, 0)
      
      pd.to_datetime(d, utc=True)
      # -> Timestamp('2018-07-16 00:00:00+0000', tz='UTC')
      str(pd.to_datetime(d, utc=True))
      # -> '2018-07-16 00:00:00+00:00'  # almost, but it's missing a T
      
      # pandas can convert to UTC, so now we know its '+00:00Z'
      pd.to_datetime(d, utc=True).strftime('%Y-%m-%dT%H:%M:%S+00:00Z')
      # -> '2018-07-16T00:00:00+00:00Z'
      

      [1]https://dateutil.readthedocs.io/en/stable/_modules/dateutil/parser/isoparser.html

      [2]https://pandas.pydata.org/pandas-docs/stable/generated/pandas.to_datetime.html

      【讨论】:

        【解决方案5】:

        感谢isoformat,您可以欺骗它

        t = time.strftime("%Y-%m-%dT%H:%M:%S%z", time.gmtime())
        t
        '2021-06-02T09:28:34+0100'
        datetime.strptime(t, '%Y-%m-%dT%H:%M:%S%z').isoformat()
        '2021-06-02T09:28:34+01:00'
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-05-22
          • 1970-01-01
          • 2015-05-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2015-02-28
          • 2013-08-27
          相关资源
          最近更新 更多