Time Point
Merepresentasikan suatu titik pada waktu pada level detail (presisi) tertentu .
Time Point. A point in Time. Contohnya saya menulis article ini pada August 28 2000. Itu disebut time point. Trus untuk apa pattern ini kan udh ada banyak library untuk waktu. Masalahnya karena ada kerumitan2 tertentu pada waktu tersebut.
Masalah yg paling utama adalah masalah presisi atau ketepatan. Level detail. August 28 2000 dan August 28 2000 2:33:34 pm adalah hal yang berbeda. Yang pertama memiliki keakuratan level hari dan yang lain level second.Yang kedua lebih akurat dari yg pertama. Tetapi keakuratan tersebut tergantung kepada konteksnya. Apakah dibutuhkan sampai keakuratan detik.Setiap time point memerlukan presisi sehingga kita tw apakah kejadian A bertepatan dengan kejadian B.
Jadi kita tidak bisa hanya bergantung kepada presisi yg dibutuhkan pada satu domain saja. Pada domain A mungkin saja level presisi nya harus sampai detik sedangkan domain yg lain cukup untuk level hari.
Jadi pilihlah presisi waktu yang tepat untuk kebutuhan anda. Platform rata2 menyediakan presisi waktu untuk ukuran detik. Jadi untuk merepresentasikan August 28 2000 kita mungkin menggunakan convensi tepat tengah malam. August 28 2000 00:00:00. Tapi ini sangat2 riskan. Karena jika waktu berubah menjadi August 28 2000 00:00:15. Kedua waktu tersebut tidak sama lagi. Meskipun hanya berbeda beberapa detik. Masalah equality menjadi hal yang penting untuk menunjukkan dua object Time Point menunjukkan waktu yang sama.
Salah satu kesulitannya lagi adalah mengenai masalah time zone. Bagaimana cara mengatasinya. Kadang kita butuh presisi sampai mencakup time zone kadang tidak. Ga bisa diprediksi bakal sama di semua aplikasi. Time Point tanpa meggunakan time zone lebih dapat diterima. Jadi yah waktunya local terhadap time zone dimana kita brada.
Time point haruslah dapat menentukan dengan jelas kapan kejadian tersebut terjadi. Jadi misalnya suatu object memiliki nilai waktu 2:30pm ini tidak dapat dipastikan karena bisa saja 2:30pm pada hari jumat atau kamis, tahun depan dll. Tetapi jika kita mengatakan 2:30pm dengan presisi hari artinya dalam konteks hari ini maka waktu tersebut jelas maksudnya.
Yang perlu lagi dari time point class adalah untuk menentukan waktu sekarang (current time). Ini didapat dari waktu pada Operating System.
Nah ini contoh class Time Point dengan level presisi hari. Class ini merupakan wrapper dari kelas Gregorian Calendar
class MfDate... private GregorianCalendar _base; public MfDate() { this(new GregorianCalendar()); } public MfDate(int year, int month, int day) { initialize (new GregorianCalendar(year, month - 1, day)); } private void initialize (GregorianCalendar arg) { _base = trimToDays(arg); } private GregorianCalendar trimToDays(GregorianCalendar arg) { GregorianCalendar result = arg; result.set(Calendar.HOUR_OF_DAY,0); result.set(Calendar.MINUTE, 0); result.set(Calendar.SECOND, 0); result.set(Calendar.MILLISECOND, 0); return result; }
nah karena class ini memiliki presisi hari sedangkan Gregorian Calendar memiliki presisi yg detail sampai ke milisecon. Maka kita harus membuang atau trim yang lainnya. Hal itu dilakukan di method trimToDays. Jadi semua yang tidak perlu di inisialisasi 0. Sehingga apabila hasil equalitynya bisa tepat.
class MfDate... public boolean after (MfDate arg) { return getTime().after(arg.getTime()); } public boolean before (MfDate arg) { return getTime().before(arg.getTime()); } public int compareTo(Object arg) { MfDate other = (MfDate) arg; return getTime().compareTo(other.getTime()); } public boolean equals(Object arg) { if (! (arg instanceof MfDate)) return false; MfDate other = (MfDate) arg; return (_base.equals(other._base)); } public Date getTime() { return _base.getTime(); }
diperlukan juga operasi2 perbandingan. Yg lain seperti after dll. Juga yang terakhir adalah operasi manipulasi
class MfDate... public MfDate addDays(int arg) { return new MfDate(new GregorianCalendar(getYear(), getMonth(), getDayOfMonth() + arg)); } public MfDate minusDays(int arg) { return addDays(-arg); }