Menukar tarikh dan masa kepada dan dari rentetan dalam Python datetime (strftime, strptime)

Perniagaan

Waktu tarikh perpustakaan standard Python boleh digunakan untuk memproses tarikh dan masa (tarikh, masa dan masa). Kaedah strftime() dan strptime(), yang menukar tarikh dan masa kepada dan daripada rentetan, boleh digunakan untuk memanipulasi tarikh dan masa dalam pelbagai format.

Ia juga boleh melakukan operasi seperti tolak dan tambah. Sebagai contoh, anda boleh mengira dan mendapatkan tarikh dengan mudah 10 hari yang lalu atau 3 minggu dari sekarang, atau masa 50 minit dari sekarang.

Pertama, kami akan menerangkan kelas objek berikut yang tersedia dalam modul datetime.

  • datetime.datetime:Tarikh dan masa (tarikh dan masa)
  • datetime.date:Tarikh
  • datetime.time:Masa
  • datetime.timedelta:Perbezaan masa dan masa berlalu

Kaedah strftime() dan strptime(), yang menukar tarikh/masa dan rentetan antara satu sama lain, juga dijelaskan.

  • datetimeobjek
    • datetime.now():Tarikh hari ini, masa semasa
    • datetimePembina Objek
    • Menukar objek datetime kepada objek tarikh
  • dateobjek
    • date.today():Tarikh hari ini
    • Pembina untuk objek tarikh
  • timeobjek
    • Pembina untuk objek masa
  • timedeltaobjek
    • Tolak objek datetime dan date untuk mencipta objek timedelta.
    • Pembina untuk objek timedelta
    • Penolakan dan penambahan menggunakan objek timedelta
  • strftime():Penukaran dari tarikh dan masa kepada rentetan
  • strptime():Penukaran daripada rentetan kepada tarikh dan masa

Turut disertakan dalam pustaka standard ialah modul kalendar, yang menjana kalendar dalam teks biasa atau format HTML.

objek datetime

Objek datetime ialah objek yang mempunyai maklumat tarikh (tahun, bulan, hari) dan masa (jam, minit, saat, mikrosaat). Anda boleh mengakses maklumat tersebut dengan atribut berikut.

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

datetime.now():Tarikh hari ini, masa semasa

datetime.now() akan memberi anda objek datetime dengan tarikh hari ini (tarikh semasa) dan masa semasa.

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

Pembina untuk objek datetime

Ia juga mungkin untuk menjana objek datetime untuk tarikh dan masa sewenang-wenangnya.

Pembina untuk objek datetime adalah seperti berikut.

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

Nilai berikut diperlukan dan nilai lain boleh ditinggalkan. Jika ditinggalkan, nilai lalai ialah 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

Menukar objek datetime kepada objek tarikh

Objek datetime boleh ditukar kepada objek tarikh dengan kaedah date(), seperti yang diterangkan seterusnya.

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

objek tarikh

Objek tarikh ialah objek yang mengandungi maklumat tentang tarikh (tahun, bulan, hari). Ia boleh diakses dengan atribut tahun, bulan dan hari.

date.today():Tarikh hari ini

Objek tarikh tarikh semasa (tarikh hari ini) boleh diperolehi dengan 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

Pembina untuk objek tarikh

Pembina untuk objek tarikh adalah seperti berikut

date(year, month, day)

Semuanya diperlukan dan tidak boleh ditinggalkan.

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

print(d.month)
# 2

objek masa

Objek masa ialah objek yang mengandungi maklumat tentang masa (jam, minit, saat dan mikrosaat). Ia boleh diakses menggunakan atribut jam, minit, saat dan mikrosaat.

Pembina untuk objek masa

Pembina objek masa adalah seperti berikut.

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

Kesemuanya adalah pilihan, dan jika ia ditinggalkan, ia ditetapkan kepada 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

objek timedelta

Objek timedelta ialah objek yang mewakili perbezaan masa antara dua tarikh dan masa, atau masa berlalu. Ia mempunyai maklumat dalam hari, saat dan mikrosaat, dan boleh diakses oleh atribut hari, saat dan mikrosaat. Ia juga mungkin untuk mendapatkan jumlah bilangan saat menggunakan kaedah total_seconds().

Tolak objek datetime dan date untuk mencipta objek timedelta.

Menolak objek datetime antara satu sama lain menghasilkan objek 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

