Bekerja di waktu Java

Artikel ini dibuat berdasarkan informasi yang disajikan dalam artikel Menghitung Tanggal Java saya ( JavaWorld, 29 Desember 2000). Di sini saya telah membuat daftar beberapa poin penting dari artikel itu yang seharusnya tidak asing bagi Anda. Jika poin-poin ini tidak jelas bagi Anda, saya sarankan Anda membaca "Menghitung Tanggal Java" untuk penjelasan lebih lanjut.

  1. Java menghitung waktu dalam milidetik sebelum atau setelah dimulainya 1 Januari 1970.
  2. The Datekonstruktor kelas ini Date()mengembalikan sebuah objek yang mewakili saat objek diciptakan. Date's getTime()metode mengembalikan longnilai yang jumlahnya sama dengan jumlah milidetik sebelum atau setelah tanggal 1 Januari tahun 1970.
  3. The DateFormatkelas digunakan untuk mengkonversi Dates untuk Strings, dan sebaliknya. getDateInstance()Metode statis mengembalikan DateFormatobjek dalam format default; yang getDateInstance(DateFormat.FIELD)mengembalikan DateFormatobjek dengan format yang ditentukan. The format(Date d)Metode mengembalikan Stringyang mewakili tanggal, seperti "1 Januari 2002." Sebaliknya, parse(String s)metode mengembalikan Dateobjek berdasarkan tanggal yang Stringdiwakili oleh argumen.
  4. Munculnya Strings yang dikembalikan oleh format()metode dapat berbeda-beda sesuai dengan pengaturan kawasan di komputer tempat program sedang dijalankan.
  5. The GregorianCalendarkelas memiliki dua konstruktor penting: GregorianCalendar()yang mengembalikan sebuah objek yang mewakili saat itu dibuat, dan GregorianCalendar(int year, int month, int date)konstruktor digunakan untuk membuat suatu objek yang mewakili tanggal sewenang-wenang. Metode GregorianCalendarkelas getTime()mengembalikan sebuah Dateobjek. The add(int field, int amount)Metode menghitung tanggal dengan menambah atau mengurangi satuan waktu seperti hari, bulan, atau tahun.

GregorianCalendar dan waktu

Dua GregorianCalendarkonstruktor kelas dapat digunakan untuk menangani waktu. Yang pertama membuat objek yang mewakili tanggal, jam, dan menit:

GregorianCalendar (int tahun, int bulan, int tanggal, int jam, int menit) 

Yang kedua membuat objek yang mewakili tanggal, jam, menit, dan detik:

GregorianCalendar (int tahun, int bulan, int tanggal, int jam, int menit, int detik) 

Pertama, saya harus mencatat bahwa setiap konstruktor membutuhkan informasi tanggal (tahun, bulan, dan hari) selain informasi waktu. Jika Anda ingin berbicara sekitar pukul 14.30, Anda harus menentukan tanggalnya.

Selain itu, setiap GregorianCalendarkonstruktor membuat objek yang mewakili momen dalam waktu yang dihitung ke milidetik terdekat. Jadi, jika konstruktor Anda menggunakan argumen hanya untuk tahun, bulan, dan tanggal, maka nilai untuk jam, menit, detik, dan milidetik disetel ke nol. Demikian pula, jika konstruktor Anda menggunakan argumen untuk tahun, bulan, tanggal, jam, dan menit, maka detik dan milidetik disetel ke nol.

DateFormat dan waktu

Untuk membuat DateFormatobjek untuk menampilkan waktu dan tanggal, Anda dapat menggunakan metode statis getDateTimeInstance(int dateStyle, int timeStyle). Metode itu menentukan gaya tanggal dan waktu yang ingin Anda gunakan. Jika Anda senang dengan gaya default, Anda dapat menggantinya dengan yang lebih pendek getDateTimeInstance().

Untuk membuat DateFormatobjek untuk menampilkan waktu saja, Anda dapat menggunakan metode statis getTimeInstance(int timeStyle).

Program di bawah ini menunjukkan cara kerja getDateTimeInstance()dan getTimeInstance()metode:

import java.util. *; import java.text. *; kelas publik Apollo {public static void main (String [] args) {GregorianCalendar liftOffApollo11 ​​= new GregorianCalendar (1969, Calendar.JULY, 16, 9, 32); Tanggal d = liftOffApollo11.getTime (); DateFormat df1 = DateFormat.getDateTimeInstance (DateFormat.MEDIUM, DateFormat.MEDIUM); DateFormat df2 = DateFormat.getTimeInstance (DateFormat.SHORT); String s1 = df1.format (d); String s2 = df2.format (d); System.out.println (s1); System.out.println (s2); }}

Di komputer saya, program di atas menampilkan yang berikut:

16 Juli 1969 9:32:00

9:32 pagi

(Output dapat bervariasi sesuai dengan pengaturan regional komputer Anda.)

Menghitung waktu yang telah berlalu

