ရက်စွဲများနှင့် အချိန်များကို Python datetime (strftime၊ strptime) တွင် လိုင်းများအဖြစ်သို့ ပြောင်းလဲခြင်း

စီးပွားရေးလုပ်ငန်း

Python ၏ standard library datetime ကို ရက်စွဲများနှင့် အချိန်များ (ရက်စွဲများ၊ အချိန်များနှင့် အချိန်များ) ကို လုပ်ဆောင်ရန် အသုံးပြုနိုင်သည်။ strftime() နှင့် strptime() တို့သည် ရက်စွဲများနှင့် အချိန်များကို စာကြောင်းများအဖြစ်သို့ ပြောင်းလဲပေးသော နည်းလမ်းများကို ဖော်မက်အမျိုးမျိုးဖြင့် ရက်စွဲများနှင့် အချိန်များကို စီမံခန့်ခွဲရန်အတွက် အသုံးပြုနိုင်ပါသည်။

နုတ်ခြင်းနှင့် ထပ်ပေါင်းခြင်းကဲ့သို့သော လုပ်ဆောင်ချက်များကိုလည်း လုပ်ဆောင်နိုင်သည်။ ဥပမာအားဖြင့်၊ သင်သည် လွန်ခဲ့သော 10 ရက် သို့မဟုတ် ယခုမှ 3 ပတ်အတွင်း ရက်စွဲကို အလွယ်တကူ တွက်ချက်နိုင်ပြီး ယခုမှ မိနစ် 50 အချိန်။

ပထမဦးစွာ၊ ကျွန်ုပ်တို့သည် datetime module တွင်ရရှိနိုင်သည့်အရာဝတ္ထုများ၏အောက်ပါအတန်းများကိုဖော်ပြပါမည်။

  • datetime.datetime:နေ့ရက်နှင့်အချိန် (ရက်စွဲနှင့်အချိန်)
  • datetime.date:ရက်စွဲ
  • datetime.time:အချိန်
  • datetime.timedelta:အချိန်နှင့် ကုန်လွန်သွားသော အချိန်ကွာခြားချက်

strftime() နှင့် strptime() တို့သည် date/time နှင့် string ကို တစ်ခုနှင့်တစ်ခုသို့ ပြောင်းပေးသော နည်းလမ်းများကိုလည်း ရှင်းပြထားပါသည်။

  • datetimeအရာဝတ္ထု
    • datetime.now():ယနေ့ရက်စွဲ၊ လက်ရှိအချိန်
    • datetimeObject Constructor
    • ရက်စွဲအချိန်အရာဝတ္တုကို ရက်စွဲအရာဝတ္ထုအဖြစ်သို့ ပြောင်းလဲခြင်း။
  • dateအရာဝတ္ထု
    • date.today():ယနေ့ရက်စွဲ
    • ရက်စွဲအရာဝတ္ထုအတွက် တည်ဆောက်သူ
  • timeအရာဝတ္ထု
    • အချိန်အရာဝတ္ထုအတွက် တည်ဆောက်သူ
  • timedeltaအရာဝတ္ထု
    • timedelta အရာဝတ္ထုများဖန်တီးရန် ရက်စွဲအချိန်နှင့် ရက်စွဲအရာဝတ္ထုများကို နုတ်ပါ။
    • timedelta အရာဝတ္ထုအတွက် တည်ဆောက်သူ
    • timedelta အရာဝတ္ထုများကို အသုံးပြု၍ နုတ်ခြင်းနှင့် ပေါင်းထည့်ခြင်း။
  • strftime():ရက်စွဲနှင့် အချိန်မှ စာကြောင်းသို့ ပြောင်းခြင်း။
  • strptime():စာကြောင်းမှ ရက်စွဲနှင့် အချိန်သို့ ပြောင်းလဲခြင်း။

စံပြစာကြည့်တိုက်တွင် ပါဝင်သော ပြက္ခဒိန် မော်ဂျူးသည် ရိုးရှင်းသော စာသား သို့မဟုတ် HTML ဖော်မတ်ဖြင့် ပြက္ခဒိန်များကို ထုတ်ပေးသည်။

datetime အရာဝတ္ထု

ရက်စွဲအချိန်အရာဝတ္ထုသည် ရက်စွဲ (နှစ်၊ လ၊ နေ့) နှင့် အချိန် (နာရီ၊ မိနစ်၊ စက္ကန့်၊ မိုက်ခရိုစက္ကန့်) အချက်အလက်များပါရှိသော အရာဝတ္ထုတစ်ခုဖြစ်သည်။ အဆိုပါအချက်အလက်များကို အောက်ပါအရည်အချင်းများဖြင့် သင်ဝင်ရောက်ကြည့်ရှုနိုင်ပါသည်။

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

datetime.now():ယနေ့ရက်စွဲ၊ လက်ရှိအချိန်

datetime.now() သည် သင့်အား ယနေ့ရက်စွဲ (လက်ရှိရက်စွဲ) နှင့် လက်ရှိအချိန်တို့နှင့်အတူ datetime object တစ်ခုကို ပေးပါမည်။

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 object အတွက် constructor

မတရားသော ရက်စွဲများနှင့် အချိန်များအတွက် datetime object များကိုလည်း ဖန်တီးနိုင်သည်။

datetime object အတွက် constructor မှာ အောက်ပါအတိုင်းဖြစ်သည်။

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

