Pag-convert ng mga petsa at oras papunta at mula sa mga string sa Python datetime (strftime, strptime)

Negosyo

Ang karaniwang oras ng aklatan ng Python ay maaaring gamitin upang iproseso ang mga petsa at oras (mga petsa, oras at oras). Ang mga pamamaraan na strftime() at strptime(), na nagko-convert ng mga petsa at oras sa at mula sa mga string, ay maaaring gamitin upang manipulahin ang mga petsa at oras sa iba’t ibang mga format.

Maaari rin itong magsagawa ng mga operasyon tulad ng pagbabawas at pagdaragdag. Halimbawa, madali mong kalkulahin at makuha ang petsa 10 araw ang nakalipas o 3 linggo mula ngayon, o ang oras 50 minuto mula ngayon.

Una, ilalarawan namin ang mga sumusunod na klase ng mga bagay na magagamit sa module ng datetime.

  • datetime.datetime:Petsa at oras (petsa at oras)
  • datetime.date:Petsa
  • datetime.time:Oras
  • datetime.timedelta:Pagkakaiba ng oras at lumipas na oras

Ang mga pamamaraan na strftime() at strptime(), na nagko-convert ng petsa/oras at string sa isa’t isa, ay ipinaliwanag din.

  • datetimebagay
    • datetime.now():Petsa ngayon, kasalukuyang oras
    • datetimeTagabuo ng Bagay
    • Pag-convert ng datetime object sa date object
  • datebagay
    • date.today():Petsa ngayon
    • Tagabuo para sa object ng petsa
  • timebagay
    • Tagabuo para sa bagay na oras
  • timedeltabagay
    • Ibawas ang datetime at date object para gumawa ng timedelta object.
    • Constructor para sa timedelta object
    • Pagbabawas at pagdaragdag gamit ang mga bagay na timedelta
  • strftime():Conversion mula sa petsa at oras sa string
  • strptime():Conversion mula sa string hanggang sa petsa at oras

Kasama rin sa karaniwang library ang module ng kalendaryo, na bumubuo ng mga kalendaryo sa plain text o HTML na format.

object ng datetime

Ang datetime object ay isang object na may parehong petsa (taon, buwan, araw) at oras (oras, minuto, segundo, microsecond) na impormasyon. Maa-access mo ang impormasyong iyon gamit ang mga sumusunod na katangian.

  • year
  • month
  • day
  • hour
  • minute
  • second
  • microsecond

datetime.now():Petsa ngayon, kasalukuyang oras

datetime.now() ay magbibigay sa iyo ng datetime object na may petsa ngayon (ang kasalukuyang petsa) at ang kasalukuyang oras.

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

Constructor para sa datetime object

Posible rin na bumuo ng mga datetime object para sa mga arbitrary na petsa at oras.

Ang constructor para sa datetime object ay ang mga sumusunod.

