【问题标题】:What is the Python equivalent of Javascript's `Date.prototype.toISOString`?Javascript 的 `Date.prototype.toISOString` 的 Python 等价物是什么?
【发布时间】:2014-07-24 00:45:24
【问题描述】:

在 Javascript 中,Date.prototype.toISOString 给出一个 ISO 8601 UTC 日期时间字符串:

new Date().toISOString()
// "2014-07-24T00:19:37.439Z"

是否有行为与 Javascript 匹配的 Python 函数?


尝试:

Python 的datetime.datetime.isoformat 类似,但不完全相同:

datetime.datetime.now().isoformat()
// '2014-07-24T00:19:37.439728'

使用 pytz 我至少可以明确 UTC:

pytz.utc.localize(datetime.now()).isoformat())
// '2014-07-24T00:19:37.439728+00:00'

【问题讨论】:

  • 不,Python 没有内置函数来做你想做的事,你必须自己写,或者使用像 DateTime 这样的东西,这绝对是你想要的做。 (向下滚动到 ISO8601 和 HTML4 方法)。确实,下面提供的两个答案正是您想要做的,只需更改时区即可。
  • ^ 这应该是一个答案,+1

标签: python iso8601


【解决方案1】:

您可以使用此代码:

import datetime
now = datetime.datetime.now()
iso_time = now.strftime("%Y-%m-%dT%H:%M:%SZ") 

【讨论】:

  • 所以,这适用于 datetime.now() 的特定情况,但这种方法不适用于时区感知日期时间,对吧?
【解决方案2】:

我尝试将字符串格式化为它在 javascript 输出中的格式。

from datetime import datetime

def iso_format(dt):
    try:
        utc = dt + dt.utcoffset()
    except TypeError as e:
        utc = dt
    isostring = datetime.strftime(utc, '%Y-%m-%dT%H:%M:%S.{0}Z')
    return isostring.format(int(round(utc.microsecond/1000.0)))

print iso_format(datetime.now())
#"2014-07-24T00:19:37.439Z"

【讨论】:

  • 这与其他答案一样,取决于没有附加时区信息的日期时间。我正在寻找更通用的东西。
  • 考虑到时区感知 datetime 对象,函数中的第一条语句可以是 ````utc = dt + dt.utcoffset(). Then subsequent statements would operate on utc``` 而不是 @ 987654324@.
  • 这个解决方案在这个字符串中给了我一个文字.{0}Z。为了保持与 Javascript 的 toISOString 的兼容性,如果 python datetimes 不给出毫秒精度,这个输出 .000Z 不应该吗?
【解决方案3】:

在 Python 3.6+ 中使用 f 字符串

from datetime import datetime

f'{datetime.now():%Y-%m-%dT%H:%M:%SZ}'

【讨论】:

    【解决方案4】:

    是否有行为与 Javascript 匹配的 Python 函数?

    不在标准库中,但您可以构建自己的。

    【讨论】:

      【解决方案5】:
      # Used dateutil package from https://pypi.org/project/python-dateutil/
      import datetime
      import dateutil.tz
      
      def iso_format(dt):
          try:
              utc_dt = dt.astimezone(dateutil.tz.tzutc())
          except ValueError:
              utc_dt = dt
          ms = "{:.3f}".format(utc_dt.microsecond / 1000000.0)[2:5]
          return datetime.datetime.strftime(utc_dt, '%Y-%m-%dT%H:%M:%S.{0}Z'.format(ms))
      

      【讨论】:

        【解决方案6】:

        这是为我做的,只是使用 python 的标准库:

        from datetime import datetime, timezone
        
        def isoformat_js(dt: datetime):
            return (
                dt.astimezone(timezone.utc)
                .isoformat(timespec="milliseconds")
                .replace("+00:00", "Z")
            )
        
        
        
        isoformat_js(datetime(2014, 7, 24, 0, 19, 37, 439000))
        # => '2014-07-24T00:19:37.439Z'
        

        【讨论】:

          猜你喜欢
          • 2018-12-08
          • 1970-01-01
          • 1970-01-01
          • 2011-09-03
          • 2011-03-07
          • 2017-12-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多