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:

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

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

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

  1. Baris 1 (from datetime import date, time): mengimpor dua class dari module datetime — date untuk tanggal kalender dan time untuk jam dalam sehari.
  2. Baris 3 (tanggal_rapat = date(2025, 6, 15)): membuat object date untuk tanggal 15 Juni 2025; argumen diberikan dalam urutan tahun, bulan, tanggal.
  3. Baris 4 (jam_rapat = time(10, 30, 0)): membuat object time pukul 10 jam 30 menit 0 detik; semua argumen setelah hour opsional dengan nilai bawaan 0.
  4. Baris 6-7: print() memanggil str() pada object, yang menghasilkan format ISO 2025-06-15, lalu mencetak ketiga atribut tanggal lewat akses titik.
  5. Baris 9-10: hal yang sama dilakukan untuk object time beserta atribut jam-nya.

Method isoformat() menghasilkan string standar ISO 8601 — format inilah yang dipakai saat print() dipanggil secara langsung:

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

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

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

python
from datetime import date

tanggal_rapat = date(2025, 6, 15)

print(tanggal_rapat.weekday())
print(tanggal_rapat.isoweekday())

Output yang Dihasilkan:

text
6
7

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

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

python
from datetime import date, MINYEAR, MAXYEAR

print(date.min)
print(date.max)
print(MINYEAR, MAXYEAR)

Output yang Dihasilkan:

text
0001-01-01
9999-12-31
1 9999

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

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

text
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 writable

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

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

text
True
True
2025-06-15

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