datetime(year, month, day, hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Ang mga sumusunod na halaga ay kinakailangan at ang iba ay maaaring tanggalin. Kung tinanggal, ang default na halaga ay 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

Pag-convert ng datetime object sa date object

Ang isang datetime object ay maaaring ma-convert sa isang date object sa pamamagitan ng date() method, gaya ng inilarawan sa susunod.

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

bagay sa petsa

Ang object ng petsa ay isang bagay na naglalaman ng impormasyon tungkol sa isang petsa (taon, buwan, araw). Maaari itong ma-access sa pamamagitan ng mga katangian ng taon, buwan, at araw.

date.today():Petsa ngayon

Ang object ng petsa ng kasalukuyang petsa (petsa ngayon) ay maaaring makuha gamit ang 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

Tagabuo para sa object ng petsa

Ang constructor para sa date object ay ang mga sumusunod

date(year, month, day)

Lahat ay kinakailangan at hindi maaaring tanggalin.

d = datetime.date(2018, 2, 1)
print(d)
# 2018-02-01

print(d.month)
# 2

bagay sa oras

Ang time object ay isang bagay na naglalaman ng impormasyon tungkol sa oras (oras, minuto, segundo, at microsecond). Maaari itong ma-access gamit ang mga katangiang oras, minuto, segundo, at microsecond.

Tagabuo para sa bagay na oras

Ang constructor ng time object ay ang mga sumusunod.

time(hour=0, minute=0, second=0, microsecond=0, tzinfo=None)

Lahat ng mga ito ay opsyonal, at kung aalisin ang mga ito, itatakda ang mga ito sa 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

bagay na timedelta

Ang timedelta object ay isang bagay na kumakatawan sa pagkakaiba ng oras sa pagitan ng dalawang petsa at oras, o ang lumipas na oras. Mayroon itong impormasyon sa mga araw, segundo, at microsecond, at maaaring ma-access ng mga attribute na araw, segundo, at microsecond. Posible ring makuha ang kabuuang bilang ng mga segundo gamit ang total_seconds() na pamamaraan.

Ibawas ang datetime at date object para gumawa ng timedelta object.

Ang pagbabawas ng mga datetime object mula sa isa’t isa ay magbubunga ng timedelta object.

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

Ang pagbabawas ng mga bagay sa petsa mula sa isa’t isa ay katulad na nagbubunga ng isang timedelta object.

Constructor para sa timedelta object

Ang constructor ng timedelta object ay ang mga sumusunod

timedelta(days=0, seconds=0, microseconds=0, milliseconds=0, minutes=0, hours=0, weeks=0)

Lahat ng mga ito ay opsyonal, at kung aalisin ang mga ito, itatakda ang mga ito sa 0.

Tandaan na ang bagay na timedelta ay nagtataglay lamang ng sumusunod na impormasyon.

  • ilang araw:days
  • bilang ng mga segundo:seconds
  • bilang ng microsecond:microseconds

Halimbawa, ang sumusunod na dalawa ay pantay

  • weeks=1
  • days=7
td_1w = datetime.timedelta(weeks=1)
print(td_1w)
# 7 days, 0:00:00

print(td_1w.days)
# 7

Pagbabawas at pagdaragdag gamit ang mga bagay na timedelta

Maaaring gamitin ang timedelta object kasama ang datetime at date object para magsagawa ng mga operasyon gaya ng pagbabawas at pagdaragdag. Halimbawa, madali mong kalkulahin at makuha ang petsa isang linggo na ang nakalipas o 10 araw mula ngayon, o ang oras 50 minuto mula ngayon.

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

Maaari din itong gamitin upang kalkulahin ang bilang ng mga araw hanggang sa isang tiyak na petsa.

d_target = datetime.date(2020, 7, 24)
td = d_target - d_today
print(td)
# 903 days, 0:00:00

print(td.days)
# 903

strftime():Conversion mula sa petsa at oras sa string

Ang strftime() na paraan ng datetime at date object ay maaaring gamitin upang i-convert ang petsa at oras (petsa at oras) na impormasyon sa isang string sa anumang format na format.

code sa pag-format

Tingnan ang opisyal na dokumentasyon sa ibaba para sa mga available na formatting code.

Ang mga pangunahing formatting code ay nakalista sa ibaba.

  • %d:Araw ng buwan sa decimal notation na may zero filled.
  • %m:Buwan sa decimal notation na may zero filled.
  • %y:Ang huling dalawang digit ng taon sa zero-filled decimal notation.
  • %Y:Apat na digit ng taon sa decimal notation na may zero filled.
  • %H:Kapag ipinahayag sa decimal notation na may zero filled (24-hour notation)
  • %I:Kapag ipinahayag sa decimal notation na may zero filled (12-hour notation)
  • %M:Para sa decimal notation na may zero filled.
  • %S:Mga segundo sa decimal notation na may zero filled.
  • %f:Microseconds (6 na digit) sa decimal notation na may 0 na napunan.
  • %A:Pangalan ng araw ng linggo para sa lokal
  • %a:Pangalan ng araw para sa lokal (pinaikling anyo)
  • %B:Pangalan ng buwan ng lokal
  • %b:Pangalan ng buwan ng lokal (pinaikling anyo)
  • %j:Araw ng taon sa decimal notation na may zero fill.
  • %U:Numero ng linggo ng taon sa decimal notation na may zero fill (magsisimula ang linggo sa Linggo)
  • %W:Numero ng linggo ng taon sa decimal notation na may zero fill (magsisimula ang linggo sa Lunes)

Ang mga sumusunod na code sa pag-format para sa mga pangalan ng araw at buwan ay maaaring makuha sa iba’t ibang mga string depende sa lokal.

  • %A
  • %a
  • %B
  • %b

Mayroon ding nakalaang paraan para sa ISO 8601 format string.

Halimbawang Code

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

Kung gusto mong makakuha ng numero sa halip na isang string, i-convert lang ito sa isang integer na may int().

week_num_mon = int(d_today.strftime('%W'))
print(week_num_mon)
print(type(week_num_mon))
# 5
# <class 'int'>

Sa kumbinasyon ng timedelta object, madaling gumawa, halimbawa, isang listahan ng mga biweekly na petsa sa anumang format.

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

Ang paggamit ng notasyon sa pag-unawa sa listahan ay mas matalino.

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():Conversion mula sa string hanggang sa petsa at oras

datetime strptime() ay maaaring gamitin upang lumikha ng isang datetime object mula sa isang string ng petsa o oras. Kinakailangang tukuyin ang pag-format ng string na naaayon sa orihinal na string.

Mayroon ding nakalaang pamamaraan para sa ISO 8601 string (Python 3.7 o mas bago).

Halimbawang Code

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

Sa pamamagitan ng paggamit ng strftime() method sa nakuhang datetime object, maaari mong katawanin ang petsa at oras sa ibang format kaysa sa orihinal na string.

print(date_dt.strftime('%Y-%m-%d %H:%M'))
# 2018-02-01 12:30

Kung iko-convert mo ito sa isang datetime object, maaari ka ring magsagawa ng mga operasyon sa mga timedelta object, kaya halimbawa, maaari kang bumuo ng string ng isang petsa 10 araw na ang nakalipas sa parehong format.

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