【问题标题】:Datetime to ISO 8601 with time included日期时间符合 ISO 8601,包括时间
【发布时间】:2018-03-25 01:49:07
【问题描述】:

datetime.isoformat() 返回 '2018-03-24T20:25:08.698812' 和 datetime.isocalendar() 返回 '(2018, 12, 6)'
但我需要的是 ISO 格式的日期和时间,还有像这样的 ISO 日历 '2018-12-06T20:25:08.698812'
如何获取 ISO 格式和 ISO 日历的日期时间?

d = datetime.datetime.now()
print(d.isoformat())
print(d.isocalendar())

【问题讨论】:

  • isocalendar?这与isoformat() 有何不同?
  • 我相信因为.isocalendar() 给出了 ISO 年份、周数和工作日@StephenRauch
  • isoformat 只是采用您提供的任何日期时间并将其格式化为 ISO 格式,但实际上并没有将其更改为 ISO 日历。另一方面,isocalender 确实将其更改为 ISO 日历,但它删除了时间
  • @BradSolomon 是这样的

标签: python datetime iso iso8601


【解决方案1】:

你可以构造如下格式:

代码:

def isocalendar_str(a_datetime):
    iso = a_datetime.isoformat()
    iso_cal = a_datetime.isocalendar()
    return "{:0>4}-{:0>2}-{:0>2}".format(*iso_cal) + iso[10:]

如果您使用的是 Python 3.5+,则可以通过以下方式进行一些简化:

def isocalendar_str(a_datetime):
    iso = a_datetime.isoformat()
    iso_cal = a_datetime.isocalendar()
    return "{:0>4}-{:0>2}-{:0>2}{}".format(*iso_cal, iso[10:])

有关新解包功能的详细信息,请参阅PEP 448

测试代码:

d = dt.datetime.now()
print(d.isoformat())
print(d.isocalendar())

print(isocalendar_str(dt.datetime.now()))

结果:

2018-03-24T19:03:05.097419
(2018, 12, 6)
2018-12-06T19:03:05.097419

【讨论】:

  • 不错!如何将 iso[10:] 包含在格式中? {:0>4}-{:0>2}-{:0>2}{}".format(*iso_cal,iso[10:])
  • @AntonvBR,我从那里开始,但这使它成为特定于 PY3 的,获得了相当小的收益。我将使用 PY3 only 选项更新答案。谢谢。
【解决方案2】:

这是从 A 到 B 的一种方式:

>>> import datetime
... 
... d = datetime.datetime.now()
... print(d)
... print(d.isoformat())
... print(d.isocalendar())
... 
... yr, weeknum, weekday = map(str, d.isocalendar())
... weeknum = '0' + weeknum if len(weeknum) == 1 else weeknum
... weekday = '0' + weekday
... '-'.join((yr, weeknum, weekday)) + d.isoformat()[10:]
... 
2018-03-24 22:01:33.781735
2018-03-24T22:01:33.781735
(2018, 12, 6)
'2018-12-06T22:01:33.781735'

功能上,

>>> def customiso(dt):
...     yr, weeknum, weekday = map(str, dt.isocalendar())
...     weeknum = '0' + weeknum if len(weeknum) == 1 else weeknum
...     weekday = '0' + weekday
...     return '-'.join((yr, weeknum, weekday)) + dt.isoformat()[10:]
... 

>>> customiso(d)
'2018-12-06T22:01:33.781735'

【讨论】:

  • 我在想已经为此构建了一些日期时间函数,但我想可能没有。你们俩都有非常快速和很好的答案!甚至不确定实际接受什么。谢谢!
  • 我认为你应该接受@StephenRauch's。我认为,他的答案中的 str 格式比我这里的格式更有效。
  • 但我不排除存在一些内置路由。我不知道超出表面水平的 ISO @Frobot
猜你喜欢
  • 2010-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-18
  • 2014-08-04
  • 2021-03-17
相关资源
最近更新 更多