python ISO 8601 日期格式
python ISO 8601 date format
我正在尝试像这样格式化日期,
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 的正确格式?正确的做法是什么?
这对你有用:
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 笔记本上试过了,效果很好。
如果“%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:]
我开发了这个功能:
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
在 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
多亏了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'
我正在尝试像这样格式化日期,
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 的正确格式?正确的做法是什么?
这对你有用:
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 笔记本上试过了,效果很好。
如果“%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:]
我开发了这个功能:
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
在 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
多亏了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'