Terkadang Anda mungkin perlu menghitung waktu yang telah berlalu; misalnya, Anda mungkin ingin mengetahui durasi proses pembuatan, mengingat waktu mulai dan waktu berakhir. Perusahaan persewaan yang menyewakan barang berdasarkan jam atau hari mungkin juga merasa berguna untuk menghitung waktu yang telah berlalu. Demikian pula, dalam dunia keuangan, sering kali perlu menghitung pembayaran bunga selama waktu yang telah berlalu.

Untuk memperumit masalah, manusia menghitung waktu yang telah berlalu setidaknya dalam dua cara. Anda dapat mengatakan bahwa satu hari telah berlalu ketika 24 jam telah berlalu, atau ketika kalender berubah dari satu hari ke hari berikutnya. Sekarang saya akan membahas dua cara berpikir tersebut.

Waktu berlalu, kasus 1: Satuan penuh

Dalam kasus ini, satu hari belum berlalu hingga 24 jam berlalu, satu jam belum berlalu hingga 60 menit berlalu, satu menit belum berlalu hingga 60 detik telah berlalu, dan seterusnya. Dengan metode ini, 23 jam waktu yang berlalu akan diterjemahkan menjadi nol hari.

Untuk menghitung waktu yang berlalu dengan cara ini, Anda mulai dengan menghitung milidetik yang telah berlalu. Untuk melakukannya, pertama-tama konversikan setiap tanggal ke jumlah milidetik sejak awal 1 Januari 1970. Kemudian kurangi nilai milidetik pertama dari nilai milidetik kedua. Berikut ini contoh perhitungannya:

