Даты могут быть представлены множеством способов — их даже слишком много. Даже англоговорящие люди, использующие римский календарь, применяют множество вариантов представления простой даты:
• 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. В нем определены четыре основных объекта, каждый из которых содержит множество методов:
• date для годов, месяцев и дней;
• time для часов, минут, секунд и долей секунды;
• datetime для даты и времени одновременно;
• timedelta для интервалов даты и/или времени.
Вы можете создать объект date, указав год, месяц и день. Эти значения будут доступны как атрибуты:
>>>> from datetime import date
>>>> halloween = date(2014, 10, 31)
>>>> halloween
>datetime.date(2014, 10, 31)
>>>> halloween.day