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

Python 如何用零替换datetime strftime缺少的部分?,python,datetime,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"
为了实现这一点,我使用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'
但是

而对于一个国家来说,预计将是:

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

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

正如您可能从中注意到的那样,如果datetime对象是幼稚的,即没有设置时区,则,%z和%z将生成一个空字符串

如果您总是希望它发出+0000的信号,即使您不知道时区,那么您需要将其视为UTC

所以设置一个默认值。如果时区未传递给您,请像您那样使用时区信息,即
tzinfo=datetime.timezone.utc
。在这种情况下,您将始终获得+0000

更新,回应评论

要意识到,当您在
format
开头的行中时,您已经提交了。此时的datetime已经是幼稚的或有意识的了,它很好地定义了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
使用
的构造将查看这些值是否为False(即False、0或空字符串),如果是,则适当地设置它们。请注意,在小时、分钟和秒的情况下,如果实际值为0,则将执行子句的
部分,因为
0
是错误的。这通常是一个逻辑错误(如果hour不是其他0,则通过执行类似于hour=hour的操作来解决),但在这种情况下,您可以将某个值设置为0,该值已经为0,因此可以

想想看,您可以将其作为一行代码附加到
格式
,但它很难看:

"{:%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))

我更愿意将默认值放在datetime的构造中,而不是放在格式化行中。

您可能已经从中注意到,如果datetime对象是幼稚的,即没有设置时区,则,%z和%z将生成空字符串

如果您总是希望它发出+0000的信号,即使您不知道时区,那么您需要将其视为UTC

所以设置一个默认值。如果时区未传递给您,请像您那样使用时区信息,即
tzinfo=datetime.timezone.utc
。在这种情况下,您将始终获得+0000

更新,回应评论

要意识到,当您在
format
开头的行中时,您已经提交了。此时的datetime已经是幼稚的或有意识的了,它很好地定义了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
使用
的构造将查看这些值是否为False(即False、0或空字符串),如果是,则适当地设置它们。请注意,在小时、分钟和秒的情况下,如果实际值为0,则将执行子句的
部分,因为
0
是错误的。这通常是一个逻辑错误(如果hour不是其他0,则通过执行类似于hour=hour的操作来解决),但在这种情况下,您可以将某个值设置为0,该值已经为0,因此可以

想想看,您可以将其作为一行代码附加到
格式
,但它很难看:

"{:%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))

我更愿意在datetime的构造中使用默认值,而不是在格式化行中使用默认值。

是否通过datetime时区感知来回答您的问题?是否通过datetime时区感知来回答您的问题?当然,这是一个直截了当的解决方案,但我希望有一行,格式类似
a=None;“{}”.format(a或“Default!”)
当然这是一个直截了当的解决方案,但我希望有一行,比如format
a=None;“{}”。格式(a或“默认!”)