Dîroka pirtûkxaneya standard a Python dikare ji bo pêvajoykirina tarîx û demjimêran (tarîx, dem û dem) were bikar anîn. Rêbazên strftime() û strptime(), yên ku tarîx û deman diguherînin û ji rêzan diguherînin, dikarin ji bo manîpulekirina tarîx û demjimêran di cûrbecûr formatan de werin bikar anîn.
Di heman demê de dikare operasyonên wekî kêmkirin û zêdekirinê jî pêk bîne. Mînakî, hûn dikarin bi hêsanî tarîxa 10 roj berê an 3 hefte ji nuha, an dema 50 hûrdem ji nuha ve bihesibînin û bistînin.
Pêşîn, em ê çînên jêrîn ên tiştên ku di modula datetime de peyda dibin diyar bikin.
datetime.datetime
:Dîrok û dem (roj û dem)datetime.date
:Rojekdatetime.time
:Demdatetime.timedelta
:Cûdahiya dem û dema derbasbûyî
Rêbazên strftime() û strptime(), yên ku tarîx/dem û rêzê vediguherînin hev, jî têne ravekirin.
datetime
tiştdatetime.now()
:Dîroka îro, dema nihadatetime
Object Constructor- Veguherandina objeyek datetime bo objeya date
date
tiştdate.today()
:Dîroka îro- Avaker ji bo objeya tarîxê
time
tişt- Constructor ji bo dema object
timedelta
tişt- Tiştên tarîx û tarîxê jê bikin da ku tiştên demdelta biafirînin.
- Avaker ji bo object timedelta
- Jêkirin û lêzêdekirin bi karanîna tiştên demdelta
strftime()
:Veguheztina ji tarîx û wextê ji rêzêstrptime()
:Veguherîna ji rêzê ji bo dîrok û dem
Di heman demê de di pirtûkxaneya standard de modula salnameyê jî heye, ku salnameyên bi nivîsa sade an HTML-ê diafirîne.
datetime object
Tiştek datetime ew tişt e ku hem agahdariya tarîxê (sal, meh, roj) û hem jî demjimêr (saet, hûrdem, çirk, mîkrosaniye) heye. Hûn dikarin bi taybetmendiyên jêrîn bigihîjin wan agahdariyan.
year
month
day
hour
minute
second
microsecond
datetime.now():Dîroka îro, dema niha
datetime.now() dê bi roja îroyîn (roja heyî) û dema niha ve hêmanek datetime bide we.
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
Avaker ji bo object datetime
Di heman demê de gengaz e ku meriv ji bo tarîx û demên kêfî tiştên tarîxê biafirîne.
Çêkera ji bo objeya datetime wiha ye.
datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Nirxên jêrîn hewce ne û yên din dikarin bêne derxistin. Heke ji holê rabe, nirxa xwerû 0 e.
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
Veguherandina objeyek datetime bo objeya date
Tiştek datetime dikare bi rêbaza date() veguhezîne objeyek tarîxê, wekî ku li pey tê diyar kirin.
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 object
Tişta tarîxê ew tişt e ku di derbarê tarîxekê de (sal, meh, roj) agahdarî dihewîne. Ew dikare ji hêla taybetmendiyên sal, meh û roj ve tê gihîştin.
date.today():Dîroka îro
Tişta tarîxa roja niha (roja îro) dikare bi date.today() were wergirtin.
d_today = datetime.date.today()
print(d_today)
# 2018-02-02
print(type(d_today))
# <class 'datetime.date'>
print(d_today.year)
# 2018
Avaker ji bo objeya tarîxê
Avaker ji bo objeya tarîxê wiha ye
date(year, month, day)
Hemî hewce ne û nayên derxistin.
d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01
print(d.month)
# 2
dema object
Tişta demê ew tişt e ku di derbarê demê de (saet, deqîqe, saniye û mîkro çirkeyan) agahî dihewîne. Ew dikare bi karanîna taybetmendiyên demjimêr, hûrdem, duyemîn û mîkro-saniyeyê ve were gihîştin.
Constructor ji bo dema object
Çêkerê objeya demê wiha ye.
time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)
Hemî vebijarkî ne, û heke ew ji holê rabin, ew li 0 têne danîn.
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
object timedelta
Tişta timedelta tiştek e ku cûdahiya demê di navbera du tarîx û deman de, an dema derbasbûyî de nîşan dide. Agahdariya wê di roj, çirk û mîkro çirkeyan de heye, û dikare bi taybetmendiyên roj, çirk û mîkrosaniyeyan ve were gihîştin. Di heman demê de gengaz e ku hûn bi karanîna rêbaza total_seconds() hejmara giştî ya saniyan bistînin.
Tiştên tarîx û tarîxê jê bikin da ku tiştê demdelta biafirînin.
Bi daxistina tiştên datetime ji hev û din objeyek timedelta peyda dike.
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
Jêbirina tiştên tarîxê ji hevûdu bi heman awayî nesneyek demdelta peyda dike.
Avaker ji bo object timedelta
Çêkera cewhera timedelta wiha ye
timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)
Hemî vebijarkî ne, û heke ew ji holê rabin, ew li 0 têne danîn.
Bala xwe bidinê ku tişta timedelta tenê agahdariya jêrîn digire.
- çend rojan:
days
- hejmara seconds:
seconds
- hejmartina mîkrosaniye:
microseconds
Ji bo nimûne, du jêrîn wekhev in
weeks=1
days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00
print(td_1w.days)
# 7
Jêkirin û lêzêdekirin bi karanîna tiştên demdelta
Tişta timedelta dikare bi hêmanên tarîx û tarîxê re were bikar anîn da ku karûbarên wekî jêkirin û zêdekirin pêk bîne. Mînakî, hûn dikarin bi hêsanî tarîxa hefteyek berê an 10 roj şûnda, an dema 50 hûrdem ji nuha ve bihesibînin û bistînin.
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
Di heman demê de ew dikare were bikar anîn da ku hejmara rojên heya rojek taybetî were hesibandin.
d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00
print(td.days)
# 903
strftime():Veguheztina ji tarîx û wextê ji rêzê
Rêbaza strftime() ya tarîx û tiştên tarîxê dikare were bikar anîn da ku agahdariya tarîx û demjimêrê (dîrok û dem) bi her formatê veguhezîne rêzek.
koda formatkirinê
Ji bo kodên formatkirinê yên berdest li belgeya fermî ya jêrîn binêrin.
Kodên formatkirinê yên sereke li jêr têne navnîş kirin.
%d
:Roja mehê bi nîşeya dehiyê bi sifir dagirtî.%m
:Meha bi nîşeya dehekî bi sifir dagirtî.%y
:Du reqemên paşîn ên salê di nîgara dehek dagirtî ya sifir de.%Y
:Çar reqemên salê bi nîşeya dehiyê bi sifir dagirtî.%H
:Dema ku bi nîşeya dehiyê bi sifirê dagirtî tê diyar kirin (nîşana 24 saetan)%I
:Dema ku bi nîşeya dehiyê bi sifir dagirtî tê diyar kirin (nîşana 12 saetan)%M
:Ji bo nîşankirina dehekî bi sifir dagirtî.%S
:Di nîşana dehiyê de çirkeyên bi sifir dagirtî.%f
:Mîkro çirkeyan (6 reqem) di nîşeya dehiyê de bi 0 dagirtî.%A
:Navê roja hefteyê ji bo herêmê%a
:Navê rojê ji bo herêmî (forma kurtkirî)%B
:Navê meha herêmî%b
:Navê meha herêmî (forma kurtkirî)%j
:Roja salê bi nîşana dehiyê bi dagirtina sifir.%U
:Hejmara hefteyê ya salê di nîşana dehiyê de bi dagirtina sifir (heftê roja Yekşemê dest pê dike)%W
:Hejmara hefteyê ya salê di nîşana dehiyê de bi dagirtina sifir (heftê roja Duşemê dest pê dike)
Kodên formatkirinê yên jêrîn ji bo navên roj û mehan dikarin li gorî cîhê bi rêzikên cûda werin wergirtin.
%A
%a
%B
%b
Ji bo rêzikên formata ISO 8601 jî rêbazek diyarkirî heye.
Koda Nimûne
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
Heger tu dixwazî ji dêvla rêzekê jimarekê bistînî, tenê wê bi int(-ê) veguhezîne jimareyek jimare.
week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>
Bi tevhevbûna bi objeya timedelta re, hêsan e ku meriv, mînakî, navnîşek tarîxên du-hefteyê bi her formatî biafirîne.
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
Bikaranîna navnîşa têgihîştina navnîşê jîrtir e.
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']
- Gotarên Têkildar:Bikaranîna nîşana têgihîştina navnîşa Python
strptime():Veguherîna ji rêzê ji bo dîrok û dem
datetime strptime() dikare were bikar anîn da ku ji rêzek tarîx an demjimêrek tiştek datetime were afirandin. Pêdivî ye ku rêzika formatkirinê ya ku bi rêzika orîjînal re têkildar e diyar bike.
Di heman demê de ji bo rêzikên ISO 8601 (Python 3.7 an nûtir) rêbazek veqetandî jî heye.
Koda Nimûne
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'>
Bi karanîna rêbaza strftime() li ser objekta datetime-ya hatî wergirtin, hûn dikarin tarîx û demjimêrê bi rengek cûda ji rêzika orîjînal temsîl bikin.
print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30
Ger hûn wê veguherînin objeyek datetime, hûn dikarin bi tiştên timedelta re jî operasyonan pêk bînin, ji ber vê yekê, mînakî, hûn dikarin rêzek tarîxa 10 roj berê bi heman formatê biafirînin.
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