Простой Python. Современный стиль программирования (Любанович) - страница 175

>>>> import time

>>>> fmt = "It's %A, %B %d, %Y, local time %I:%M:%S%p"

>>>> t = time.localtime()

>>>> t

>time.struct_time(tm_year=2014, tm_mon=2, tm_mday=4, tm_hour=19,

>tm_min=28, tm_sec=38, tm_wday=1, tm_yday=35, tm_isdst=0)

>>>> time.strftime(fmt, t)

>"It's Tuesday, February 04, 2014, local time 07:28:38PM"

Если мы попробуем сделать это с объектом date, функция отработает только для даты, время будет установлено в полночь:

>>>> from datetime import date

>>>> some_day = date(2014, 7, 4)

>>>> fmt = "It's %B %d, %Y, local time %I:%M:%S%p"

>>>> some_day.strftime(fmt)

>"It's Friday, July 04, 2014, local time 12:00:00AM"

Для объекта time будут преобразованы только части, касающиеся времени:

>>>> from datetime import time

>>>> some_time = time(10, 35)

>>>> some_time.strftime(fmt)

>"It's Monday, January 01, 1900, local time 10:35:00AM"

Очевидно, вам не нужно использовать те части объекта time, которые касаются дней, поскольку они бессмысленны.

Чтобы пойти другим путем и преобразовать строку к дате или времени, используйте функцию strptime() с такой же строкой формата. Эта строка работает не так, как регулярные выражения, — части строки, не касающиеся формата (без символа %), должны совпадать точно. Укажем формат «год-месяц-день» вроде 2012-01-29. Что произойдет, если строка даты, которую вы хотите проанализировать, имеет пробелы вместо дефисов?

>>>> import time

>>>> fmt = "%Y-%m-%d"

>>>> time.strptime("2012 01 29", fmt)

>Traceback (most recent call last):

>··File "", line 1, in

>··File "/Library/Frameworks/Python.framework/Versions/3.3/lib/

>··python3.3/_strptime.py", line 494, in _strptime_time

>····tt = _strptime(data_string, format)[0]

>··File "/Library/Frameworks/Python.framework/Versions/3.3/lib/

>··python3.3/_strptime.py", line 337, in _strptime

>····(data_string, format))

>ValueError: time data '2012 01 29' does not match format '%Y-%m-%d'

Будет ли довольна функция strptime(), если мы передадим ей несколько дефисов?

>>>> time.strptime("2012-01-29", fmt)

>time.struct_time(tm_year=2012, tm_mon=1, tm_mday=29, tm_hour=0, tm_min=0,

>tm_sec=0, tm_wday=6, tm_yday=29, tm_isdst=-1)

Да.

Даже если строка совпадает с заданным форматом, будет сгенерировано исключение, если одно из значений находится вне диапазона:

>>>> time.strptime("2012-13-29", fmt)

>Traceback (most recent call last):

>··File "", line 1, in

>··File "/Library/Frameworks/Python.framework/Versions/3.3/lib/

>··python3.3/_strptime.py", line 494, in _strptime_time

>····tt = _strptime(data_string, format)[0]

>··File "/Library/Frameworks/Python.framework/Versions/3.3/lib/