Menghitung tanggal Jawa

Untuk melacak waktu, Java menghitung jumlah milidetik dari awal 1 Januari 1970. Artinya, misalnya, 2 Januari 1970 itu dimulai 86.400.000 milidetik kemudian. Demikian pula, 31 Desember 1969, dimulai 86.400.000 milidetik sebelum 1 Januari 1970. Kelas Java Datemelacak milidetik tersebut sebagai sebuah longnilai. Karena longmerupakan angka bertanda tangan, tanggal dapat dinyatakan sebelum dan sesudah dimulainya tanggal 1 Januari 1970. Nilai positif dan negatif terbesar yang diungkapkan oleh longprimitif dapat menghasilkan tanggal maju dan mundur sekitar 290.000.000 tahun, yang sesuai dengan jadwal kebanyakan orang.

Kelas Tanggal

The Datekelas, ditemukan di java.utilpaket, merangkum longnilai yang mewakili saat tertentu. Salah satu konstruktor yang berguna adalah Date(), yang membuat Dateobjek yang mewakili waktu objek dibuat. The getTime()Metode mengembalikan longnilai dari Dateobjek. Dalam program di bawah ini, saya menggunakan Date()konstruktor untuk membuat tanggal berdasarkan kapan program dijalankan, dan getTime()metode untuk mengetahui jumlah milidetik yang diwakili oleh tanggal tersebut:

import java.util. *; kelas publik Sekarang {public static void main (String [] args) {Date now = new Date (); lama nowLong = now.getTime (); System.out.println ("Nilainya" + nowLong); }}

Ketika saya menjalankan program itu, itu memberi saya nilai 972.568.255.150. Pemeriksaan cepat dengan kalkulator saya memastikan bahwa angka ini setidaknya dalam perkiraan yang benar: sedikit kurang dari 31 tahun, yang sesuai dengan jumlah tahun yang tepat antara 1 Januari 1970, dan hari saya menulis artikel ini. Meskipun komputer dapat berkembang pesat dengan angka-angka seperti nilai sebelumnya, kebanyakan orang enggan mengatakan hal-hal seperti "Sampai jumpa di 996.321.998.346." Untungnya, Java menyediakan cara untuk mengonversi Dateobjek Strings, yang merepresentasikan tanggal dengan cara yang lebih tradisional. The DateFormatkelas, yang dibahas dalam bagian berikutnya, dapat membuat Stringsdengan sigap.

Kelas DateFormat

Salah satu tujuan dari

DateFormat

kelas untuk membuat

Strings

dengan cara yang dapat dengan mudah ditangani oleh manusia. Namun, karena perbedaan bahasa, tidak semua orang ingin melihat kencan dengan cara yang persis sama. Seseorang di Prancis mungkin lebih suka melihat "25 desembre 2000", sementara seseorang di Amerika Serikat mungkin lebih terbiasa melihat "25 Desember 2000". Jadi ketika sebuah contoh dari a

DateFormat

kelas dibuat, objek berisi informasi mengenai format tertentu di mana tanggal akan ditampilkan. Untuk menggunakan format default komputer pengguna, Anda dapat menerapkan

getDateInstance

metode dengan cara berikut untuk membuat yang sesuai

DateFormat

obyek:

 DateFormat df = DateFormat.getDateInstance (); 

The DateFormatkelas ditemukan dalam java.textpaket.

Mengonversi ke String

Anda dapat mengubah Dateobjek menjadi string dengan formatmetode ini. Ini ditunjukkan dalam program demonstrasi berikut:

import java.util. *; import java.text. *; kelas publik NowString {public static void main (String [] args) {Date now = new Date (); DateFormat df = DateFormat.getDateInstance (); String s = df.format (sekarang); System.out.println ("Hari ini adalah" + s); }}

The getDateInstanceMetode yang ditunjukkan dalam kode di atas, tanpa argumen, menciptakan sebuah objek dalam format standar atau gaya. Java juga menyediakan beberapa gaya alternatif untuk tanggal, yang bisa Anda peroleh melalui kelebihan beban getDateInstance(int style). Demi kenyamanan, DateFormatberikan beberapa konstanta siap pakai yang bisa Anda gunakan sebagai argumen dalam getDateInstancemetode ini. Beberapa contoh SHORT, MEDIUM, LONG, dan FULL, yang ditunjukkan dalam program di bawah ini:

import java.util. *; import java.text. *; kelas publik StyleDemo {public static void main (String [] args) {Date now = new Date (); DateFormat df = DateFormat.getDateInstance (); DateFormat df1 = DateFormat.getDateInstance (DateFormat.SHORT); DateFormat df2 = DateFormat.getDateInstance (DateFormat.MEDIUM); DateFormat df3 = DateFormat.getDateInstance (DateFormat.LONG); DateFormat df4 = DateFormat.getDateInstance (DateFormat.FULL); String s = df.format (sekarang); String s1 = df1.format (sekarang); String s2 = df2.format (sekarang); String s3 = df3.format (sekarang); String s4 = df4.format (sekarang); System.out.println ("(Default) Today adalah" + s); System.out.println ("(SHORT) Hari ini adalah" + s1); System.out.println ("(MEDIUM) Hari ini adalah" + s2); System.out.println ("(LONG) Hari ini adalah" + s3); System.out.println ("(FULL) Hari ini adalah" + s4); }}