Penolakan objek tarikh antara satu sama lain juga menghasilkan objek timedelta.

Pembina untuk objek timedelta

Pembina objek timedelta adalah seperti berikut

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

Kesemuanya adalah pilihan, dan jika ia ditinggalkan, ia ditetapkan kepada 0.

Ambil perhatian bahawa objek timedelta hanya memegang maklumat berikut.

  • beberapa hari:days
  • bilangan saat:seconds
  • kiraan mikrosaat:microseconds

Sebagai contoh, dua berikut adalah sama

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

print(td_1w.days)
# 7

Penolakan dan penambahan menggunakan objek timedelta

Objek timedelta boleh digunakan dengan objek datetime dan tarikh untuk melakukan operasi seperti penolakan dan penambahan. Sebagai contoh, anda boleh mengira dan mendapatkan tarikh dengan mudah seminggu yang lalu atau 10 hari dari sekarang, atau masa 50 minit dari sekarang.

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

Ia juga boleh digunakan untuk mengira bilangan hari sehingga tarikh tertentu.

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

print(td.days)
# 903

strftime():Penukaran dari tarikh dan masa kepada rentetan

Kaedah strftime() bagi objek datetime dan tarikh boleh digunakan untuk menukar maklumat tarikh dan masa (tarikh dan masa) ke dalam rentetan dalam sebarang format format.

kod pemformatan

Lihat dokumentasi rasmi di bawah untuk kod pemformatan yang tersedia.

Kod pemformatan utama disenaraikan di bawah.

  • %d:Hari dalam bulan dalam tatatanda perpuluhan dengan sifar diisi.
  • %m:Bulan dalam tatatanda perpuluhan dengan sifar diisi.
  • %y:Dua digit terakhir tahun dalam tatatanda perpuluhan penuh sifar.
  • %Y:Empat digit tahun dalam tatatanda perpuluhan dengan sifar diisi.
  • %H:Apabila dinyatakan dalam tatatanda perpuluhan dengan diisi sifar (notasi 24 jam)
  • %I:Apabila dinyatakan dalam tatatanda perpuluhan dengan sifar diisi (notasi 12 jam)
  • %M:Untuk tatatanda perpuluhan dengan sifar diisi.
  • %S:Saat dalam tatatanda perpuluhan dengan sifar diisi.
  • %f:Mikrosaat (6 digit) dalam tatatanda perpuluhan dengan 0 diisi.
  • %A:Nama hari dalam seminggu untuk tempat tersebut
  • %a:Nama hari untuk tempat (bentuk singkatan)
  • %B:Nama bulan tempatan
  • %b:Nama bulan tempatan (bentuk singkatan)
  • %j:Hari dalam tahun dalam tatatanda perpuluhan dengan isian sifar.
  • %U:Nombor minggu tahun dalam tatatanda perpuluhan dengan isian sifar (minggu bermula pada hari Ahad)
  • %W:Nombor minggu tahun dalam tatatanda perpuluhan dengan isian sifar (minggu bermula pada hari Isnin)

Kod pemformatan berikut untuk nama hari dan bulan boleh diperolehi dalam rentetan berbeza bergantung pada tempat.

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

Terdapat juga kaedah khusus untuk rentetan format ISO 8601.

Kod Contoh

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

Jika anda ingin mendapatkan nombor dan bukannya rentetan, cuma tukarkannya kepada integer dengan int().

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

Dalam kombinasi dengan objek timedelta, adalah mudah untuk mencipta, sebagai contoh, senarai tarikh dua mingguan dalam sebarang 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

Menggunakan tatatanda pemahaman senarai adalah lebih bijak.

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():Penukaran daripada rentetan kepada tarikh dan masa

datetime strptime() boleh digunakan untuk mencipta objek datetime daripada rentetan tarikh atau masa. Ia adalah perlu untuk menentukan rentetan pemformatan yang sepadan dengan rentetan asal.

Terdapat juga kaedah khusus untuk rentetan ISO 8601 (Python 3.7 atau lebih baru).

Kod Contoh

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

Dengan menggunakan kaedah strftime() pada objek datetime yang diambil, anda boleh mewakili tarikh dan masa dalam format yang berbeza daripada rentetan asal.

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

Jika anda menukarnya kepada objek datetime, anda juga boleh melakukan operasi dengan objek timedelta, jadi sebagai contoh, anda boleh menjana rentetan tarikh 10 hari yang lalu dalam format yang sama.

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