ការបំប្លែងកាលបរិច្ឆេទ និងម៉ោងទៅ និងពីខ្សែអក្សរក្នុង Python datetime (strftime, strptime)

អាជីវកម្ម

កាលបរិច្ឆេទបណ្ណាល័យស្តង់ដាររបស់ Python អាចត្រូវបានប្រើដើម្បីដំណើរការកាលបរិច្ឆេទ និងពេលវេលា (កាលបរិច្ឆេទ ពេលវេលា និងពេលវេលា)។ វិធីសាស្ត្រ strftime() និង strptime() ដែលបំប្លែងកាលបរិច្ឆេទ និងពេលវេលាទៅជា និងពីខ្សែអក្សរ អាចត្រូវបានប្រើដើម្បីរៀបចំកាលបរិច្ឆេទ និងពេលវេលាក្នុងទម្រង់ផ្សេងៗគ្នា។

វាក៏អាចអនុវត្តប្រតិបត្តិការដូចជា ដក និងបូក។ ឧទាហរណ៍ អ្នកអាចគណនាយ៉ាងងាយស្រួល និងទទួលបានកាលបរិច្ឆេទ 10 ថ្ងៃមុន ឬ 3 សប្តាហ៍ចាប់ពីពេលនេះ ឬ 50 នាទីពីឥឡូវនេះ។

ដំបូង យើងនឹងពណ៌នាអំពីថ្នាក់ខាងក្រោមនៃវត្ថុដែលមាននៅក្នុងម៉ូឌុលកាលបរិច្ឆេទ។

  • datetime.datetime:កាលបរិច្ឆេទ និងពេលវេលា (កាលបរិច្ឆេទ និងពេលវេលា)
  • datetime.date:កាលបរិច្ឆេទ
  • datetime.time:ពេលវេលា
  • datetime.timedelta:ភាពខុសគ្នានៃពេលវេលានិងពេលវេលាកន្លងផុតទៅ

វិធីសាស្ត្រ strftime() និង strptime() ដែលបំប្លែងកាលបរិច្ឆេទ/ពេលវេលា និងខ្សែអក្សរទៅគ្នាទៅវិញទៅមក ក៏ត្រូវបានពន្យល់ផងដែរ។

  • datetimeវត្ថុ
    • datetime.now():កាលបរិច្ឆេទថ្ងៃនេះ ពេលវេលាបច្ចុប្បន្ន
    • datetimeអ្នកសាងសង់វត្ថុ
    • ការបំប្លែងវត្ថុកាលបរិច្ឆេទទៅវត្ថុកាលបរិច្ឆេទ
  • dateវត្ថុ
    • date.today():កាលបរិច្ឆេទ​ថ្ងៃ​នេះ
    • អ្នកបង្កើតសម្រាប់វត្ថុកាលបរិច្ឆេទ
  • timeវត្ថុ
    • អ្នកសាងសង់សម្រាប់វត្ថុពេលវេលា
  • timedeltaវត្ថុ
    • ដកវត្ថុកាលបរិច្ឆេទ និងកាលបរិច្ឆេទដើម្បីបង្កើតវត្ថុ timedelta ។
    • អ្នកបង្កើតសម្រាប់វត្ថុ timedelta
    • ការដកនិងបូកដោយប្រើវត្ថុ timedelta
  • strftime():ការបំប្លែងពីកាលបរិច្ឆេទ និងពេលវេលាទៅជាខ្សែអក្សរ
  • strptime():ការបំប្លែងពីខ្សែអក្សរទៅកាលបរិច្ឆេទ និងពេលវេលា

រួមបញ្ចូលផងដែរនៅក្នុងបណ្ណាល័យស្តង់ដារគឺម៉ូឌុលប្រតិទិនដែលបង្កើតប្រតិទិនជាអត្ថបទធម្មតាឬទម្រង់ HTML ។

វត្ថុកាលបរិច្ឆេទ

វត្ថុកាលបរិច្ឆេទគឺជាវត្ថុដែលមានទាំងកាលបរិច្ឆេទ (ឆ្នាំ ខែ ថ្ងៃ) និងម៉ោង (ម៉ោង នាទី វិនាទី មីក្រូវិនាទី) ។ អ្នកអាចចូលប្រើព័ត៌មានទាំងនោះដោយប្រើលក្ខណៈដូចខាងក្រោម។

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

datetime.now():កាលបរិច្ឆេទថ្ងៃនេះ ពេលវេលាបច្ចុប្បន្ន

datetime.now() នឹងផ្តល់ឱ្យអ្នកនូវកាលបរិច្ឆេទកាលបរិច្ឆេទជាមួយកាលបរិច្ឆេទថ្ងៃនេះ (កាលបរិច្ឆេទបច្ចុប្បន្ន) និងពេលវេលាបច្ចុប្បន្ន។

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(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() ដូចដែលបានពិពណ៌នាបន្ទាប់។

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 ។

ការដកវត្ថុកាលបរិច្ឆេទកាលបរិច្ឆេទពីគ្នាទៅវិញទៅមកផ្តល់ផលវត្ថុ 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 អាច​ត្រូវ​បាន​ប្រើ​ជា​មួយ​នឹង​វត្ថុ​កាលបរិច្ឆេទ និង​កាលបរិច្ឆេទ​ដើម្បី​ធ្វើ​ប្រតិបត្តិការ​ដូចជា​ការ​ដក និង​បូក។ ឧទាហរណ៍ អ្នកអាចគណនាយ៉ាងងាយស្រួល និងទទួលបានកាលបរិច្ឆេទមួយសប្តាហ៍មុន ឬ 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:ពេល​បង្ហាញ​ក្នុង​សញ្ញា​គោល​ដប់​ដោយ​សូន្យ​បំពេញ (សញ្ញាណ 24 ម៉ោង)
  • %I:ពេល​បង្ហាញ​ក្នុង​សញ្ញា​គោល​ដប់​ដោយ​សូន្យ​បំពេញ (សញ្ញាណ 12 ម៉ោង)
  • %M:សម្រាប់​សញ្ញា​គោល​ដប់​ដែល​មាន​សូន្យ​បំពេញ។
  • %S:វិនាទី​ក្នុង​សញ្ញា​គោល​ដប់​ដែល​មាន​សូន្យ​បំពេញ។
  • %f:មីក្រូវិនាទី (6 ខ្ទង់) ក្នុងសញ្ញាគោលដប់ជាមួយ 0 បំពេញ។
  • %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() អាច​ត្រូវ​បាន​ប្រើ​ដើម្បី​បង្កើត​វត្ថុ​កាលបរិច្ឆេទ​ពី​ខ្សែ​កាលបរិច្ឆេទ​ឬ​ម៉ោង។ វាចាំបាច់ដើម្បីបញ្ជាក់ខ្សែអក្សរធ្វើទ្រង់ទ្រាយដែលត្រូវគ្នានឹងខ្សែអក្សរដើម។

វាក៏មានវិធីសាស្រ្តពិសេសសម្រាប់ខ្សែអក្សរ 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'>

ដោយប្រើវិធីសាស្ត្រ strftime() នៅលើវត្ថុកាលបរិច្ឆេទដែលបានទាញយក អ្នកអាចតំណាងឱ្យកាលបរិច្ឆេទ និងពេលវេលាក្នុងទម្រង់ផ្សេងពីខ្សែអក្សរដើម។

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

ប្រសិនបើអ្នកបំប្លែងវាទៅជាវត្ថុកាលបរិច្ឆេទ អ្នកក៏អាចអនុវត្តប្រតិបត្តិការជាមួយវត្ថុ 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