Стандартну бібліотеку Python datetime можна використовувати для обробки дат і часу (дат, часу і часу). Методи strftime() і strptime(), які перетворюють дати та час у рядки та з них, можна використовувати для маніпулювання датами та часом у різних форматах.
Він також може виконувати такі операції, як віднімання та додавання. Наприклад, ви можете легко розрахувати й отримати дату 10 днів тому або через 3 тижні або час через 50 хвилин.
Спочатку ми опишемо наступні класи об’єктів, доступних у модулі datetime.
datetime.datetime
:Дата і час (дата і час)datetime.date
:Датаdatetime.time
:Часdatetime.timedelta
:Різниця в часі та час, що минув
Також пояснюються методи strftime() і strptime(), які перетворюють дату/час і рядок один в одного.
datetime
об’єктdatetime.now()
:Сьогоднішня дата, поточний часdatetime
Конструктор об’єктів- Перетворення об’єкта datetime в об’єкт дати
date
об’єктdate.today()
:Сьогоднішня дата- Конструктор для об’єкта дати
time
об’єкт- Конструктор для об’єкта часу
timedelta
об’єкт- Відніміть об’єкти datetime та date, щоб створити об’єкти timedelta.
- Конструктор для об’єкта timedelta
- Віднімання та додавання за допомогою об’єктів timedelta
strftime()
:Перетворення дати й часу в рядокstrptime()
:Перетворення з рядка в дату та час
Також до стандартної бібліотеки входить модуль календаря, який генерує календарі у форматі простого тексту або HTML.
об’єкт datetime
Об’єкт datetime — це об’єкт, який містить інформацію про дату (рік, місяць, день) і час (година, хвилина, секунда, мікросекунда). Ви можете отримати доступ до цієї інформації за допомогою наступних атрибутів.
year
month
day
hour
minute
second
microsecond
datetime.now():Сьогоднішня дата, поточний час
datetime.now() надасть вам об’єкт datetime із сьогоднішньою датою (поточна дата) та поточним часом.
import datetime
dt_now = datetime.datetime.now()
print(dt_now)
# 2018-02-02 18:31:13.271231
print(type(dt_now))
# <class 'datetime.datetime'>
print(dt_now.year)
# 2018
print(dt_now.hour)
# 18
Конструктор для об’єкта datetime
Також можна генерувати об’єкти datetime для довільних дат і часу.
Конструктор для об’єкта datetime виглядає наступним чином.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Наведені нижче значення є обов’язковими, а інші можна пропустити. Якщо опущено, значення за замовчуванням дорівнює 0.
year
month
day
dt = datetime.datetime(2018, 2, 1, 12, 15, 30, 2000)
print(dt)
# 2018-02-01 12:15:30.002000
print(dt.minute)
# 15
print(dt.microsecond)
# 2000
dt = datetime.datetime(2018, 2, 1)
print(dt)
# 2018-02-01 00:00:00
print(dt.minute)
# 0
Перетворення об’єкта datetime в об’єкт дати
Об’єкт datetime можна перетворити на об’єкт дати за допомогою методу date(), як описано далі.
print(dt_now)
print(type(dt_now))
# 2018-02-02 18:31:13.271231
# <class 'datetime.datetime'>
print(dt_now.date())
print(type(dt_now.date()))
# 2018-02-02
# <class 'datetime.date'>
об’єкт дати
Об’єкт дати – це об’єкт, який містить інформацію про дату (рік, місяць, день). Доступ до нього можна отримати за атрибутами рік, місяць і день.
date.today():Сьогоднішня дата
Об’єкт дати поточної дати (сьогоднішня дата) можна отримати за допомогою date.today().
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
Конструктор для об’єкта дати
Конструктор для об’єкта date виглядає наступним чином
date(year, month, day)
Усі є обов’язковими і не можуть бути пропущені.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
об’єкт часу
Об’єкт часу — це об’єкт, який містить інформацію про час (години, хвилини, секунди та мікросекунди). До нього можна отримати доступ за допомогою атрибутів година, хвилина, секунда та мікросекунда.
Конструктор для об’єкта часу
Конструктор об’єкта часу виглядає наступним чином.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Усі вони є необов’язковими, і якщо їх пропустити, вони встановлюються в 0.
t = datetime.time(12, 15, 30, 2000)
print(t)
# 12:15:30.002000
print(type(t))
# <class 'datetime.time'>
print(t.hour)
# 12
t = datetime.time()
print(t)
# 00:00:00
об’єкт timedelta
Об’єкт timedelta – це об’єкт, який представляє різницю в часі між двома датами та часом або час, що минув. Він містить інформацію в днях, секундах і мікросекундах, і доступ до нього можна отримати за допомогою атрибутів днів, секунд і мікросекунд. Також можна отримати загальну кількість секунд за допомогою методу total_seconds().
Відніміть об’єкти datetime та date, щоб створити об’єкт timedelta.
Віднімання об’єктів datetime один від одного дає об’єкт timedelta.
td = dt_now - dt
print(td)
# 1 day, 18:31:13.271231
print(type(td))
# <class 'datetime.timedelta'>
print(td.days)
# 1
print(td.seconds)
# 66673
print(td.microseconds)
# 271231
print(td.total_seconds())
# 153073.271231
Віднімання об’єктів дати один від одного так само дає об’єкт timedelta.
Конструктор для об’єкта timedelta
Конструктор об’єкта timedelta виглядає наступним чином
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Усі вони є необов’язковими, і якщо їх пропустити, вони встановлюються в 0.
Зауважте, що об’єкт timedelta містить лише таку інформацію.
- кількість днів:
days
- кількість секунд:
seconds
- відлік мікросекунд:
microseconds
Наприклад, наступні два рівні
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Віднімання та додавання за допомогою об’єктів timedelta
Об’єкт timedelta можна використовувати з об’єктами datetime та date для виконання таких операцій, як віднімання та додавання. Наприклад, ви можете легко розрахувати й отримати дату тиждень тому або через 10 днів, або час через 50 хвилин.
d_1w = d_today - td_1w
print(d_1w)
# 2018-01-26
td_10d = datetime.timedelta(days=10)
print(td_10d)
# 10 days, 0:00:00
dt_10d = dt_now + td_10d
print(dt_10d)
# 2018-02-12 18:31:13.271231
td_50m = datetime.timedelta(minutes=50)
print(td_50m)
# 0:50:00
print(td_50m.seconds)
# 3000
dt_50m = dt_now + td_50m
print(dt_50m)
# 2018-02-02 19:21:13.271231
Його також можна використовувати для обчислення кількості днів до певної дати.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime():Перетворення дати й часу в рядок
Метод strftime() для об’єктів datetime та date можна використовувати для перетворення інформації про дату й час (дата й час) у рядок у будь-якому форматі.
код форматування
Перегляньте офіційну документацію нижче для доступних кодів форматування.
Основні коди форматування наведені нижче.
%d
:День місяця в десятковому записі з нулем.%m
:Місяць у десятковому записі із заповненим нулем.%y
:Дві останні цифри року в десятковому записі, заповненому нулем.%Y
:Чотири цифри року в десятковому записі з нулем.%H
:Якщо виражається в десятковій системі позначення з нулем (24-годинний запис)%I
:Якщо виражається в десятковій системі позначення з нулем (12-годинний запис)%M
:Для десяткового запису із заповненим нулем.%S
:Секунди в десятковому записі із заповненим нулем.%f
:Мікросекунди (6 цифр) у десятковому записі з 0 заповненим.%A
:Назва дня тижня для регіону%a
:Назва дня для місцевості (скорочена форма)%B
:Місцева назва місяця%b
:Місцева назва місяця (скорочена форма)%j
:День року в десятковому записі з нульовим заповненням.%U
:Номер тижня року в десятковому записі з нульовим заповненням (тиждень починається в неділю)%W
:Номер тижня року в десятковому записі з нульовим заповненням (тиждень починається в понеділок)
Наступні коди форматування для назв днів і місяців можна отримати в різних рядках залежно від мовного стандарту.
%A
%a
%B
%b
Існує також спеціальний метод для рядків формату ISO 8601.
Зразок коду
print(dt_now.strftime('%Y-%m-%d %H:%M:%S'))
# 2018-02-02 18:31:13
print(d_today.strftime('%y%m%d'))
# 180202
print(d_today.strftime('%A, %B %d, %Y'))
# Friday, February 02, 2018
print('Day number (how many days in a year / January 1 is 001):', d_today.strftime('%j'))
print('Week number (the week starts on Sunday / New Year's Day is 00):', d_today.strftime('%U'))
print('Week number (the week begins on Monday / New Year's Day is 00):', d_today.strftime('%W'))
# Day number (how many days in a year / January 1 is 001): 033
# Week number (the week starts on Sunday / New Year's Day is 00): 04
# Week number (the week begins on Monday / New Year's Day is 00): 05
Якщо ви хочете отримати число замість рядка, просто перетворіть його в ціле за допомогою int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
У поєднанні з об’єктом timedelta легко створити, наприклад, список двотижневих дат у будь-якому форматі.
d = datetime.date(2018, 2, 1)
td = datetime.timedelta(weeks=2)
n = 8
f = '%Y-%m-%d'
l = []
for i in range(n):
l.append((d + i * td).strftime(f))
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
print('\n'.join(l))
# 2018-02-01
# 2018-02-15
# 2018-03-01
# 2018-03-15
# 2018-03-29
# 2018-04-12
# 2018-04-26
# 2018-05-10
Використання позначень для розуміння списку є розумнішим.
l = [(d + i * td).strftime(f) for i in range(n)]
print(l)
# ['2018-02-01', '2018-02-15', '2018-03-01', '2018-03-15', '2018-03-29', '2018-04-12', '2018-04-26', '2018-05-10']
- Пов’язані статті:Використання нотації розуміння списку Python
strptime():Перетворення з рядка в дату та час
datetime strptime() можна використовувати для створення об’єкта datetime з рядка дати або часу. Необхідно вказати рядок форматування, що відповідає вихідному рядку.
Існує також спеціальний метод для рядків ISO 8601 (Python 3.7 або новішої версії).
Зразок коду
date_str = '2018-2-1 12:30'
date_dt = datetime.datetime.strptime(date_str, '%Y-%m-%d %H:%M')
print(date_dt)
# 2018-02-01 12:30:00
print(type(date_dt))
# <class 'datetime.datetime'>
Використовуючи метод strftime() для отриманого об’єкта datetime, ви можете представити дату та час у форматі, відмінному від вихідного рядка.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Якщо ви перетворите його в об’єкт datetime, ви також можете виконувати операції з об’єктами timedelta, тож, наприклад, ви можете створити рядок дати 10 днів тому в тому ж форматі.
date_str = '2018-2-1'
date_format = '%Y-%m-%d'
td_10_d = datetime.timedelta(days=10)
date_dt = datetime.datetime.strptime(date_str, date_format)
date_dt_new = date_dt - td_10_d
date_str_new = date_dt_new.strftime(date_format)
print(date_str_new)
# 2018-01-22