我收到日期对象,需要根据格式将它们变成字符串:
"%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'
是否有可能以某种方式用零填充时区?
答案 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))
我更倾向于将默认值设置为日期时间而不是格式化行。