Program itu menghasilkan yang berikut:

(Default) Hari ini 8 Nov 2000 (SHORT) Hari ini 11/8/00 (SEDANG) Hari ini 8 Nov 2000 (PANJANG) Hari ini 8 November 2000 (FULL) Hari ini Rabu, 8 November 2000 

Program yang sama, setelah dijalankan di komputer saya dengan pengaturan regional default diubah ke Swedia, menampilkan output ini:

(Default) Hari ini 2000-nov-08 (SHORT) Hari ini 2000-11-08 (SEDANG) Hari ini 2000-nov-08 (PANJANG) Hari ini adalah 8 november 2000 (FULL) Hari ini tanggal 8 november 2000 

Dari situ, Anda dapat melihat bahwa dalam bahasa Swedia, bulan dalam setahun tidak dikapitalisasi (meskipun November masih november). Juga, perhatikan bahwa LONGdan FULLversinya identik dalam bahasa Swedia, namun berbeda dalam bahasa Inggris Amerika. Selain itu, menarik bahwa kata dalam bahasa Swedia untuk Wednesday, onsdag , tidak disertakan dalam FULLversi tersebut, di mana FULLversi bahasa Inggrisnya menyertakan nama hari.

Perhatikan bahwa Anda dapat menggunakan getDateInstancemetode ini untuk mengubah bahasa untuk fileDateFormatcontoh; namun, dalam kasus di atas, ini dilakukan pada mesin Windows 98 dengan mengubah pengaturan regional dari panel kontrol. Pelajarannya di sini adalah bahwa pengaturan regional default bervariasi dari satu tempat ke tempat lain, yang memiliki kelebihan dan kekurangan yang harus diperhatikan oleh programmer Java. Salah satu keuntungannya adalah programmer Java dapat menulis satu baris kode untuk menampilkan tanggal, namun tanggal tersebut muncul dalam puluhan atau bahkan ratusan bentuk yang berbeda ketika program dijalankan pada komputer di seluruh dunia. Tapi itu bisa menjadi kerugian jika pemrogram menginginkan hanya satu format - yang lebih disukai, misalnya, dalam program yang mengeluarkan teks dan tanggal yang dicampur bersama. Jika teks dalam bahasa Inggris, tidak akan konsisten untuk memiliki tanggal dalam format lain, seperti Jerman atau Spanyol. Jika pemrogram mengandalkan format regional default,format tanggal akan bervariasi sesuai dengan pengaturan regional komputer pelaksana.

Mengurai String

Anda juga dapat menggunakan DateFormatkelas untuk membuat Dateobjek dari a String, melalui parse()metode. Metode khusus ini dapat menimbulkan ParseExceptionkesalahan, jadi Anda harus menggunakan teknik penanganan kesalahan yang tepat. Contoh program yang mengubah a Stringmenjadi Dateditunjukkan di bawah ini:

import java.util. *; import java.text. *; kelas publik ParseExample {public static void main (String [] args) {String ds = "November 1, 2000"; DateFormat df = DateFormat.getDateInstance (); coba {Date d = df.parse (ds); } catch (ParseException e) {System.out.println ("Unable to parse" + ds); }}}

The parse()Metode adalah alat yang berguna untuk membuat tanggal sewenang-wenang. Saya akan memeriksa cara lain untuk membuat tanggal sewenang-wenang. Juga, Anda akan melihat bagaimana melakukan perhitungan dasar dengan tanggal, seperti menghitung tanggal 90 hari setelah tanggal lain. Anda dapat menyelesaikan kedua tugas dengan GregorianCalendarkelas.

Kelas GregorianCalendar

Salah satu cara untuk membuat objek yang mewakili tanggal arbitrer adalah dengan menggunakan konstruktor GregorianCalendarkelas berikut, yang ditemukan dalam java.utilpaket:

 GregorianCalendar (int tahun, int bulan, int tanggal) 

Perhatikan bahwa untuk bulan, Januari adalah 0, Februari adalah 1, dan seterusnya, hingga Desember, yaitu 11. Karena itu bukan angka yang diasosiasikan kebanyakan dari kita dengan bulan dalam setahun, program mungkin akan lebih mudah dibaca jika mereka menggunakan konstanta dari induk Calendarkelas: JANUARY, FEBRUARY, dan sebagainya. Jadi, untuk membuat objek yang mewakili tanggal pertama kali Wilbur dan Orville Wright menerbangkan pesawat bermesin mereka (17 Desember 1903), Anda dapat menggunakan:

 GregorianCalendar firstFlight = new GregorianCalendar (1903, Calendar.DECEMBER, 17); 

