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.

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

text
class t : datetime
t       : 2026-01-15 00:00:00

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

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

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

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

text
selesai : 2026-01-15 11:00:00
tunda   : 2026-01-18 09:00:00
durasi  : 1.5 jam = 90 menit

Mari kita bedah baris-baris kode di atas:

  1. Baris 1 (+ hours(2)): pukul 09:00 bergeser 2 jam menjadi 11:00 — hasil tetap datetime.
  2. 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.
  3. Baris 3 (duration(1, 30, 0)): duration dibangun dari komponen jam-menit-detik; fungsi hours(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.

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

text
selisih rapat(2)-rapat(1) : 25.5 jam
between : 3d 4h

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

matlab
v = datevec(rapat(1));
fprintf('datevec : %d %d %d %d %d %d\n', v);

Output yang Dihasilkan:

text
datevec : 2026 1 15 9 0 0

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

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

text
rapat > 16 Jan : 0 1 1
jumlah terpilih: 2

Mask [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 warisanPeranPengganti modern
datenum(t)datetime → angka serialdatetime menyimpan langsung
datestr(t)datetime → teksstring(t) / char(t)
datevec(t)datetime → vektor komponenmasih praktis untuk komponen numerik
matlab
fprintf('datestr default : %s\n', datestr(rapat(1)));
fprintf('datenum(t)      : %.1f (hari serial, warisan)\n', datenum(t));

Output yang Dihasilkan:

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