import java.util. *; kelas publik ElapsedMillis {public static void main (String [] args) {GregorianCalendar gc1 = new GregorianCalendar (1995, 11, 1, 3, 2, 1); GregorianCalendar gc2 = new GregorianCalendar (1995, 11, 1, 3, 2, 2); // dua tanggal di atas berjarak satu detik Date d1 = gc1.getTime (); Tanggal d2 = gc2.getTime (); panjang l1 = d1.getTime (); panjang l2 = d2.getTime (); perbedaan panjang = l2 - l1; System.out.println ("Milidetik berlalu:" + perbedaan); }}

Program di atas mencetak yang berikut ini:

Milidetik berlalu: 1000

Program itu juga menyebabkan kebingungan. The GregorianCalendarkelas itu getTime()kembali suatu Dateobjek, sedangkan Datekelas ini getTime()metode mengembalikan longangka yang mewakili milidetik sebelum atau setelah awal 1 Januari 1970. Jadi meskipun metode memiliki nama yang sama, jenis mereka kembali berbeda!

Anda dapat mengonversi milidetik ke detik menggunakan pembagian bilangan bulat sederhana, seperti pada potongan kode berikut:

milidetik panjang = 1999; detik yang lama = 1999/1000;

Cara mengonversi milidetik menjadi detik menghilangkan pecahan, jadi 1.999 milidetik sama dengan 1 detik, sedangkan 2.000 milidetik sama dengan 2 detik.

Untuk menghitung unit yang lebih besar - seperti hari, jam, dan menit - berdasarkan jumlah detik, Anda dapat menggunakan proses berikut:

  1. Hitung unit terbesar, kurangi jumlah detik yang sesuai
  2. Hitung unit terbesar berikutnya, kurangi jumlah detik yang sesuai
  3. Ulangi sampai hanya tersisa beberapa detik

Misalnya, jika waktu berlalu Anda 10.000 detik, dan Anda ingin mengetahui berapa jam, menit, dan detik yang sesuai dengan nilai tersebut, Anda mulai dengan nilai terbesar: jam. Bagilah 10.000 dengan 3.600 (detik dalam satu jam) untuk menghitung jumlah jam. Menggunakan pembagian bilangan bulat, jawabannya adalah 2 jam (pecahan dijatuhkan dalam pembagian bilangan bulat). Untuk menghitung detik yang tersisa, kurangi 10.000 dengan 3.600 kali 2 jam: 10.000 - (3.600 x 2) = 2.800 detik. Jadi Anda punya 2 jam dan 2.800 detik.

Untuk mengubah 2.800 detik menjadi menit, bagi 2.800 dengan 60 (detik per menit). Dengan pembagian bilangan bulat, jawabannya adalah 46. Dan 2.800 - (60 x 46) = 40 detik. Jawaban akhirnya adalah 2 jam, 46 menit, dan 40 detik.

Perhitungan di atas ditunjukkan dalam program Java berikut:

import java.util. *; public class Elapsed1 {public void calcHMS (int timeInSeconds) {int jam, menit, detik; jam = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (jam * 3600); menit = timeInSeconds / 60; timeInSeconds = timeInSeconds - (menit * 60); detik = timeInSeconds; System.out.println (jam + "jam" + menit + "menit" + detik + "detik"); } public static void main (String [] args) {Elapsed1 elap = new Elapsed1 (); elap.calcHMS (10000); }}

Output dari program diatas adalah:

2 jam 46 menit 40 detik

Program di atas menghitung jumlah jam dengan benar, meskipun waktu yang telah berlalu kurang dari satu jam. Misalnya, jika Anda menggunakan program di atas untuk menghitung 1.000 detik, hasilnya adalah:

0 jam 16 menit 40 detik

Untuk menunjukkan contoh dunia nyata, program berikut menghitung waktu yang telah berlalu berdasarkan penerbangan Apollo 11 ke bulan:

import java.util.*; public class LunarLanding { public long getElapsedSeconds(GregorianCalendar gc1, GregorianCalendar gc2) { Date d1 = gc1.getTime(); Date d2 = gc2.getTime(); long l1 = d1.getTime(); long l2 = d2.getTime(); long difference = Math.abs(l2 - l1); return difference / 1000; } public void calcHM(long timeInSeconds) { long hours, minutes, seconds; hours = timeInSeconds / 3600; timeInSeconds = timeInSeconds - (hours * 3600); minutes = timeInSeconds / 60; System.out.println(hours + " hour(s) " + minutes + " minute(s)" ); } public static void main(String[] args) { GregorianCalendar lunarLanding = new GregorianCalendar(1969, Calendar.JULY, 20, 16, 17); GregorianCalendar lunarDeparture = new GregorianCalendar(1969, Calendar.JULY, 21, 13, 54); GregorianCalendar startEVA = new GregorianCalendar(1969, Calendar.JULY, 20, 22, 56); GregorianCalendar endEVA = new GregorianCalendar(1969, Calendar.JULY, 21, 1, 9); LunarLanding apollo = new LunarLanding(); long eva = apollo.getElapsedSeconds(startEVA, endEVA); System.out.print("EVA duration = "); apollo.calcHM(eva); long lunarStay = apollo.getElapsedSeconds(lunarLanding, lunarDeparture); System.out.print("Lunar stay = "); apollo.calcHM(lunarStay); } } 

Output from the above program is:

EVA duration = 2 hour(s) 13 minute(s)

Lunar stay = 21 hour(s) 37 minute(s)

So far, I have made calculations based on simple formulas like: "1 minute = 60 seconds," "1 hour = 60 minutes," and "1 day = 24 hours."

What about "1 month = ? days" and "1 year = ? days"?

Months can consist of 28, 29, 30, or 31 days; years can be 365 or 366 days. Therefore, problems arise when you try to calculate full units of time for months and years. For example, if you use the average number of days in a month (approximately 30.4375), and you calculate the number of elapsed months based on the following two intervals:

  • July 1, 2:00 a.m. to July 31, 10:00 p.m.
  • February 1, 2:00 a.m. to February 29, 10:00 p.m.

the first calculation will result in 1 month; the second will result in zero months!

So, think very carefully before you calculate elapsed time in full units for months and years.

Elapsed time, case 2: Time unit change

The definition of time unit change is relatively simple: If you are counting days, you simply count the number of times the date has changed. For example, if something starts on the 15th and ends on the 17th, 2 days have passed. (The date changed first to the 16th, then to the 17th.) Similarly, if a process starts at 3:25 in the afternoon and finishes at 4:10 p.m., 1 hour has passed because the hour has changed once (from 3 to 4).

Libraries often calculate time in this manner. For example, if I borrow a book from my library, I don't need to have the book in my possession for a minimum of 24 hours for the library to consider it borrowed for one day. Instead, the day that I borrow the book is recorded on my account. As soon as the date switches to the next day, I have borrowed the book for one day, even though the amount of time is often less than 24 hours.

When calculating elapsed time in the sense of time unit change, it doesn't usually make sense to calculate more than one unit of time. For example, if I borrow a library book at 9:00 p.m., and return it the next day at noon, I can calculate that I've borrowed the book for one day. However, there is little sense in asking, "One day and how many hours?" Since the book was loaned for a total of 15 hours, is the answer one day and negative nine hours? Therefore, for this tutorial, I will calculate time unit change for only one unit of time.

Algorithm for calculating time unit of change

This is how you calculate time unit of change between two dates:

  1. Make copies of the two dates. The clone() method can make copies for you.
  2. Menggunakan salinan tanggal, atur semua bidang yang lebih kecil dari unit perubahan ke nilai minimum setiap bidang. Misalnya, jika Anda menghitung hari yang telah berlalu, setel jam, menit, detik, dan milidetik ke nol. Dalam kasus ini, gunakan clear()metode untuk menyetel bidang waktu ke nilai terendahnya.
  3. Ambil tanggal sebelumnya dan tambahkan satu ke bidang yang Anda hitung, ulangi sampai kedua tanggal itu sama. Berapa kali Anda menambahkan satu adalah jawabannya. Anda dapat menggunakan metode before()dan after(), yang mengembalikan nilai boolean, untuk menguji apakah satu tanggal sebelum atau setelah tanggal lain.

Kelas berikut memiliki metode untuk menghitung hari dan bulan.