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 объект үүсгэхийн тулд огноо, огнооны объектуудыг хасна уу.
    • Timedelta объектын бүтээгч
    • Timedelta объектуудыг ашиглан хасах, нэмэх
  • strftime():Огноо, цагийг мөр рүү хөрвүүлэх
  • strptime():Мөрөөс огноо, цаг руу хөрвүүлэх

Мөн стандарт номын санд календарийн модуль багтсан бөгөөд энэ нь энгийн текст эсвэл HTML форматаар хуанли үүсгэдэг.

огноо цагийн объект

Огноо (жил, сар, өдөр) болон цаг (цаг, минут, секунд, микросекунд) гэсэн хоёр мэдээлэлтэй объектыг огноо цагийн объект гэнэ. Та эдгээр мэдээлэлд дараах шинж чанаруудыг ашиглан хандах боломжтой.

  • 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 объектуудыг бие биенээсээ хасвал 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():Огноо, цагийг мөр рүү хөрвүүлэх

Datetime болон огнооны объектуудын 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