Kursus
Bekerja dengan tanggal dan waktu terlihat sederhana sampai Anda mulai berurusan dengan format, zona waktu, aturan daylight saving, atau stempel waktu dari berbagai sistem, saat itulah menyimpan waktu sebagai string atau bilangan bulat mentah bukan lagi pilihan. Modul datetime Python hadir untuk membantu Anda mengelola semua bagian yang bergerak ini dengan cara yang dapat diprediksi.
Panduan ini membahas kelas-kelas inti, cara membuat dan bekerja dengan objek datetime, cara melakukan aritmetika, cara memformat dan mengurai nilai, menangani zona waktu, dan lainnya. Setiap bagian dibangun dari sebelumnya, sehingga Anda dapat berpindah dari operasi dasar ke pola yang lebih lanjut.
Kelas Inti Modul Python datetime
Sebelum melakukan hal yang spesifik, ada baiknya memahami bagaimana Python memodelkan tanggal dan waktu pada tingkat konseptual. Modul datetime menggunakan sekumpulan kecil kelas, masing-masing berfokus pada satu bagian masalah. Mengetahui peran tiap kelas membuat alur kerja selebihnya jauh lebih mudah.
date
Saat Anda hanya memerlukan tanggal kalender tanpa memikirkan waktu atau zona waktu, kelas date adalah yang Anda butuhkan. Ini merepresentasikan tahun, bulan, dan hari menggunakan atribut yang sudah familier.
Berikut atributnya:
-
year -
month -
day
Dan metode-metodenya:
-
today() -
fromisoformat() -
replace() -
isoformat() -
weekday() -
isoweekday()
from datetime import date
d = date(2025, 3, 1)
print(d)
Kode ini membuat tanggal kalender sederhana. Jika Anda memasukkan kombinasi tidak valid (seperti February 30), Python akan memunculkan yang dikenal sebagai ValueError.
time
Beberapa tugas hanya memerlukan waktu dalam sehari, misalnya pengingat yang berjalan pada pukul 14.30. Kelas time akan berguna karena menyimpan jam, menit, detik, dan (tidak diperlukan untuk contoh ini) mikrodetik atau data zona waktu.
Atributnya adalah: hour, minute, second, microsecond, tzinfo
Metodenya adalah: replace(), isoformat()
from datetime import time
t = time(14, 30, 15)
print(t)
Ini membuat waktu jam tanpa tanggal terlampir. Nilai tidak valid (seperti hour=27) akan menghasilkan galat.
datetime
Kebanyakan situasi dunia nyata menggabungkan tanggal dan waktu, dan di situlah datetime berperan. Ini adalah kelas yang paling serbaguna di modul dan yang paling sering Anda gunakan untuk pencatatan, pemrosesan, dan koordinasi peristiwa.
Atributnya adalah (selain semua yang di atas): tzinfo
Dan metodenya adalah now(), utcnow(), fromisoformat(), strptime(), strftime(), astimezone(). Ia juga mendukung aritmetika dengan timedelta, yang akan saya bahas lebih detail.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Ini menghasilkan stempel waktu lengkap dengan komponen tanggal dan waktu.
timedelta
Kapan pun Anda perlu mengukur waktu berlalu atau menggeser stempel waktu maju atau mundur, timedelta adalah pilihan yang tepat. Ini merepresentasikan durasi, bukan momen tertentu.
Atributnya adalah: days, seconds, microseconds. Umumnya digunakan untuk offset, selisih waktu, dan logika penjadwalan.
from datetime import timedelta
delta = timedelta(days=7, hours=3)
print(delta)
Ini merepresentasikan durasi berdurasi tetap. Menjadi sangat berguna saat ditambahkan ke atau dikurangkan dari sebuah datetime.
tzinfo
tzinfo mendefinisikan antarmuka Python untuk zona waktu. Anda tidak akan membuat ini secara langsung, tetapi sistem datetime menggunakannya kapan pun Anda melampirkan atau mengonversi zona waktu.
timezone
timezone adalah implementasi tzinfo bawaan untuk offset UTC tetap seperti UTC atau UTC+1. Ini berguna untuk kasus sederhana di mana aturan daylight saving tidak menjadi masalah.
Membuat dan Mengakses Objek Python datetime
Setelah Anda mengenal kelas-kelasnya, langkah berikutnya adalah mempelajari cara membuat instance-nya. Python memberi Anda beberapa pendekatan bergantung pada sumber data Anda: entri manual, waktu sistem, stempel waktu, atau teks.
Menggunakan konstruktor Kelas
Konstruktor memberi Anda kontrol penuh atas nilai yang Anda buat. Ini sering kali menjadi cara paling eksplisit dan tahan galat untuk membangun objek date, time, atau datetime.
from datetime import date
d = date(2025, 3, 1)
print(d)
Ini membangun tanggal kalender secara langsung. Nilai tidak valid segera memunculkan galat, membantu menangkap kesalahan sejak dini.
from datetime import time
t = time(14, 30, 15)
print(t)
Ini menghasilkan nilai waktu dalam sehari. Gunakan ini saat Anda tidak memerlukan tanggal terlampir.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt)
Ini membuat stempel waktu penuh. Menambahkan argumen tzinfo membuatnya sadar zona waktu (timezone-aware).
Membuat dari stempel waktu
Stempel waktu Unix muncul di log, API, dan sistem operasi. Python dengan mudah mengonversinya menjadi objek datetime yang mudah dibaca manusia.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Yang pertama menafsirkan stempel waktu dalam waktu lokal; yang kedua menafsirkannya dalam UTC.
Metode kelas untuk nilai saat ini
Saat Anda memerlukan tanggal atau waktu saat ini, Python menyediakan pembantu sederhana. Ini penting untuk pencatatan, pelacakan peristiwa, dan pipeline waktu nyata.
from datetime import datetime, date, timezone
print(date.today())
print(datetime.now())
print(datetime.now(tz=timezone.utc)) # Python 3.12+ preferred
Ini memberi Anda waktu sistem saat ini baik dalam waktu lokal atau UTC, sesuai kebutuhan Anda.
datetime.fromtimestamp(1700000000)
datetime.utcfromtimestamp(1700000000)
Ini mengonversi stempel waktu epoch menjadi objek datetime. Ini sangat umum saat mengurai nilai dari API atau basis data.
Mengurai dari string
Kumpulan data dunia nyata sering menyimpan stempel waktu sebagai teks. Python menyediakan alat andal untuk mengonversi string tersebut menjadi nilai terstruktur.
strptime()
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
strptime() mengurai string menggunakan pola format. Jika string tidak cocok persis, Python akan memunculkan ValueError.
from datetime import datetime
dt = datetime.strptime("not-a-date", "%Y-%m-%d")
Ini akan gagal karena masukan tidak cocok dengan pola yang diharapkan.
fromisoformat()
datetime.fromisoformat("2025-03-01T14:30:00")
String ISO 8601 diurai dengan mulus karena strukturnya terstandarisasi. Ini sering menjadi cara termudah untuk memuat stempel waktu dari API atau pipeline data modern.
Melakukan Aritmetika Tanggal
Setelah Anda dapat membuat stempel waktu, langkah berikutnya adalah bekerja dengannya. Anda dapat melakukannya dengan menghitung durasi, menggeser tanggal, atau membandingkan interval.
Timedelta untuk perhitungan temporal
timedelta memodelkan periode berdurasi tetap seperti “5 jam” atau “2 minggu.” Periode ini berguna untuk penjadwalan, pencatatan, dan jika Anda memerlukan hitung mundur sederhana.
from datetime import datetime, timedelta
dt = datetime(2025, 3, 1, 14, 30)
new_dt = dt + timedelta(days=5)
print(new_dt)
Contoh ini menggeser stempel waktu maju lima hari.
start = datetime(2025, 3, 1, 9, 0)
end = datetime(2025, 3, 1, 14, 30)
duration = end - start
print(duration.total_seconds())
Di sini, mengurangkan dua datetime memberi Anda timedelta, yang dapat Anda konversi ke detik, hari, atau jam.
Durasi tetap vs. aritmetika yang peka kalender
Tidak semua satuan waktu itu sama. Bulan bervariasi panjangnya, tahun mungkin memiliki hari kabisat, dan perilaku akhir bulan bisa tidak terduga. Untuk skenario ini, timedelta tidak cukup.
dateutil.relativedelta menangani aritmetika yang “peka kalender”:
from dateutil.relativedelta import relativedelta
from datetime import date
d = date(2025, 1, 31)
print(d + relativedelta(months=1))
Ini menangani skenario “31 Februari” yang tidak ada dengan benar dengan menggeser tanggal secara tepat.
Memformat dan Mengurai Tanggal
Pemformatan datetime muncul di mana-mana: API mengharuskan format tertentu, pengguna lebih menyukai teks yang mudah dibaca, dan log bergantung pada string stempel waktu yang konsisten. Python mendukung pemformatan yang fleksibel sekaligus representasi standar.
Pemformatan string dengan strftime
strftime() memungkinkan Anda mengubah objek datetime menjadi string terformat menggunakan kode yang telah ditentukan.
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30)
print(dt.strftime("%A, %B %d, %Y at %H:%M"))
Ini mencetak string yang mudah dibaca dengan hari dalam seminggu dan nama bulan lengkap.
dt.strftime("%Y-%m-%dT%H:%M:%S")
Ini menghasilkan string bergaya ISO yang cocok untuk penyimpanan data atau API.
Mengurai string dengan strptime
from datetime import datetime
dt = datetime.strptime("2025-03-01 14:30", "%Y-%m-%d %H:%M")
print(dt)
Ini mengonversi teks menjadi objek datetime. Ketidaksesuaian apa pun antara string dan pola akan memunculkan galat.
Bekerja dengan ISO 8601 dan RFC 3339
ISO 8601 mengatasi ambiguitas yang ditemukan pada banyak format tanggal regional. Python mendukungnya secara bawaan:
from datetime import datetime
dt = datetime.fromisoformat("2025-03-01T14:30:00")
print(dt.isoformat())
Ini adalah format paling aman saat bertukar data antar sistem, API, atau basis data.
Menangani Zona Waktu
Zona waktu menghadirkan beberapa tantangan paling rumit dalam pemrograman temporal. Python membantu dengan membedakan antara objek datetime naif dan sadar, serta menyediakan alat untuk penanganan zona dunia nyata.
Objek datetime naif vs. sadar
Datetime naif tidak memiliki zona waktu:
from datetime import datetime
naive_dt = datetime(2025, 3, 1, 14, 30)
print(naive_dt.tzinfo) # None
Datetime sadar menyertakan offset zona waktu:
from datetime import timezone, timedelta
aware_dt = naive_dt.replace(tzinfo=timezone(timedelta(hours=1)))
print(aware_dt)
Mencampur nilai naif dan sadar dalam perbandingan atau aritmetika biasanya menyebabkan galat.
Menggunakan modul zoneinfo
Modul zoneinfo Python menyediakan akses ke zona waktu IANA dunia nyata:
from zoneinfo import ZoneInfo
from datetime import datetime
dt = datetime(2025, 3, 1, 14, 30, tzinfo=ZoneInfo("Europe/Paris"))
print(dt)
Konversi zona waktu itu sederhana:
dt.astimezone(ZoneInfo("America/New_York"))
Ini mengekspresikan momen yang sama dalam zona waktu lokal yang berbeda.
Mengonversi antar zona waktu
Anda dapat mengonversi stempel waktu yang sadar zona ke zona lain menggunakan astimezone():
from zoneinfo import ZoneInfo
dt_ny = dt.astimezone(ZoneInfo("America/New_York"))
print(dt_ny)
Praktik umum yang baik adalah menyimpan stempel waktu dalam UTC dan hanya mengonversinya saat diperlukan untuk tampilan.
Membandingkan dan Memfilter Tanggal
Perbandingan muncul di hampir setiap alur kerja. Saya memikirkan pengurutan log, pemfilteran peristiwa, atau menentukan apakah sesuatu terjadi sebelum atau sesudah ambang batas.
from datetime import datetime
a = datetime(2025, 3, 1, 12, 0)
b = datetime(2025, 3, 1, 15, 0)
print(a < b) # True
Perbandingan yang sadar zona waktu memperhitungkan offset:
from datetime import datetime
from zoneinfo import ZoneInfo
dt1 = datetime(2025, 3, 1, 12, 0, tzinfo=ZoneInfo("Europe/London"))
dt2 = datetime(2025, 3, 1, 7, 0, tzinfo=ZoneInfo("America/New_York"))
print(dt1 == dt2) # True — same moment in time
Memfilter koleksi berjalan secara alami:
dates = [
datetime(2025, 3, 1, 10),
datetime(2025, 2, 20, 9),
datetime(2025, 3, 1, 8)
]
cutoff = datetime(2025, 3, 1)
filtered = [d for d in dates if d >= cutoff]
print(filtered)
Normalisasi UTC berguna saat bekerja lintas zona.
Kasus Penggunaan yang Lebih Lanjut
Datetime muncul di banyak alur kerja di luar penguraian dan aritmetika dasar. Berikut beberapa pola yang sering Anda jumpai.
Stempel waktu Unix
Stempel waktu Unix mengukur detik sejak 1 Januari 1970 (UTC). Ini banyak digunakan dalam pemrograman sistem dan API.
from datetime import datetime
dt = datetime.fromtimestamp(1700000000)
print(dt)
Milidetik dan mikrodetik memerlukan penskalaan:
ts_ms = 1700000000000
dt_ms = datetime.fromtimestamp(ts_ms / 1000)
ts_us = 1700000000000000
dt_us = datetime.fromtimestamp(ts_us / 1_000_000)
Penjadwalan dan timer
Pustaka seperti schedule bergantung pada nilai datetime untuk menentukan kapan tugas harus dijalankan. Baik Anda memicu fungsi setiap beberapa detik atau menjadwalkan peristiwa sekali jalan nanti di hari yang sama, datetime menyediakan fondasi untuk perbandingan tersebut.
Pola analisis data
Atribut datetime sering diekstrak untuk pengelompokan dan analisis berbasis waktu:
dt = datetime(2025, 3, 1, 14, 30)
print(dt.year)
print(dt.isocalendar())
Di pandas, resampling berdasarkan periode sangat umum:
import pandas as pd
df = pd.DataFrame({
"value": [10, 12, 15],
"timestamp": pd.to_datetime([
"2025-03-01",
"2025-03-02",
"2025-03-08"
])
}).set_index("timestamp")
print(df.resample("W").sum())
Kesimpulan
Untuk mempelajari lebih lanjut tentang datetime, silakan lihat video dari kursus kami Working with Dates and Times in Python oleh Max Shrom dan Data Types for Data Science in Python oleh Jason Myers.
Anda juga mungkin tertarik dengan tutorial kami Converting Strings to Dates as datetime Objects jika Anda memerlukan sedikit bantuan tambahan untuk mengonversi string.
Penulis teknis yang mengkhususkan diri pada AI, ML, dan ilmu data, membuat gagasan kompleks menjadi jelas dan mudah diakses.

