Pythonova standardna knjižnica datetime može se koristiti za obradu datuma i vremena (datuma, vremena i vremena). Metode strftime() i strptime(), koje pretvaraju datume i vrijeme u nizove i iz njih, mogu se koristiti za manipuliranje datumima i vremenom u različitim formatima.
Također može izvoditi operacije kao što su oduzimanje i zbrajanje. Na primjer, možete jednostavno izračunati i dobiti datum prije 10 dana ili 3 tjedna od sada, ili vrijeme za 50 minuta.
Prvo ćemo opisati sljedeće klase objekata dostupnih u modulu datetime.
datetime.datetime
:Datum i vrijeme (datum i vrijeme)datetime.date
:Datumdatetime.time
:Vrijemedatetime.timedelta
:Vremenska razlika i proteklo vrijeme
Također su objašnjene metode strftime() i strptime(), koje međusobno pretvaraju datum/vrijeme i niz.
datetime
objektdatetime.now()
:Današnji datum, trenutno vrijemedatetime
Konstruktor objekata- Pretvaranje objekta datuma i vremena u objekt datuma
date
objektdate.today()
:Današnji datum- Konstruktor za objekt datuma
time
objekt- Konstruktor za vremenski objekt
timedelta
objekt- Oduzmite objekte datuma i vremena da biste stvorili objekte timedelta.
- Konstruktor za timedelta objekt
- Oduzimanje i zbrajanje korištenjem timedelta objekata
strftime()
:Pretvorba iz datuma i vremena u nizstrptime()
:Pretvorba iz niza u datum i vrijeme
U standardnu biblioteku također je uključen i kalendarski modul koji generira kalendare u običnom tekstu ili HTML formatu.
objekt datuma i vremena
Objekt datetime je objekt koji ima podatke o datumu (godina, mjesec, dan) i vremenu (sat, minuta, sekunda, mikrosekunda). Tim informacijama možete pristupiti sa sljedećim atributima.
year
month
day
hour
minute
second
microsecond
datetime.now():Današnji datum, trenutno vrijeme
datetime.now() će vam dati objekt datetime s današnjim datumom (trenutni datum) i trenutnim vremenom.
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
Konstruktor za objekt datuma i vremena
Također je moguće generirati objekte datuma i vremena za proizvoljne datume i vremena.
Konstruktor za objekt datetime je sljedeći.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Sljedeće vrijednosti su obavezne, a druge se mogu izostaviti. Ako se izostavi, zadana vrijednost je 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
Pretvaranje objekta datuma i vremena u objekt datuma
Objekt datetime može se pretvoriti u objekt datuma metodom date(), kao što je opisano u nastavku.
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'>
objekt datuma
Objekt datuma je objekt koji sadrži informacije o datumu (godina, mjesec, dan). Može se pristupiti atributima godina, mjesec i dan.
date.today():Današnji datum
Objekt datuma trenutnog datuma (današnji datum) može se dobiti pomoću 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
Konstruktor za objekt datuma
Konstruktor za objekt datuma je sljedeći
date(year, month, day)
Sve su obavezne i ne mogu se izostaviti.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
vremenski objekt
Objekt vremena je objekt koji sadrži informacije o vremenu (sati, minute, sekunde i mikrosekunde). Može se pristupiti pomoću atributa sat, minuta, sekunda i mikrosekunda.
Konstruktor za vremenski objekt
Konstruktor vremenskog objekta je sljedeći.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Svi su izborni, a ako su izostavljeni, postavljaju se na 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 objekt
Timedelta objekt je objekt koji predstavlja vremensku razliku između dva datuma i vremena, odnosno proteklo vrijeme. Ima informacije u danima, sekundama i mikrosekundama, a može mu se pristupiti pomoću atributa dani, sekunde i mikrosekunde. Također je moguće dobiti ukupan broj sekundi pomoću total_seconds() metode.
Oduzmite objekte datetime i date da biste stvorili timedelta objekt.
Oduzimanjem datetime objekata jedan od drugog daje timedelta objekt.
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
Oduzimanje objekata datuma jedan od drugog na sličan način daje timedelta objekt.
Konstruktor za timedelta objekt
Konstruktor objekta timedelta je sljedeći
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Svi su izborni, a ako su izostavljeni, postavljaju se na 0.
Imajte na umu da timedelta objekt sadrži samo sljedeće informacije.
- nekoliko dana:
days
- broj sekundi:
seconds
- broj mikrosekundi:
microseconds
Na primjer, sljedeća dva su jednaka
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Oduzimanje i zbrajanje korištenjem timedelta objekata
Objekt timedelta može se koristiti s objektima datetime i date za izvođenje operacija kao što su oduzimanje i zbrajanje. Na primjer, možete jednostavno izračunati i dobiti datum prije tjedan dana ili 10 dana od sada, ili vrijeme za 50 minuta.
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
Također se može koristiti za izračunavanje broja dana do određenog datuma.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime():Pretvorba iz datuma i vremena u niz
Metoda strftime() objekata datetime i date može se koristiti za pretvaranje podataka o datumu i vremenu (datum i vrijeme) u niz u bilo kojem formatu.
kod za formatiranje
Pogledajte službenu dokumentaciju u nastavku za dostupne kodove za formatiranje.
Glavni kodovi oblikovanja navedeni su u nastavku.
%d
:Dan u mjesecu u decimalnom zapisu s popunjenom nulom.%m
:Mjesec u decimalnom zapisu s ispunjenom nulom.%y
:Zadnje dvije znamenke godine u decimalnom zapisu s nulom.%Y
:Četiri znamenke godine u decimalnom zapisu s ispunjenom nulom.%H
:Kada je izraženo decimalnim zapisom s popunjenom nulom (24-satni zapis)%I
:Kada je izraženo decimalnim zapisom s popunjenom nulom (12-satni zapis)%M
:Za decimalni zapis s ispunjenom nulom.%S
:Sekunde u decimalnim zapisima s ispunjenom nulom.%f
:Mikrosekunde (6 znamenki) u decimalnim zapisima s popunjenim 0.%A
:Naziv dana u tjednu za mjesto%a
:Naziv dana za mjesto (skraćeni oblik)%B
:Lokalni naziv mjeseca%b
:Lokalni naziv mjeseca (skraćeni oblik)%j
:Dan u godini u decimalnim zapisima s nultim popunjavanjem.%U
:Broj tjedna u godini u decimalnom zapisu s nultim popunjavanjem (tjedan počinje u nedjelju)%W
:Broj tjedna u godini u decimalnom zapisu s nultim popunjavanjem (tjedan počinje u ponedjeljak)
Sljedeći kodovi oblikovanja za nazive dana i mjeseca mogu se dobiti u različitim nizovima ovisno o mjestu.
%A
%a
%B
%b
Postoji i posebna metoda za nizove formata ISO 8601.
Uzorak koda
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
Ako želite dobiti broj umjesto niza, jednostavno ga pretvorite u cijeli broj pomoću int().
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
U kombinaciji s timedelta objektom, lako je stvoriti, na primjer, popis dvotjednih datuma u bilo kojem formatu.
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
Korištenje zapisa za razumijevanje popisa je pametnije.
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']
- Povezani članci:Korištenje zapisa razumijevanja popisa Python
strptime():Pretvorba iz niza u datum i vrijeme
datetime strptime() može se koristiti za kreiranje objekta datetime iz datumskog ili vremenskog niza. Potrebno je navesti niz za formatiranje koji odgovara izvornom nizu.
Postoji i posebna metoda za ISO 8601 nizove (Python 3.7 ili noviji).
Uzorak koda
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'>
Korištenjem metode strftime() na dohvaćenom objektu datetime, možete predstaviti datum i vrijeme u drugačijem formatu od izvornog niza.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Ako ga pretvorite u objekt datuma i vremena, također možete izvoditi operacije s timedelta objektima, tako da, na primjer, možete generirati niz datuma prije 10 dana u istom formatu.
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