Demi kejelasan, Anda harus menggunakan formulir sebelumnya. Namun, Anda juga harus mempelajari cara membaca formulir yang lebih pendek di bawah ini. Contoh berikut mewakili tanggal 17 Desember 1903 yang sama (ingat, dalam bentuk yang lebih pendek 11 mewakili Desember):

 GregorianCalendar firstFlight = new GregorianCalendar (1903, 11, 17); 

Di bagian sebelumnya, Anda telah mempelajari cara mengubah Dateobjek menjadi Strings. Anda akan melakukan hal yang sama lagi; tapi pertama-tama, Anda perlu mengonversi GregorianCalendarobjek menjadi Date. Untuk melakukannya, Anda akan menggunakan getTime()metode yang GregorianCalendarditurunkan dari Calendarkelas induknya . The getTime()kembali metode yang Dateberhubungan dengan GregorianCalendarobjek. Anda dapat meletakkan seluruh proses pembuatan GregorianCalendarobjek, mengubahnya menjadi Date, dan mendapatkan dan mengeluarkan yang sesuai Stringdalam program berikut:

import java.util. *; import java.text. *; Penerbangan kelas publik {public static void main (String [] args) {GregorianCalendar firstFlight = new GregorianCalendar (1903, Calendar.DECEMBER, 17); Tanggal d = firstFlight.getTime (); DateFormat df = DateFormat.getDateInstance (); String s = df.format (d); System.out.println ("Penerbangan pertama adalah" + s); }}

Terkadang berguna untuk membuat instance GregorianCalendarkelas yang mewakili hari saat instance dibuat. Untuk melakukannya, cukup gunakan GregorianCalendarkonstruktor tanpa argumen, seperti:

 GregorianCalendar thisday = new GregorianCalendar (); 

Contoh program untuk mengeluarkan tanggal hari ini, dimulai dengan sebuah GregorianCalendarobjek adalah:

 import java.util.*; import java.text.*; class Today { public static void main(String[] args) { GregorianCalendar thisday = new GregorianCalendar(); Date d = thisday.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("Today is " + s); } } 

Note the similarities between the Date() constructor and the GregorianCalendar() constructor: both create an object, which in simple terms, represents today.

Date manipulation

The GregorianCalendar class offers methods for manipulating dates. One useful method is add(). With the add() method, you can add such time units as years, months, and days to a date. To use the add() method, you must supply the field being increased, and the integer amount by which it will increase. Some useful constants for the fields are DATE, MONTH, YEAR, and WEEK_OF_YEAR. The add() method is used in the program below to calculate a date 80 days in the future. Phileas Fogg, the central character in Jules Verne's Around the World in 80 Days, could have used such a program to calculate a date 80 days from his departure on October 2, 1872:

 import java.util.*; import java.text.*; public class World { public static void main(String[] args) { GregorianCalendar worldTour = new GregorianCalendar(1872, Calendar.OCTOBER, 2); worldTour.add(GregorianCalendar.DATE, 80); Date d = worldTour.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("80 day trip will end " + s); } } 

While the example is a bit fanciful, adding days to a date is a common operation: video rentals can be due in 3 days, a library may lend books for 21 days, stores frequently require purchased items to be exchanged within 30 days. The following program shows a calculation using years:

 import java.util.*; import java.text.*; public class Mortgage { public static void main(String[] args) { GregorianCalendar mortgage = new GregorianCalendar(1997, Calendar.MAY, 18); mortgage.add(Calendar.YEAR, 15); Date d = mortgage.getTime(); DateFormat df = DateFormat.getDateInstance(); String s = df.format(d); System.out.println("15 year mortgage amortized on " + s); } } 

One important side effect of the add() method is that it changes the original date. Sometimes it is important to have both the original date and the modified date. Unfortunately, you cannot simply create a new GregorianCalendar object set equal to the original. The reason is that the two variables have a reference to one date. If the date is changed, both variables now refer to the changed date. Instead, a new object should be created. The following example will demonstrate this:

import java.util. *; import java.text. *; kelas publik ThreeDates {public static void main (String [] args) {GregorianCalendar gc1 = new GregorianCalendar (2000, Calendar.JANUARY, 1); GregorianCalendar gc2 = gc1; GregorianCalendar gc3 = new GregorianCalendar (2000, Calendar.JANUARY, 1); // Tiga tanggal semuanya sama dengan 1 Januari 2000 gc1.add (Calendar.YEAR, 1); // gc1 dan gc2 diubah DateFormat df = DateFormat.getDateInstance (); Tanggal d1 = gc1.getTime (); Tanggal d2 = gc2.getTime (); Tanggal d3 = gc3.getTime (); String s1 = df.format (d1); String s2 = df.format (d2); String s3 = df.format (d3); System.out.println ("gc1 adalah" + s1); System.out.println ("gc2 adalah" + s2); System.out.println ("gc3 adalah" + s3); }}