Python datetime жолындағы күндер мен уақыттарды түрлендіру (strftime, strptime)

Іскерлік

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объект
    • Timedelta нысандарын жасау үшін datetime және date нысандарын шегеріңіз.
    • timedelta нысаны үшін конструктор
    • Timedelta нысандарын пайдаланып алу және қосу
  • strftime():Күн мен уақыттан жолға түрлендіру
  • strptime():Жолдан күн мен уақытқа түрлендіру

Сондай-ақ стандартты кітапханаға күнтізбелік модуль кіреді, ол кәдімгі мәтін немесе HTML пішімінде күнтізбелерді жасайды.

datetime нысаны

Дата-time объектісі – бұл күні (жыл, ай, күн) және уақыт (сағат, минут, секунд, микросекунд) ақпараты бар нысан. Сіз бұл ақпаратқа келесі атрибуттармен қол жеткізе аласыз.

  • 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(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() әдісі арқылы жалпы секунд санын алуға болады.

timedelta нысанын жасау үшін datetime және date нысандарын шегеріңіз.

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():Күн мен уақыттан жолға түрлендіру

Datetime және date нысандарының strftime() әдісін күн мен уақытты (күн мен уақыт) кез келген пішімдегі жолға түрлендіру үшін пайдалануға болады.

пішімдеу коды

Қол жетімді пішімдеу кодтары үшін төмендегі ресми құжаттаманы қараңыз.

Негізгі пішімдеу кодтары төменде берілген.

  • %d:Ондық жүйеде нөлмен толтырылған ай күні.
  • %m:Нөлмен толтырылған ондық жүйедегі ай.
  • %y:Нөлмен толтырылған ондық санау жүйесіндегі жылдың соңғы екі цифры.
  • %Y:Ондық жүйеде нөлмен толтырылған жылдың төрт цифры.
  • %H:Нөлмен толтырылған ондық санау жүйесінде көрсетілгенде (24 сағаттық белгі)
  • %I:Нөлмен толтырылған ондық санау жүйесінде көрсетілгенде (12 сағаттық белгі)
  • %M:Нөл толтырылған ондық санау үшін.
  • %S:Нөлмен толтырылған ондық санаудағы секундтар.
  • %f:0 толтырылған ондық санау жүйесіндегі микросекундтар (6 цифр).
  • %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']

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'>

Алынған datetime нысанында strftime() әдісін пайдалану арқылы сіз күн мен уақытты бастапқы жолдан басқа пішімде көрсете аласыз.

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