Hampir semua aplikasi bertemu tanggal: tanggal kedaluwarsa produk, tanggal lahir pengguna, atau jadwal tayang kampanye. Python memisahkan konsep “tanggal kalender” dan “jam dalam sehari” ke dalam dua class berbeda pada module datetime: date dan time. Chapter ini membedah cara membuat keduanya, membaca atributnya, membandingkan tanggal, serta satu sifat penting yang sering mengejutkan pemula: kedua class tersebut tidak dapat diubah setelah dibuat.
Membuat date dan time #
Class date menyimpan satu tanggal kalender tanpa jam dan tanpa zona waktu, sedangkan class time menyimpan jam dalam satu hari tanpa tanggal. Constructor keduanya memakai argumen posisi dengan urutan tetap: date(year, month, day) dan time(hour, minute, second). Saat constructor dipanggil, interpreter Python langsung memvalidasi nilai yang masuk — misalnya date(2025, 2, 30) gagal dengan ValueError karena tanggal 30 Februari tidak pernah ada.
Mari kita lihat wujudnya dalam kode:
from datetime import date, time
tanggal_rapat = date(2025, 6, 15)
jam_rapat = time(10, 30, 0)
print(tanggal_rapat)
print(tanggal_rapat.year, tanggal_rapat.month, tanggal_rapat.day)
print(jam_rapat)
print(jam_rapat.hour, jam_rapat.minute, jam_rapat.second)Output yang Dihasilkan:
2025-06-15
2025 6 15
10:30:00
10 30 0Mari kita telaah apa yang terjadi pada baris-baris kode di atas:
- Baris 1 (
from datetime import date, time): mengimpor dua class dari moduledatetime—dateuntuk tanggal kalender dantimeuntuk jam dalam sehari. - Baris 3 (
tanggal_rapat = date(2025, 6, 15)): membuat objectdateuntuk tanggal 15 Juni 2025; argumen diberikan dalam urutan tahun, bulan, tanggal. - Baris 4 (
jam_rapat = time(10, 30, 0)): membuat objecttimepukul 10 jam 30 menit 0 detik; semua argumen setelahhouropsional dengan nilai bawaan0. - Baris 6-7:
print()memanggilstr()pada object, yang menghasilkan format ISO2025-06-15, lalu mencetak ketiga atribut tanggal lewat akses titik. - Baris 9-10: hal yang sama dilakukan untuk object
timebeserta atribut jam-nya.
Method isoformat() menghasilkan string standar ISO 8601 — format inilah yang dipakai saat print() dipanggil secara langsung:
from datetime import date, time
print(date(2025, 6, 15).isoformat())
print(time(10, 30, 0).isoformat())
print(time(10, 30, 45, 500_000).isoformat())Output yang Dihasilkan:
2025-06-15
10:30:00
10:30:45.500000Perhatikan bahwa microsecond ikut tercetak hanya bila nilainya tidak nol, dan ditulis dengan enam digit.
Hari dalam Seminggu #
Dua method mengubah tanggal menjadi angka hari: weekday() mengikuti konvensi Python dengan Senin bernilai 0, sedangkan isoweekday() mengikuti standar ISO 8601 dengan Senin bernilai 1.
from datetime import date
tanggal_rapat = date(2025, 6, 15)
print(tanggal_rapat.weekday())
print(tanggal_rapat.isoweekday())Output yang Dihasilkan:
6
7Angka 6 dan 7 keduanya berarti Minggu: weekday() menomori Senin-Minggu dengan 0-6, sedangkan isoweekday() dengan 1-7. Tanggal 15 Juni 2025 memang jatuh pada hari Minggu. Versi mana yang dipakai bergantung kebutuhan — isoweekday() lebih cocok saat berhadapan dengan sistem eksternal yang mengikuti ISO 8601.
Tanggal Hari Ini dan Rentang yang Diizinkan #
Class date menyediakan classmethod today() yang mengembalikan tanggal saat ini menurut zona waktu sistem operasi:
>>> from datetime import date
>>> date.today()
datetime.date(2026, 10, 12)Nilai di atas adalah contoh ilustrasi — keluaran sebenarnya berubah setiap hari dan mengikuti tanggal di komputer Anda. Karena hasilnya bergantung pada mesin, kode pengujian sebaiknya memakai tanggal tetap seperti date(2025, 6, 15) alih-alih today(); topik ini kita bedah tuntas pada Chapter Menangani Waktu dengan Aman.
Rentang tanggal yang diizinkan Python sangat lebar namun berbatas, dari tahun 1 sampai tahun 9999:
from datetime import date, MINYEAR, MAXYEAR
print(date.min)
print(date.max)
print(MINYEAR, MAXYEAR)Output yang Dihasilkan:
0001-01-01
9999-12-31
1 9999date Adalah Object Immutable #
Object date dan time bersifat immutable: setelah dibuat, komponen di dalamnya tidak bisa diubah lewat penugasan. Simpan kode berikut sebagai ubah_tahun.py, lalu jalankan dengan python3 ubah_tahun.py:
from datetime import date
tanggal_rapat = date(2025, 6, 15)
tanggal_rapat.year = 2026
print(tanggal_rapat)Output yang Dihasilkan (dicetak interpreter Python ke stderr):
Traceback (most recent call last):
File "ubah_tahun.py", line 4, in <module>
tanggal_rapat.year = 2026
^^^^^^^^^^^^^^^^^^
AttributeError: attribute 'year' of 'datetime.date' objects is not writableInterpreter Python menolak penugasan tanggal_rapat.year = 2026 karena atribut year hanya bisa dibaca. Untuk “mengubah” tanggal, kita membuat object baru dengan method replace() yang mengembalikan salinan bernilai berbeda — cara kerjanya kita praktikkan pada Chapter datetime dan timedelta. Immutability ini bukan hambatan, melainkan jaminan: object tanggal yang sama dapat dipakai sebagai dictionary key atau dibagikan antar bagian program tanpa risiko berubah diam-diam.
Membandingkan Tanggal #
Operator perbandingan <, >, <=, >=, == bekerja langsung pada object date, dan function bawaan seperti min()/max() memanfaatkan aturan tersebut:
from datetime import date
deadline = date(2025, 6, 15)
dikumpulkan = date(2025, 6, 20)
print(deadline < dikumpulkan)
print(deadline == date(2025, 6, 15))
daftar_tugas = [date(2025, 6, 20), date(2025, 6, 15), date(2025, 6, 18)]
print(min(daftar_tugas))Output yang Dihasilkan:
True
True
2025-06-15Baris min(daftar_tugas) mencetak 2025-06-15 karena tanggal tersebut paling awal di antara ketiga object date. Dengan bekal class date dan time, kita siap menggabungkan keduanya menjadi satu object yang lebih lengkap.