【问题标题】:datetime objects format日期时间对象格式
【发布时间】:2012-07-23 03:39:46
【问题描述】:

我正在尝试使用日期时间对象,包括 datetime.monthdatetime.daydatetime.hour

问题是这些对象(比如datetime.month)将值作为 1、2、3 等到 12。相反,我需要这些格式为 01、02、03 等到 12。有几天和几个月的类似问题。

如何切换到这种格式?


我意识到这不是一个非常明确的问题:

我正在使用字符串格式来打印带有时间戳的字典中的值。

所以,表达式大致是:

print "%s-%s-%s"%(date.year, date.month, date.day, etc., len(str) )

我的值最初采用正确的"%Y-%m-%d 形式(例如2000-01-01)。使用上述内容,我得到 2000-1-1。

【问题讨论】:

  • 你会发现08在python中并不是一个值。如果要打印它们,请使用 strftime,而不是单个属性。
  • Python 中的值不包含格式。打印出来或转成字符串时需要指定格式。
  • @MarkRansom 见上文,如果我对这些对象使用字符串格式,则它们被定义为(带月份)为 1 到 12(含)。
  • @ehertele 查看我的回答。您刚刚发布的代码甚至不会运行,因此当您说“我的值最初采用正确的形式”时,您的意思有点不清楚。你做了什么改变,破坏了它?
  • @RicardoAltamirano 我的意思是,使用带有 %s 和对象 datetime 对象的字符串格式会为您提供奇异值(如 1 到 12),因为这就是它们的定义方式。我的代码自然不会运行,因为它不是实际代码。不过感谢您的帮助。

标签: python


【解决方案1】:

您可以使用字符串格式打印单个属性:

print ('%02d' % (mydate.month))

或更新的字符串格式(在 python 2.6 中引入):

print ('{0:02d}'.format(a.month))  # python 2.7+ -- '{:02d}' will work

注意,偶数:

print ('{0:%m}'.format(a))  # python 2.7+ -- '{:%m}' will work.

会起作用的。

或者使用日期时间对象的strftime 方法:

print (mydate.strftime('%m'))

为了完整起见:

print (mydate.strftime('%Y-%m-%d')) 

将很好地替换您编辑中的代码。

【讨论】:

  • +1 表示strftime,但在您的第一个示例中,我认为str.format 优于% 运算符?
  • @RicardoAltamirano -- 是的,我仍然经常使用 C,所以每次我想使用它时,我仍然需要重新学习 .format。我已经更新了。
  • 不用担心;我只是想确定一下,因为我总是使用str.format 代替%。我正准备在我的答案中添加strftime,但由于您的答案已经很好地涵盖了,我只是想澄清这一点并将您的答案作为主要答案。
  • @RicardoAltamirano -- 在阅读文档时,我了解到'{:%m}'.format(mydate) 也可以。很整洁。
  • 使用%02d 而不是&s 正是我想要的。谢谢。 (对不起,上面说得这么不清楚,也没用……对我来说是麻布和灰烬)
【解决方案2】:

您可以将它们转换为字符串并简单地填充它们:

import datetime

d = datetime.datetime(2012, 5, 25)

m = str(d.month).rjust(2, '0')
print(m) # Outputs "05"

或者你可以只是一个str.format

import datetime

d = datetime.datetime(2012, 5, 25)

print("{:0>2}".format(d.month))

编辑:要回答更新后的问题,您尝试过吗?

import datetime
d = datetime.datetime(2012, 5, 25)
print("{:0>4}-{:0>2}-{:0>2}".format(d.year, d.month, d.day))

您说您最初使用字符串格式打印它们,那么您做了什么更改?这段代码:

print "%s-%s-%s"%(date.year, date.month, date.day, etc., len(str) )

真的没有任何意义,因为我有点不清楚你传递的参数是什么。我假设只是date.yeardate.monthdate.day,但目前还不清楚。您对len(str) 执行什么操作?

【讨论】:

  • 似乎很难做到,但因为它确实有效,你会从我那里得到一个令牌 +1。
  • @MarkRansom 确实,这有点困难,但由于我注意到strftime 在我发布之前已经被覆盖,我想我会覆盖那些没有的。
【解决方案3】:

zfill 更容易记住:

In [19]: str(dt.month).zfill(2)
Out[19]: '07'

【讨论】:

    猜你喜欢
    • 2012-09-24
    • 1970-01-01
    • 2019-10-04
    • 2017-03-08
    • 2011-08-12
    • 2020-04-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多