目前我正在开发命令行程序,并在那里打印出日期。
我使用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
)取决于用户的语言?
答案 0 :(得分:4)
如果您没有使用locale
模块设置语言环境,那么Python使用C语言环境,您可以预测生成的最大长度。所有字符串都是英文的,每个格式字符的最大长度是已知的。
自己解析字符串,将非格式字符和地图格式字符计算到该字段的最大长度。
如果 使用locale
,您需要计算每种语言的最大长度。您可以通过循环数月,工作日和上午/下午并测量%a
,%A
,%b
,%B
的最大长度来自动化与语言环境相关的字段,%c
,%p
,%x
和%X
格式。我会根据需要随时做这件事。
其余格式不会因区域设置而异,并且记录的最大长度(strptime
table中的示例是典型的,您可以依赖那些记录字段长度的示例)。
答案 1 :(得分:0)
这是我为解决这个问题而写的解决方案,对于那些感兴趣的人。
我使用给定的格式字符串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)])