如何用零替换datetime strftime的缺失部分?

时间:2016-11-10 14:52:29

标签: python datetime

我收到日期对象,需要根据格式将它们变成字符串:

"%a %b %d %H:%M:%S %z %Y"

为了达到这个目的,我使用了Python的datetime.strftime方法。问题是,有时这些日期对象没有所有这些数据,例如,我可以同时拥有这两个:

a = datetime.date(1999, 1, 2)
b = datetime.datetime(2015, 10, 1, 9, 38, 50, 920000, tzinfo=datetime.timezone.utc)

尝试使用字符串格式方法:

"{:%a %b %d %H:%M:%S %z %Y}".format(a)

但是如果没有设置时区,那么它就会被删除,所以:

"{:%a %b %d %H:%M:%S %z %Y}".format(b)
'Thu Oct 01 09:38:50 +0000 2015'

但是

"{:%a %b %d %H:%M:%S %z %Y}".format(a)
'Sat Jan 02 00:00:00  1999'

虽然预计会是:

'Sat Jan 02 00:00:00 +0000 1999'

是否有可能以某种方式用零填充时区?

1 个答案:

答案 0 :(得分:0)

正如您可能从strftime documentation注意到的那样,如果日期时间对象是天真的,则%z和%Z将产生一个空字符串,即如果它没有设置时区。< / p>

如果您总是希望它发出+0000,即使您不知道时区,您想要的是将其视为UTC。

所以设置默认值。如果时区未传递给您,请使用您所做的时区信息,即tzinfo = datetime.timezone.utc。在这种情况下,你总会获得+0000。

更新,以回复评论

要意识到,当您在format开始的时候,您已经提交了。您在此时的日期时间已经很幼稚或清醒,并且很好地定义了strftime在任何一种情况下的表现。设置默认值时,您可能不应该在格式点进行,而是在构建日期时间。

我无法在不看到更多代码的情况下提供进一步的具体帮助,但您显然有一些区别于a和b的数据,因此您必须知道您是否拥有tzinfo。我要做一个例子,所以我可以告诉你在哪里放置默认值:

for it in magic_iterator:
   (year, month, day, hour, minute, second, microsecond, timezone) = it.get_data()
   # note, some of these can be None.  Set defaults:
   hour = hour or 0
   minute = minute or 0
   second = second or 0
   timezone = timezone or datetime.tzinfo.utc

   foo = datetime(year, month, day, hour, minute, second, microsecond, timezone)
   # do something with foo

具有or的此构造将查看这些值是否为falsey(即False,0或空字符串),如果是,则适当地设置它们。请注意,在小时,分钟和秒的情况下,如果实际值为0,则子句的or部分将执行,因为0是假的。这通常是一个逻辑错误(通过执行类似hour = hour if hour is not None else 0的操作来解决),但在这种情况下,您将设置为0已经为0,这样就可以了。< / p>

想一想,你可以把它作为一个附加在format上的衬里来做,但它很难看:

"{:%a %b %d %H:%M:%S %z %Y}".format(a if a.tzinfo else datetime(a.year, a.month, a.day, a.hour, a.minute, a.second, a.microsecond, datetime.tzinfo.utc))

我更倾向于将默认值设置为日期时间而不是格式化行。