如何获得datetime.strftime的最大长度?

时间:2014-05-15 07:21:14

标签: python datetime

目前我正在开发命令行程序,并在那里打印出日期。

我使用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)取决于用户的语言?

2 个答案:

答案 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)])