目前我正在编写一个命令行程序,在那里我打印出日期。
我这样做datetime.datetime.strftime
:
import datetime
d = datetime.datetime(2012,12,12)
date_str = d.strftime(config.output_str)
其中config.output_str
是可由用户设置的格式字符串。
是否有一种方法来告诉多长时间字符串date_str
将在最大?
特别是如果使用像u'%d %B %Y'
这样的格式字符串,其中月份的长度(%B
)取决于用户的语言?
如果您没有使用locale
模块设置语言环境,则Python使用C语言环境,您可以预测生成的最大长度。所有字符串都是英文,并且每个格式字符的最大长度是已知的。
自己解析字符串,计算非格式字符并将格式字符映射到该字段的最大长度。
如果要使用locale
,则需要计算每种语言的最大长度。您可以通过循环月份、工作日和AM/PM并测量%a
、%A
、%b
、%B
、%c
、%p
、%x
和%X
格式的最大长度来自动化依赖于区域设置的字段。如果需要的话,我会在飞行中这样做。
其余的格式不因地区而异,并且有一个记录的最大长度(strptime
表中的示例是典型的,您可以依赖那些记录字段长度的格式)。
这里是我写的解决方案,对于那些感兴趣的人。
我使用给定的格式字符串format_str
来计算它可以得到多长时间。因此,我假设只有月和日可以很长。该函数循环遍历月份,看看哪个月份的形式最长,然后循环遍历前面找到的月份的天数。
import datetime
def max_date_len(format_str):
def date_len(date):
return len(date.strftime(format_str))
def find_max_index(lst):
return max(range(len(lst)), key=lst.__getitem__)
# run through all month and add 1 to the index since we need a month
# between 1 and 12
max_month = 1 + find_max_index([date_len(datetime.datetime(2012, month, 12, 12, 12)) for month in range(1, 13)])
# run throw all days of the week from day 10 to 16 since
# this covers all weekdays and double digit days
return max([date_len(datetime.datetime(2012, max_month, day, 12, 12)) for day in range(10, 17)])