Veguherandina tarîx û demjimêran ji rêzan û ji rêzikên di dîroka Python de (strftime, strptime)

Dikan

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:Rojek
  • datetime.time:Dem
  • datetime.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.

  • datetimetişt
    • datetime.now():Dîroka îro, dema niha
    • datetimeObject Constructor
    • Veguherandina objeyek datetime bo objeya date
  • datetişt
    • date.today():Dîroka îro
    • Avaker ji bo objeya tarîxê
  • timetişt
    • Constructor ji bo dema object
  • timedeltatiş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']

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
Copied title and URL