Waktu adalah data paling sering dipecah salah: tanggal disimpan sebagai teks, jam sebagai angka floating, lalu selisihnya dihitung manual dengan perkiraan “sebulan = 30 hari”. MATLAB menutup celah itu dengan tiga tipe yang bekerja sama — datetime untuk titik waktu, duration untuk lamanya waktu (jam-menit-detik), dan calendarDuration untuk lamanya waktu versi kalender (bulan bisa 28–31 hari). Chapter ini membahas parsing teks, format tampilan, aritmetika waktu, selisih dua jenis, hingga warisan datenum/datestr yang masih sering dijumpai di kode lama.
Parsing Teks: datetime dengan InputFormat #
Aturannya: datetime(teks, 'InputFormat', pola) mengurai teks menjadi titik waktu; semua elemen input harus memakai pola yang sama. Mekanismenya: pola seperti 'yyyy-MM-dd' memberi tahu MATLAB komponen mana dari teks yang tahun, bulan, dan hari — tanpa pola, MATLAB menebak dari format umum dan bisa keliru pada tanggal ambigu.
t = datetime('2026-01-15', 'InputFormat', 'yyyy-MM-dd');
fprintf('class t : %s\n', class(t));
fprintf('t : %s\n', datestr(t, 'yyyy-MM-dd HH:MM:SS'));Output yang Dihasilkan:
class t : datetime
t : 2026-01-15 00:00:00Tampilan di Command Window memakai format bawaan 15-Jan-2026; tanpa komponen jam, waktu dianggap tengah malam. Tampilan itu diatur ulang lewat properti Format — dan properti ini hanya mengubah penampilan, bukan nilai:
t.Format = 'dd/MM/yyyy';Setelah baris tersebut, t tampil sebagai 15/01/2026 di Command Window. Satu datetime bisa dibangun juga dari komponen angka: datetime(2026, 1, 15).
Deretan teks (cell atau string array) menjadi array datetime sekaligus:
rapat = datetime({'2026-01-15 09:00'; '2026-01-16 10:30'; ...
'2026-01-18 13:00'}, 'InputFormat', 'yyyy-MM-dd HH:mm');Array 3×1 hasilnya bisa diurutkan, diiris, dan dibandingkan — perlakuan array numerik yang sudah kita kuasai, kini berlaku untuk waktu.
Aritmetika Waktu: duration dan calendarDuration #
Aturannya: datetime + duration menggeser titik waktu dengan panjang waktu tetap (jam-menit-detik), sedangkan datetime + calendarDuration menggeser mengikuti kalender — bulan dan tahun berbeda panjangnya. Mekanismenya: hours(2) membuat duration sepanjang 7200 detik persis; caldays(3) membuat calendarDuration yang menaiki tiga hari di kalender, peka terhadap tahun kabisat dan pergantian bulan.
selesai = rapat(1) + hours(2); % + 2 jam (duration)
tunda = rapat(1) + caldays(3); % + 3 hari (calendarDuration)
d = duration(1, 30, 0); % 1 jam 30 menit
fprintf('selesai : %s\n', datestr(selesai, 'yyyy-MM-dd HH:MM:SS'));
fprintf('tunda : %s\n', datestr(tunda, 'yyyy-MM-dd HH:MM:SS'));
fprintf('durasi : %.1f jam = %d menit\n', hours(d), minutes(d));Output yang Dihasilkan:
selesai : 2026-01-15 11:00:00
tunda : 2026-01-18 09:00:00
durasi : 1.5 jam = 90 menitMari kita bedah baris-baris kode di atas:
- Baris 1 (
+ hours(2)): pukul 09:00 bergeser 2 jam menjadi 11:00 — hasil tetapdatetime. - Baris 2 (
+ caldays(3)): 15 Januari + 3 hari kalender = 18 Januari; berbeda dengan+ days(3)(72 jam persis) hanya ketika DST atau tepi bulan terlibat. - Baris 3 (
duration(1, 30, 0)): duration dibangun dari komponen jam-menit-detik; fungsihours(d)/minutes(d)mengonversinya ke angka desimal (1.5 jam = 90 menit).
Keluarga pembangun duration: seconds, minutes, hours, days; pembangun calendarDuration: caldays, calweeks, calmonths, calyears.
Selisih Waktu: Pengurangan vs between #
Aturannya: t2 - t1 menghasilkan duration — selisih dalam jam-menit-detik persis; between(t1, t2) menghasilkan calendarDuration — selisih dalam komponen kalender. Mekanismenya: pengurangan menghitung jumlah detik absolut di antara dua titik; between mempertimbangkan panjang bulan nyata, tahun kabisat, dan pergeseran DST.
selisih = rapat(2) - rapat(1);
fprintf('selisih rapat(2)-rapat(1) : %.1f jam\n', hours(selisih));
kal = between(rapat(1), rapat(3));
fprintf('between : %s\n', char(string(kal)));Output yang Dihasilkan:
selisih rapat(2)-rapat(1) : 25.5 jam
between : 3d 4hNilai selisih adalah duration yang tampil 25:30:00 di Command Window (16 Januari 10:30 dikurangi 15 Januari 09:00); hours(selisih) menyajikannya sebagai 25.5 jam. Nilai kal adalah calendarDuration 3d 4h — tiga hari penuh ditambah empat jam, dari 15 Januari 09:00 ke 18 Januari 13:00. between juga menerima komponen pilihan, misalnya between(t1, t2, 'Days') untuk selisih dalam hari kalender saja.
datevec: Membongkar Komponen #
Aturannya: datevec(t) membongkar datetime menjadi vektor [tahun bulan hari jam menit detik]. Mekanismenya: hasilnya double biasa sehingga komponennya bisa dijumlahkan, difilter, atau diformat bebas.
v = datevec(rapat(1));
fprintf('datevec : %d %d %d %d %d %d\n', v);Output yang Dihasilkan:
datevec : 2026 1 15 9 0 0Pada kode modern, fungsi komponen year(t), month(t), day(t), dan hour(t) lebih langsung: year(rapat) menghasilkan vektor tahun untuk seluruh array tanpa membongkar baris demi baris.
Indexing per Waktu #
Karena datetime adalah array, pembanding waktu langsung menjadi mask — persis pola logical indexing yang kita kenal:
batas = datetime('2026-01-16', 'InputFormat', 'yyyy-MM-dd');
mask = rapat > batas;
fprintf('rapat > 16 Jan : %d %d %d\n', mask);
fprintf('jumlah terpilih: %d\n', sum(mask));Output yang Dihasilkan:
rapat > 16 Jan : 0 1 1
jumlah terpilih: 2Mask [0 1 1] memilih dua rapat setelah 16 Januari; rapat(mask) menghasilkan datetime 2×1. Pada timetable (Chapter Timetable), mask ini bekerja pada sumbu waktu TT.Time, dan timerange memberi bentuk yang lebih ringkas untuk rentang.
Warisan: datenum dan datestr #
Kode lama menyimpan tanggal sebagai serial date number — jumlah hari sejak 0 Januari tahun 0000 — dan memformatnya dengan datestr. Ketiganya masih berfungsi namun berstatus not recommended pada dokumentasi resmi MATLAB:
| Fungsi warisan | Peran | Pengganti modern |
|---|---|---|
datenum(t) | datetime → angka serial | datetime menyimpan langsung |
datestr(t) | datetime → teks | string(t) / char(t) |
datevec(t) | datetime → vektor komponen | masih praktis untuk komponen numerik |
fprintf('datestr default : %s\n', datestr(rapat(1)));
fprintf('datenum(t) : %.1f (hari serial, warisan)\n', datenum(t));Output yang Dihasilkan:
datestr default : 15-Jan-2026 09:00:00
datenum(t) : 739997.0 (hari serial, warisan)Angka 739997 tidak bermakna bagi pembaca laporan — inilah alasan migrasi ke datetime: nilai tampil sebagai tanggal, terbandingkan langsung, dan aman dari kesalahan konversi bolak-balik. datestr tetap berguna sebagai alat cetak cepat karena menerima pola 'yyyy-MM-dd HH:MM:SS' seperti pada contoh-contoh di atas.
Ringkasan #
datetime(teks, 'InputFormat', pola) mengurai teks menjadi titik waktu; properti Format mengubah tampilan tanpa mengubah nilai. Aritmetika memakai hours/duration untuk panjang waktu tetap dan caldays/calendarDuration untuk versi kalender; selisih t2 - t1 menghasilkan duration sedangkan between menghasilkan calendarDuration. datevec membongkar komponen [Y M D H MI S], perbandingan datetime langsung menjadi mask untuk indexing per waktu, dan datenum/datestr cukup dikenali sebagai warisan kode lama. Berkas contoh.m merangkai seluruh operasi dalam satu skrip MATLAB.