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.

python
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:

text
2025-06-15 10:30:00
2025 6 15
10 30 0

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 3 (rapat = datetime(2025, 6, 15, 10, 30)): membuat object datetime untuk tanggal 15 Juni 2025 pukul 10:30; tiga argumen pertama wajib, sisanya opsional.
  2. Baris 5-6: print(rapat) menghasilkan format YYYY-MM-DD HH:MM:SS, dan seluruh komponen tanggal dapat dibaca lewat atribut year, month, day.
  3. Baris 7: komponen jam tersedia lewat atribut hour, minute, second (plus microsecond yang tidak dicetak di sini).

Object datetime juga dapat diurai kembali menjadi date dan time dari Chapter date dan time:

python
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:

text
2025-06-15
10:30:45
date time

Method 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 keywordPerlakuan saat normalisasi
weeksdikalikan 7, masuk ke unit days
daysunit dasar
hours, minutesdikonversi ke seconds
secondsunit dasar
millisecondsdikonversi ke microseconds
microsecondsunit dasar
python
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:

text
14 days, 0:00:00
7 days, 3:00:00
1:30:00
0:00:01.500000
-1 day, 23:00:00

Perhatikan 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:

python
from datetime import timedelta

durasi = timedelta(days=1, hours=25, minutes=90)
print(durasi)
print(durasi.days, durasi.seconds, durasi.microseconds)

Output yang Dihasilkan:

text
2 days, 2:30:00
2 9000 0

Total 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:

python
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:

text
2025-06-15 09:00:00
2025-06-15 11:45:00
2:45:00
9900.0

Mari kita telaah apa yang terjadi pada baris-baris kode di atas:

  1. Baris 4 (selesai = mulai + timedelta(...)): interpreter Python menggeser komponen jam object mulai sebesar 2 jam 45 menit dan membuat object datetime baru; object mulai tidak berubah.
  2. Baris 8 (print(selesai - mulai)): pengurangan dua datetime menghasilkan object timedelta, dicetak sebagai 2:45:00.
  3. Baris 9 (total_seconds()): method ini meratakan seluruh komponen durasi menjadi satu angka detik bertipe float — 2 jam 45 menit sama dengan 9900.0 detik.

Pola yang sama menjawab soal “berapa lama lagi menuju tenggat”:

python
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:

text
7 days, 0:00:00
7
604800.0

Mengubah 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:

python
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:

text
2025-06-15 10:30:00
2025-06-15 13:00:00

Object 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.