Seorang peserta mendaftar webinar pada 15 Juni 2025 pukul 10:30 — informasi tanggal saja tidak cukup, kita butuh object yang menyimpan keduanya sekaligus. Sebaliknya, pertanyaan “berapa lama lagi menuju tenggat?” menuntut tipe data khusus untuk durasi. Python menjawab dua kebutuhan itu dengan class datetime (tanggal plus jam) dan class timedelta (selisih waktu). Chapter ini membedah cara kerja keduanya beserta operasi aritmetikanya.
Class datetime: Tanggal Plus Jam #
Class datetime adalah gabungan date dan time: constructor-nya menerima tahun, bulan, tanggal, lalu jam, menit, detik — komponen jam boleh dilewati dan otomatis bernilai nol.
from datetime import datetime
rapat = datetime(2025, 6, 15, 10, 30)
print(rapat)
print(rapat.year, rapat.month, rapat.day)
print(rapat.hour, rapat.minute, rapat.second)Output yang Dihasilkan:
2025-06-15 10:30:00
2025 6 15
10 30 0Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 3 (
rapat = datetime(2025, 6, 15, 10, 30)): membuat objectdatetimeuntuk tanggal 15 Juni 2025 pukul 10:30; tiga argumen pertama wajib, sisanya opsional. - Baris 5-6:
print(rapat)menghasilkan formatYYYY-MM-DD HH:MM:SS, dan seluruh komponen tanggal dapat dibaca lewat atributyear,month,day. - Baris 7: komponen jam tersedia lewat atribut
hour,minute,second(plusmicrosecondyang tidak dicetak di sini).
Object datetime juga dapat diurai kembali menjadi date dan time dari Chapter date dan time:
from datetime import datetime
rapat = datetime(2025, 6, 15, 10, 30, 45)
print(rapat.date())
print(rapat.time())
print(type(rapat.date()).__name__, type(rapat.time()).__name__)Output yang Dihasilkan:
2025-06-15
10:30:45
date timeMethod date() dan time() masing-masing mengembalikan object baru yang berisi hanya komponen tanggal atau hanya komponen jam dari object datetime aslinya.
timedelta: Durasi Antar Waktu #
Class timedelta merepresentasikan durasi — bukan titik waktu. Constructor-nya menerima argumen keyword weeks, days, hours, minutes, seconds, milliseconds, dan microseconds, lalu menormalkannya menjadi tiga unit dasar: hari, detik, dan mikrodetik.
| Argumen keyword | Perlakuan saat normalisasi |
|---|---|
weeks | dikalikan 7, masuk ke unit days |
days | unit dasar |
hours, minutes | dikonversi ke seconds |
seconds | unit dasar |
milliseconds | dikonversi ke microseconds |
microseconds | unit dasar |
from datetime import timedelta
print(timedelta(weeks=2))
print(timedelta(days=7, hours=3))
print(timedelta(minutes=90))
print(timedelta(seconds=1, milliseconds=500))
print(timedelta(hours=-1))Output yang Dihasilkan:
14 days, 0:00:00
7 days, 3:00:00
1:30:00
0:00:01.500000
-1 day, 23:00:00Perhatikan baris terakhir: durasi negatif timedelta(hours=-1) dinormalkan menjadi -1 day, 23:00:00 — interpreter Python menyimpan durasi dengan komponen hari dan sisa detik nonnegatif. Normalisasi penuh terlihat pada atribut days, seconds, dan microseconds:
from datetime import timedelta
durasi = timedelta(days=1, hours=25, minutes=90)
print(durasi)
print(durasi.days, durasi.seconds, durasi.microseconds)Output yang Dihasilkan:
2 days, 2:30:00
2 9000 0Total 1 hari + 25 jam + 90 menit dirangkum menjadi 2 hari dan sisa 2 jam 30 menit; atribut seconds bernilai 9000 detik (= 2 jam 30 menit). Nilai negatif ditampilkan secara “dipinjam” dari hari, sehingga ketiga atribut utamanya selalu nonnegatif untuk durasi positif.
Aritmetika Waktu #
Operator + dan - menghubungkan datetime dan timedelta. Menambahkan durasi ke titik waktu menghasilkan titik waktu baru; mengurangkan dua titik waktu menghasilkan durasi:
from datetime import datetime, timedelta
mulai = datetime(2025, 6, 15, 9, 0)
selesai = mulai + timedelta(hours=2, minutes=45)
print(mulai)
print(selesai)
print(selesai - mulai)
print((selesai - mulai).total_seconds())Output yang Dihasilkan:
2025-06-15 09:00:00
2025-06-15 11:45:00
2:45:00
9900.0Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 4 (
selesai = mulai + timedelta(...)): interpreter Python menggeser komponen jam objectmulaisebesar 2 jam 45 menit dan membuat objectdatetimebaru; objectmulaitidak berubah. - Baris 8 (
print(selesai - mulai)): pengurangan duadatetimemenghasilkan objecttimedelta, dicetak sebagai2:45:00. - Baris 9 (
total_seconds()): method ini meratakan seluruh komponen durasi menjadi satu angka detik bertipefloat— 2 jam 45 menit sama dengan 9900.0 detik.
Pola yang sama menjawab soal “berapa lama lagi menuju tenggat”:
from datetime import datetime
deadline = datetime(2025, 6, 22, 10, 30)
sekarang = datetime(2025, 6, 15, 10, 30)
sisa = deadline - sekarang
print(sisa)
print(sisa.days)
print(sisa.total_seconds())Output yang Dihasilkan:
7 days, 0:00:00
7
604800.0Mengubah Komponen dengan replace #
Menyesuaikan sifat immutable dari Chapter date dan time, method replace() tidak mengubah object lama melainkan mengembalikan object datetime baru dengan komponen yang ditukar:
from datetime import datetime
rapat = datetime(2025, 6, 15, 10, 30)
diundur = rapat.replace(hour=13, minute=0)
print(rapat)
print(diundur)Output yang Dihasilkan:
2025-06-15 10:30:00
2025-06-15 13:00:00Object rapat tetap bernilai 10:30 karena replace() membuat salinan baru bernama diundur dengan jam 13:00. Dua angka 10:30 pada dua kota berbeda bisa menunjuk momen yang berbeda pula — ambiguitas inilah yang dibasmi konsep timezone pada Chapter Timezone-Aware datetime.