Простой Python. современный стиль программирования - читать онлайн бесплатно полную версию книги . Страница 231

298

Глава 10. Системы

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 "<stdin>", line 1, in <module>

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)

Да.

Календари и часы

299

Даже если строка совпадает с заданным форматом, будет сгенерировано ис-

ключение, если одно из значений находится вне диапазона:

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

Traceback (most recent call last):

File "<stdin>", line 1, in <module>