Python ISO 8601日期格式

9
我正在尝试将日期格式化为以下形式:2015-12-02T12:57:17+00:00。这是我的代码:
time.strftime("%Y-%m-%dT%H:%M:%S%z", time.gmtime())

这将得到以下结果:

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

我看不到其他任何%z的变化可以提供+00:00的正确格式?该怎么做才是正确的方式?


1
使用%z得到的偏移量始终以+0000的形式呈现,没有小时/分钟之间的符号。这是你需要的全部吗? - Maximiliano Rios
不,isoformat不能解决这个问题。而且%z是平台相关的。我认为你应该想出一个解析UTC部分的解决方案。 - Maximiliano Rios
1
很遗憾,这方面没有默认字符串。只有%z适用于UTC,并且它总是返回相同的格式,中间没有冒号。 - Maximiliano Rios
维基百科表示,+00:00+0000都是正确且可接受的。 - jwodder
是的,它们是可以接受的,但我认为用户出于某种原因正在尝试获取特定格式。这种表示方式肯定是可以接受的。 - Maximiliano Rios
显示剩余2条评论
6个回答

2

对于那些想要匹配datetime的ISO 8601兼容的isoformat的人:

from datetime import datetime

now = datetime.now()
isoformat = now.isoformat()
diy_isoformat = now.strftime("%Y-%m-%dT%H:%M:%S.%f")
assert isoformat == diy_isoformat
print(isoformat)

将会打印:

2022-06-17T15:33:08.893344

2

以下内容可能对您有帮助:

Python - 将UTC日期时间字符串转换为本地日期时间

我复制了代码以便更容易处理,无论如何我指出这是另一个人的答案。

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笔记本上尝试过,完美运行。


1
如果"%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:30阿根廷标准时间' - Maximiliano Rios
我有完全相同的“问题”(相同的操作系统,相同的输出),但由于用户只想添加一个“:”,所以我就保留了它。 - tglaria

0

你可以通过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'

0

在 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

[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


-1

我已经开发了这个函数:

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接