2015-08-14 5 views
0

У меня есть унаследованное приложение wxPython. На мой взгляд, он нуждается в определенной степени очистки, поскольку даты могут появляться в несколько разных форматах. Пример фрагмент кода приведен ниже (я добавил заявление «Печать»: -Форматы Python и даты

formattedDate = str(Date.tm_year) + '-' + str(Date.tm_mon) + '-' + str(Date.tm_mday) 
print 'formattedDate is >', formattedDate, '<' 
today = time.strftime('%Y-%m-%d') 
print 'Today is >', today, '<' 

, который дает выход: -

formattedDate is > 2015-8-14 < 
Today is > 2015-08-14 < 

formattedDate основан на вводе пользователя и является (добавляется в базу данных). Что меня озадачивает, почему месяц - это одна цифра в одном случае и две цифры в другой. Я прошел через свои книги на Python и трал сеть, но не смог найти ответ.

+0

Что такое 'Date.tm_mon'? –

+0

tm_mon - это атрибут класса time.struct_time. Три значения, которые я использую, - это год, месяц и день (месяца). Это часть стандартной библиотеки Python. Форматирующая несогласованность меня бросала! –

ответ

0

Ass Date имеет тип - time.struct_time. Это связано с тем, что Date.tm_mon возвращает целое представление месяца (типа int), а при его преобразовании в str вручную вы получаете количество цифр, которое оно имеет.

Пример -

>>> t = time.strptime('2015-8-10','%Y-%m-%d') 
>>> t 
time.struct_time(tm_year=2015, tm_mon=8, tm_mday=10, tm_hour=0, tm_min=0, tm_sec=0, tm_wday=0, tm_yday=222, tm_isdst=-1) 
>>> t.tm_mon 
8 
>>> type(t.tm_mon) 
<class 'int'> 
>>> str(t.tm_mon) 
'8' 

При использовании strftime() с форматом %m, Python правильно форматирует месяц, чтобы всегда быть 2 цифры, так как documented -

% м - Месяц как десятичное число [01,12].

Пример -

>>> time.strftime('%m') 
'08' 

Я всегда recommnd использовать strftime() для форматирования даты в строку, а не создавать их вручную. Для форматирования time.struct_time объекта с помощью strftime() вы передаете time.struct_time объект в качестве второго аргумента strtime(), пример -

>>> time.strftime('%Y/%m/%d',t) 
'2015/08/10' 
0

Все в порядке, acording документации:

печать time.strftime показывает 2 цифры

% m Месяц в виде десятичного числа [01,12].

И Date.tm_mon - выглядит как пользовательский класс/поле и показывает одно значное значение. Проверьте, что такое Date.tm_mon и как он сохраняет значение, возможно, он обрезает нуль

0

Date.tm_mon, вероятно, является целым числом, а str (8) будет печатать одну цифру (без начального нуля).

С другой стороны,% m в time.strftime ('% Y-% m-% d') всегда выводит 2-значный месяц (documentation).