Это немного громоздко, но работает (по крайней мере, в стабильных версиях Python):
>>> ts = datetime.datetime(1895, 10, 6, 16, 4, 5)
>>> '{0.year}-{0.month:{1}}-{0.day:{1}} {0.hour:{1}}:{0.minute:{1}}'.format(ts, '02')
'1895-10-06 16:04'
обратите внимание, что str
будет по-прежнему производить читаемую строку:
>>> str(ts)
'1895-10-06 16:04:05'
редактировать
Ближайший возможный способ эмулировать поведение по умолчанию - жестко закодировать словарь, например:
>>> d = {'%Y': '{0.year}', '%m': '{0.month:02}'} # need to include all the formats
>>> '{%Y}-{%m}'.format(**d).format(ts)
'1895-10'
Вам нужно будет заключить все спецификаторы формата в фигурные скобки с помощью простого регулярного выражения:
>>> re.sub('(%\w)', r'{\1}', '%Y-%m-%d %H sdf')
'{%Y}-{%m}-{%d} {%H} sdf'
и в конце мы приходим к простому коду:
def ancient_fmt(ts, fmt):
fmt = fmt.replace('%%', '%')
fmt = re.sub('(%\w)', r'{\1}', fmt)
return fmt.format(**d).format(ts)
def main(ts, format):
if ts.year < 1900:
return ancient_format(ts, fmt)
else:
return ts.strftime(fmt)
где d
- глобальный словарь с ключами, соответствующими некоторым спецификаторам в strftime
таблица .
редактировать 2
Для пояснения: этот подход будет работать только для следующих спецификаторов: %Y, %m, %d, %H, %M, %S, %f
, т. Е. Числовых, если вам нужна текстовая информация, вам лучше использовать babel или любое другое решение.