ရက်စွဲအချိန်အရာဝတ္တုကို ရက်စွဲအရာဝတ္ထုအဖြစ်သို့ ပြောင်းလဲခြင်း။

နောက်တွင်ဖော်ပြထားသည့်အတိုင်း date() method ဖြင့် datetime object တစ်ခုကို date object အဖြစ်သို့ ပြောင်းလဲနိုင်သည်။

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 object အတွက် constructor မှာ အောက်ပါအတိုင်းဖြစ်သည်။

date(year, month, day)

အားလုံးကို လိုအပ်ပြီး ချန်လှပ်၍မရပါ။

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

print(d.month)
# 2

အချိန်အရာဝတ္ထု

အချိန်အရာဝတ္ထုသည် အချိန် (နာရီ၊ မိနစ်၊ စက္ကန့်၊ နှင့် မိုက်ခရိုစက္ကန့်များ) နှင့်ပတ်သက်သော အချက်အလက်ပါရှိသော အရာဝတ္ထုတစ်ခုဖြစ်သည်။ ၎င်းကို attributes နာရီ၊ မိနစ်၊ စက္ကန့်နှင့် microsecond တို့ကို အသုံးပြု၍ ဝင်ရောက်နိုင်သည်။

အချိန်အရာဝတ္ထုအတွက် တည်ဆောက်သူ

time object ၏ constructor မှာ အောက်ပါအတိုင်းဖြစ်သည်။

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 အရာဝတ္ထုများကို နုတ်ခြင်းသည် 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 object ၏ constructor မှာ အောက်ပါအတိုင်းဖြစ်သည်။

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

၎င်းတို့အားလုံးကို စိတ်ကြိုက်ရွေးချယ်နိုင်ပြီး ၎င်းတို့ကို ချန်လှပ်ထားလျှင် ၎င်းတို့ကို 0 ဟု သတ်မှတ်ထားသည်။

timedelta အရာဝတ္ထုသည် အောက်ပါ အချက်အလက်များကိုသာ သိမ်းဆည်းထားကြောင်း သတိပြုပါ။

  • ရက်ပေါင်းများစွာ:days
  • စက္ကန့်အရေအတွက်:seconds
  • microsecond အရေအတွက်: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 object များနှင့်အတူ အသုံးပြုနိုင်သည်။ ဥပမာအားဖြင့်၊ သင်သည် လွန်ခဲ့သော တစ်ပတ်က ရက်စွဲကို အလွယ်တကူ တွက်ချက်နိုင်ပြီး သို့မဟုတ် ယခုမှ 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():ရက်စွဲနှင့် အချိန်မှ စာကြောင်းသို့ ပြောင်းခြင်း။

ရက်စွဲနှင့် ရက်စွဲအရာဝတ္ထုများ၏ strftime() နည်းလမ်းကို ရက်စွဲနှင့် အချိန် (ရက်စွဲနှင့် အချိန်) အချက်အလက်များကို မည်သည့်ဖော်မတ်ဖော်မတ်တွင် စာကြောင်းအဖြစ်သို့ ပြောင်းလဲရန် အသုံးပြုနိုင်သည်။

ဖော်မတ်ကုဒ်

ရရှိနိုင်သော ဖော်မတ်ကုဒ်များအတွက် အောက်ပါတရားဝင်စာရွက်စာတမ်းကို ကြည့်ပါ။

အဓိက ဖော်မတ်ကုဒ်များကို အောက်တွင် ဖော်ပြထားပါသည်။

  • %d:သုညဖြင့် လ၏နေ့ကို ဒဿမအမှတ်အသားဖြင့် ဖြည့်ထားသည်။
  • %m:သုညဖြင့် ဒဿမသင်္ကေတဖြင့် လ။
  • %y:သုညမပြည့်သော ဒဿမအမှတ်အသားဖြင့် နှစ်၏နောက်ဆုံးဂဏန်းနှစ်လုံး။
  • %Y:သုညဖြည့်ထားသော ဒဿမသင်္ကေတဖြင့် နှစ်၏ဂဏန်းလေးလုံး။
  • %H:သုညဖြင့် ဒဿမအမှတ်ဖြင့် ဖော်ပြသောအခါ (၂၄ နာရီစာအမှတ်)
  • %I:သုညဖြင့် ဒဿမအမှတ်သင်္ကေတဖြင့် ဖော်ပြသောအခါ (၁၂ နာရီစာအမှတ်)၊
  • %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

list comprehension notation ကိုအသုံးပြုခြင်းက ပိုစမတ်ကျပါတယ်။

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 object တစ်ခုကို ဖန်တီးရန်အတွက် date သို့မဟုတ် time string ကို အသုံးပြုနိုင်သည်။ မူရင်းစာကြောင်းနှင့် ကိုက်ညီသော ဖော်မတ်ချခြင်း စာကြောင်းကို သတ်မှတ်ရန် လိုအပ်သည်။

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 object ရှိ strftime() နည်းလမ်းကို အသုံးပြုခြင်းဖြင့်၊ သင်သည် မူရင်းစာကြောင်းထက် မတူညီသော ဖောမတ်ဖြင့် ရက်စွဲနှင့် အချိန်ကို ကိုယ်စားပြုနိုင်ပါသည်။

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

၎င်းကို datetime object တစ်ခုအဖြစ်သို့ ပြောင်းပါက၊ 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