Вступление
Ведение журнала, сохранение записей в базе данных и доступ к файлам - все это обычные задачи, над которыми работает программист. В каждом из этих случаев дата и время играют важную роль в сохранении смысла и целостности данных. Программистам часто приходится интересоваться датой и временем.
В этой статье мы узнаем, как получить текущую дату и время, используя встроенный в Python модуль datetime. С помощью этого модуля мы можем получить все соответствующие данные в одном объекте или извлечь дату и время отдельно.
Мы также узнаем, как настроить дату и время для разных часовых поясов.
Наконец, мы рассмотрим преобразование datetime
в популярные временные
метки Unix или Epoch.
Получение текущей даты и времени с помощью datetime
Модуль datetime
содержит различные классы для получения информации о
дате и времени:
datetime.date
: хранит день, месяц и год или датуdatetime.time
: сохраняет время в часах, минутах, секундах и микросекундах. Эта информация не зависит от какой-либо датыdatetime.datetime
: хранит атрибутыdate
иtime
Давайте получим текущую дату и время с помощью datetime.datetime
, так
как из него легче извлекать объекты date
и time
Сначала импортируем
модуль datetime
from datetime import datetime
Хотя сначала это выглядит странно, мы получаем класс datetime
datetime
, а это две разные вещи.
Мы можем использовать now()
чтобы получить объект с текущей датой и
временем:
current_datetime = datetime.now()
print(current_datetime)
Запуск этого файла даст нам следующий результат:
2019-12-13 12:18:18.290623
Функция now()
дала нам объект со всеми датой и временем его создания.
Когда мы печатаем его, Python автоматически форматирует объект в строку,
чтобы люди могли легко его прочитать. Вы можете прочитать наше
руководство о том, как форматировать даты в
Python, чтобы узнать о различных
способах печати времени.
Вы можете получить отдельные атрибуты даты и времени следующим образом:
print(current_datetime.year) # 2019
print(current_datetime.month) # 12
print(current_datetime.day) # 13
print(current_datetime.hour) # 12
print(current_datetime.minute) # 18
print(current_datetime.second) # 18
print(current_datetime.microsecond) # 290623
Метод now()
идеально подходит для того, чтобы запечатлеть момент.
Однако это излишне, если вас интересует только дата или время, но не
то и другое одновременно. Как мы можем получить только информацию о
дате?
Получение текущей даты
Есть два способа получить текущую дату в Python. В консоли Python мы
можем получить дату из datetime
с помощью метода date()
>>> from datetime import datetime
>>> current_date = datetime.now().date()
>>> print(current_date)
2019-12-13
datetime
только для фиксации даты кажется пустой тратой. Альтернативой
было бы использование метода today()
класса date
>>> from datetime import date
>>> current_date = date.today()
>>> print(current_date)
2019-12-13
Класс datetime.date
представляет календарную дату. year
, month
и
day
можно получить так же, как мы обращаемся к ним в объекте
datetime
Например, этот print
получает каждый атрибут, а также использует метод
weekday()
для получения дня недели:
>>> print("It's the %dth day of the week, %dth day of the %dth month of the %dth year" %
... (current_date.weekday()+1, current_date.day, current_date.month, current_date.year))
It's the 5th day of the week, 13th day of the 12th month of the 2019th year
Примечание . Метод weekday()
возвращает целое число от 0 до 6,
представляющее день недели. 0 соответствует понедельнику. Поэтому в
нашем примере мы добавили 1, чтобы напечатать 5-й день недели (пятницу),
хотя метод weekday()
вернул 4.
Теперь, когда мы можем получить текущую дату самостоятельно, давайте посмотрим, как мы можем получить текущее время.
Получение текущего времени
Мы фиксируем текущее время из datetime
с помощью метода time()
>>> from datetime import datetime
>>> current_time = datetime.now().time()
>>> print(current_time)
12:18:18.290623
В отличие от получения дат, здесь нет ярлыка для прямого захвата
текущего времени. Класс datetime.time
представляет понятие времени в
часах, минутах, секундах и микросекундах - все, что меньше суток.
Как и datetime
, мы можем напрямую обращаться к его атрибутам. Вот
пример, в котором мы печатаем current_time
в предложении:
>>> print("It's %d o'clock. To be exact, it's %d:%d and %d seconds with %d microseconds" %
... (current_time.hour, current_time.hour, current_time.minute, current_time.second, current_time.microsecond))
It's 12 o'clock. To be exact, it's 12:18 and 18 seconds with 290623 microseconds
По умолчанию now()
возвращает время в вашем часовом поясе. Что, если
нам нужно будет преобразовать его в другой, который был установлен в
предпочтениях пользователя? Давайте посмотрим, как мы можем предоставить
информацию о часовом поясе для получения локализованных объектов time
Получение текущей даты и времени в другом часовом поясе
Метод now()
принимает часовой пояс в качестве аргумента, чтобы
datetime
был соответствующим образом скорректирован. Во-первых, нам
нужно получить данные о часовом поясе через библиотеку
pytz.
Установите pytz
с помощью pip
если она еще не доступна на вашем
компьютере:
$ pip3 install pytz
Теперь давайте воспользуемся pytz
чтобы получить текущую дату и время,
если бы мы были в Берлине:
>>> import pytz
>>> from datetime import datetime
>>> tz = pytz.timezone('Europe/Berlin')
>>> berlin_current_datetime = datetime.now(tz)
>>> print(berlin_current_datetime)
2019-12-14 00:20:50.840350+01:00
berlin_current_datetime
будет datetime
со всеми свойствами и
функциями, которые мы видели ранее, но теперь он полностью соответствует
тому, что есть для тех, кто там живет.
Если вы хотите получить время в формате UTC, вы можете использовать
pytz
как и раньше:
>>> import pytz
>>> from datetime import datetime
>>> utc_current_datetime = datetime.now(pytz.timezone("UTC"))
>>> print(utc_current_datetime)
2019-12-13 23:20:50.840350+00:00
В качестве альтернативы, для времени UTC вам вообще не нужно
использовать модуль pytz
Модуль datetime
имеет timezone
, которое
можно использовать следующим образом:
>>> from datetime import datetime, timezone
>>> utc_current_datetime = datetime.now(timezone.utc)
>>> print(utc_current_datetime)
2019-12-13 23:20:50.840350+00:00
Теперь, когда мы можем преобразовать наши даты и время для соответствия разным часовым поясам, давайте посмотрим, как мы можем преобразовать их в один из наиболее широко используемых форматов в вычислениях - временные метки Unix.
Преобразование меток времени в даты и время
Компьютерные системы измеряют время на основе количества секунд, прошедших с эпохи Unix, то есть 00:00:00 UTC 1 января 1970 года. Обычно приложения, базы данных и протоколы используют метку времени для отображения времени.
Вы можете получить текущую метку времени в Python, используя библиотеку
time
>>> import time
>>> print(time.time())
1576280665.0915806
Функция time.time()
возвращает число с плавающей запятой с меткой
времени Unix. Вы можете преобразовать метку времени в datetime
с
помощью функции fromtimestamp()
:
>>> from datetime import datetime
>>> print(datetime.fromtimestamp(1576280665))
2019-12-13 19:44:25
По умолчанию fromtimestamp()
возвращает datetime
в вашем часовом
поясе. Вы можете указать часовой пояс в качестве второго аргумента, если
хотите, чтобы он был локализован по-другому.
Например, чтобы преобразовать метку времени в datetime
в формате UTC,
вы можете сделать это:
>>> from datetime import datetime, timezone
>>> print(datetime.fromtimestamp(1576280665, timezone.utc))
2019-12-13 19:44:25+00:00
И наоборот, вы можете использовать метод timestamp()
для
преобразования datetime
в действительную метку времени:
>>> from datetime import datetime, timezone
>>> print(datetime.now(timezone.utc).timestamp())
1577117555.940705
Заключение
Встроенная в Pythons datetime
позволяет нам получать текущую дату и
время с помощью функции now()
. Мы можем использовать возвращенный
datetime
для извлечения только части даты или части времени. Мы также
можем получить текущую дату с помощью функции today()
.
По умолчанию Python создает datetime
в нашем часовом поясе. Если мы
используем pytz
, мы можем преобразовать дату и время в разные часовые
пояса.
Наконец, мы использовали fromtimestamp()
чтобы взять временную метку
Unix для получения объекта datetime
Если у нас есть datetime
, мы
можем получить метку времени, используя его метод timestamp()