A Python szabványos könyvtára datetime dátumokat és időpontokat (dátumok, időpontok és időpontok) dolgozhat fel. A strftime() és strptime() metódusok, amelyek dátumokat és időpontokat konvertálnak karakterláncokká és karakterláncokból, különböző formátumú dátumok és időpontok manipulálására használhatók.
Olyan műveletek elvégzésére is képes, mint a kivonás és az összeadás. Például könnyen kiszámíthatja és megkaphatja a 10 nappal ezelőtti vagy a 3 hét múlva esedékes dátumot, vagy az 50 perc múlva esedékes időt.
Először a datetime modulban elérhető objektumok következő osztályait ismertetjük.
datetime.datetime
:Dátum és idő (dátum és idő)datetime.date
:Dátumdatetime.time
:Idődatetime.timedelta
:Időeltolódás és eltelt idő
A strftime() és strptime() metódusok, amelyek a date\time és a stringet egymáshoz konvertálják, szintén ismertetésre kerülnek.
datetime
objektumdatetime.now()
:Mai dátum, aktuális idődatetime
Objektum konstruktor- Egy datetime objektum átalakítása dátum objektummá
date
objektumdate.today()
:A mai dátum- Konstruktor a dátum objektumhoz
time
objektum- Konstruktor az idő objektumhoz
timedelta
objektum- A datetime és date objektumok kivonása timedelta objektumok létrehozásához.
- A timedelta objektum konstruktora
- Kivonás és összeadás timedelta objektumokkal
strftime()
:Átalakítás dátumból és időből karakterláncbastrptime()
:Konvertálás karakterláncból dátumra és időre
A szabványos könyvtár része a naptár modul is, amely egyszerű szöveges vagy HTML formátumú naptárakat generál.
datetime objektum
A datetime objektum olyan objektum, amely dátum (év, hónap, nap) és idő (óra, perc, másodperc, mikroszekundum) információkat is tartalmaz. Ezeket az információkat a következő attribútumokkal érheti el.
year
month
day
hour
minute
second
microsecond
datetime.now(): Mai dátum, aktuális idő
A datetime.now() egy datetime objektumot ad a mai dátummal (az aktuális dátummal) és az aktuális idővel.
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 a datetime objektumhoz
Lehetőség van tetszőleges dátumok és időpontok datetime objektumainak létrehozására is.
A datetime objektum konstruktora a következő.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
A következő értékek kötelezőek, a többi elhagyható. Ha elhagyja, az alapértelmezett érték 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
Egy datetime objektum átalakítása dátum objektummá
A datetime objektumot a date() metódussal lehet dátum objektummá alakítani, a következőkben leírtak szerint.
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'>
dátum objektum
A dátumobjektum olyan objektum, amely egy dátumra (év, hónap, nap) vonatkozó információkat tartalmaz. Az év, a hónap és a nap attribútumokkal érhető el.
date.today(): A mai dátum
Az aktuális dátum (mai dátum) dátumobjektumát a date.today() segítségével kaphatjuk meg.
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
Konstruktor a dátum objektumhoz
A dátum objektum konstruktora a következőképpen néz ki
date(year, month, day)
Mindegyik kötelező és nem hagyható ki.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
időobjektum
Az időobjektum egy olyan objektum, amely az időre vonatkozó információkat (órák, percek, másodpercek és mikroszekundumok) tartalmaz. Az óra, perc, másodperc és mikroszekundum attribútumokkal érhető el.
Konstruktor az idő objektumhoz
A time objektum konstruktora a következő.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Ezek mindegyike opcionális, és ha kihagyja őket, akkor 0-ra lesznek beállítva.
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 objektum
A timedelta objektum egy olyan objektum, amely két dátum és időpont közötti időkülönbséget vagy az eltelt időt jelöli. Napokban, másodpercekben és mikromásodpercekben megadott információkkal rendelkezik, és a napok, másodpercek és mikromásodpercek attribútumokkal érhető el. A total_seconds() metódus segítségével a másodpercek teljes számát is meg lehet kapni.
A datetime és date objektumok kivonása a timedelta objektum létrehozásához.
A datetime objektumok kivonása egymásból egy timedelta objektumot eredményez.
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
A dátumobjektumok egymásból való kivonása hasonlóképpen egy timedelta objektumot eredményez.
A timedelta objektum konstruktora
A timedelta objektum konstruktora a következőképpen néz ki
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Ezek mindegyike opcionális, és ha kihagyja őket, akkor 0-ra lesznek beállítva.
Vegye figyelembe, hogy a timedelta objektum csak a következő információkat tartalmazza.
- néhány nap:
days
- másodpercek száma:
seconds
- mikroszekundumszámlálás:
microseconds
Például a következő kettő egyenlő
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Kivonás és összeadás timedelta objektumokkal
A timedelta objektum a datetime és date objektumokkal együtt használható olyan műveletek elvégzésére, mint a kivonás és az összeadás. Például könnyen kiszámíthatja és megkaphatja az egy héttel ezelőtti vagy a 10 nap múlva esedékes dátumot, illetve az 50 perc múlva esedékes időt.
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
Arra is használható, hogy kiszámolja, hány nap van még egy adott időpontig.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime(): Átalakítás dátumból és időből karakterláncba
A datetime és date objektumok strftime() metódusa használható a dátum és idő (dátum és idő) adatok bármilyen formátumú karakterlánccá alakítására.
formázási kód
A rendelkezésre álló formázási kódokat lásd az alábbi hivatalos dokumentációban.
A főbb formázási kódok az alábbiakban vannak felsorolva.
%d
:A hónap napja tizedesjegyekben, nullával kitöltve.%m
:Hónap tizedesjegyekben, nullával kitöltve.%y
:Az év utolsó két számjegye nullával kitöltött tizedesjegyekkel.%Y
:Az év négy számjegye tizedesjegyben, nullával kitöltve.%H
:Tizedesjegyekben kifejezve, nullával kitöltve (24 órás jelölés)%I
:Tizedesjegyekben kifejezve, nullával kitöltve (12 órás jelölés)%M
:A nullával kitöltött tizedesjegyeknél.%S
:Másodpercek tizedesjegyekben, nullával kitöltve.%f
:Mikromásodpercek (6 számjegy) tizedesjegyekben, 0-val kitöltve.%A
:A hét napjának neve a helységben%a
:A nap neve a helységben (rövidített formában)%B
:Helyi hónap neve%b
:Helyi hónap neve (rövidített formában)%j
:Az év napja tizedesjegyekben, nullával kitöltve.%U
:Az év hetének száma tizedesjegyekkel, nullával kitöltve (a hét vasárnap kezdődik).%W
:Az év hetének száma tizedesjegyekben, nullával kitöltve (a hét hétfőn kezdődik)
A nap- és hónapnevek következő formázási kódjai a területi adattól függően különböző karakterláncokban kaphatók.
%A
%a
%B
%b
Létezik egy külön módszer az ISO 8601 formátumú karakterláncok számára is.
Minta kód
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
Ha string helyett számot szeretnél kapni, csak konvertáld egész számmá az int() segítségével.
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
A timedelta objektummal kombinálva könnyen létrehozható például a kéthetenkénti dátumok listája bármilyen formátumban.
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
A listamegértés jelölés használata okosabb.
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']
- Kapcsolódó cikkek:A Python listamegértés jelölés használata
strptime(): Konvertálás karakterláncból dátumra és időre
A datetime strptime() segítségével dátum- vagy idősztringből létrehozható egy datetime objektum. Meg kell adni az eredeti karakterláncnak megfelelő formázási karakterláncot.
Létezik egy külön módszer az ISO 8601 karakterláncok számára (Python 3.7 vagy újabb).
Minta kód
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'>
A strftime() metódus használatával a kinyert datetime objektumon a dátumot és az időt az eredeti karakterlánctól eltérő formátumban is megjelenítheti.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Ha datetime objektummá konvertálod, akkor a timedelta objektumokkal is végezhetsz műveleteket, így például egy 10 nappal ezelőtti dátumot tartalmazó karakterláncot generálhatsz ugyanebben a formátumban.
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