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

Даты могут быть представлены множеством способов — их даже слишком много. Даже англоговорящие люди, использующие римский календарь, применяют множество вариантов представления простой даты:

• July 29 1984;

• 29 Jul 1984;

• 29/7/1984;

• 7/29/1984.

Помимо других проблем, представление даты может быть двусмысленным. В предыдущих примерах довольно легко определить, что 7 означает месяц, а 29 — день месяца, в основном потому что у месяца не может быть номера 29. Но как насчет даты 1/6/2012? Мы говорим о 6 января или 1 июня?

Название месяца в римском календаре изменяется в зависимости от языка. Даже год и месяц могут иметь разные определения в разных культурах.

Високосные годы — это еще одна проблема. Вы, возможно, знаете, что каждый четвертый год является високосным (в этом году проходят летняя олимпиада и выборы президента в Америке). Знаете ли вы, что каждый сотый год не является високосным, а каждый 400-й — является? Рассмотрим пример кода, в котором проверяется, является ли год високосным:

>>>> import calendar

>>>> calendar.isleap(1900)

>False

>>>> calendar.isleap(1996)

>True

>>>> calendar.isleap(1999)

>False

>>>> calendar.isleap(2000)

>True

>>>> calendar.isleap(2002)

>False

>>>> calendar.isleap(2004)

>True

Работа с временем также может доставить неприятности, особенно из-за часовых поясов и перехода на летнее время. Если вы взглянете на карту часовых поясов, то окажется, что эти пояса больше соответствуют политическим и историческим границам, вместо того чтобы сменяться каждые 15° (360°/24) долготы. Кроме того, разные страны переходят на летнее время и обратно в разные дни года. Фактически страны южного полушария переводят свои часы вперед, когда страны северного полушария переводят их назад, и наоборот (если вы немного задумаетесь, то поймете, почему так происходит).

Стандартная библиотека Python имеет множество модулей для работы с датой и временем: datetime, time, calendar, dateutil и др. Их функции немного пересекаются друг с другом, и это может создать путаницу.

Модуль datetime

Начнем с рассмотрения стандартного модуля datetime. В нем определены четыре основных объекта, каждый из которых содержит множество методов:

• date для годов, месяцев и дней;

• time для часов, минут, секунд и долей секунды;

• datetime для даты и времени одновременно;

• timedelta для интервалов даты и/или времени.

Вы можете создать объект date, указав год, месяц и день. Эти значения будут доступны как атрибуты:

>>>> from datetime import date

>>>> halloween = date(2014, 10, 31)

>>>> halloween

>datetime.date(2014, 10, 31)

>>>> halloween.day