1. Datekelas dan masa Unix

Sejak awal Java, bahasa ini mempunyai kelas khas untuk bekerja dengan masa dan tarikh — Date. Dari masa ke masa, beberapa lagi kelas untuk bekerja dengan tarikh muncul, tetapi pengaturcara terus menggunakan Datekelas itu sehingga hari ini.

Ini kerana ia sangat mudah dan selesa. Dan sebagai pengaturcara, anda pasti akan menemuinya dalam mana-mana projek sebenar. Sama ada mahu menggunakannya atau tidak adalah pilihan anda, tetapi anda mesti mengetahuinya. Jadi berikan beberapa minit masa berharga anda.

Apa yang membuatkan Datekelas itu begitu baik? Kesederhanaannya.

Kelas Datemenyimpan maklumat tarikh dan masa sebagai bilangan milisaat yang telah berlalu sejak 1 Januari 1970. Itu adalah banyak milisaat, jadi longjenis itu digunakan untuk menyimpannya.

Menarik.

Mengapa sejak 1970 khususnya? Inilah yang dipanggil masa Unix : ia adalah bagaimana sistem pengendalian Unix, yang merupakan datuk kepada semua sistem pengendalian moden, mengekalkan masa.

Tetapi anda boleh mengetahui dengan mudah berapa banyak masa telah berlalu antara dua tarikh: hanya tolak satu tarikh daripada tarikh yang lain, dan anda mendapat perbezaan masa antara tarikh kepada milisaat terdekat.

Berikut ialah beberapa contoh berguna untuk bekerja dengan Datekelas.


2. Mendapat tarikh semasa

Untuk mendapatkan masa dan tarikh semasa, hanya buat Dateobjek. Setiap objek baharu menyimpan masa apabila ia dicipta. Ia kelihatan sangat mudah:

Date current = new Date();

Selepas melaksanakan arahan ini, currentpembolehubah akan menyimpan rujukan kepada Dateobjek yang dicipta, yang akan menyimpan secara dalaman masa penciptaannya — bilangan milisaat yang telah berlalu sejak 1 Januari 1970.

Memaparkan tarikh semasa pada skrin

Untuk memaparkan tarikh semasa, hanya: a) cipta Dateobjek baharu, b) cetak ke skrin menggunakan System.out.println()kaedah.

Contoh:

Kod Output konsol
Date current = new Date();
System.out.println(current);
Thu Feb 21 14:01:34 EET 2019

Inilah maksud output konsol:

Teks Tafsiran
Khamis rsday Khamis
21 Februari 21 Februari
14:01:34 jam : minit : saat
EET Zon waktu: Waktu Eropah Timur
2019 tahun

3. Menetapkan tarikh tertentu

Kami memikirkan cara untuk mendapatkan masa semasa, tetapi bagaimanakah kami membuat Dateobjek yang menyimpan tarikh atau masa yang berbeza?

Sekali lagi, semuanya mudah di sini. Untuk menetapkan tarikh tertentu, anda perlu menulis kod seperti ini:

Date birthday = new Date(year, month, day);

Segala-galanya mudah dan jelas, tetapi terdapat dua nuansa yang perlu diperhatikan:

  1. Tahun mesti dikira dari 1900.
  2. Bulan dinomborkan dari sifar.
Menarik.

Ini adalah satu lagi warisan sistem pengendalian Unix: pada Unix, pengaturcara menandakan tahun menggunakan dua digit. Daripada 1977, mereka hanya menulis 77. Jadi 77 adalah tahun yang betul jika kita mengira dari 1900.

Sebagai contoh, saya dilahirkan pada 21 Mac 1989. Mac adalah bulan ketiga, jadi saya perlu menulis:

Kod Output konsol
Date current = new Date(89, 2, 21);
System.out.println(current);
Tue Mar 21 00:00:00 EET 1989

Bulan dinomborkan dari sifar, tetapi hari tidak Itu agak pelik, bukan?

Kami fikir pengaturcara yang benar sepatutnya telah menang dan menomborkan hari dalam bulan dari sifar juga. Oh, konformis ini 🙂

Menetapkan masa tertentu

Menetapkan masa tertentu juga agak mudah: untuk ini, anda perlu menulis kenyataan seperti ini:

Date birthday = new Date(year, month, day, hour, minutes, seconds);

Jam, minit dan saat dinomborkan dari sifar: biarkan pengaturcara di dalam diri anda menarik nafas lega.

Contoh:

Kod Output konsol
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current);
Sat Jun 04 12:15:00 EEST 2005

Kami menetapkan masa 12:15 dan tarikh 4 Jun 2005 . Ini agak sukar untuk dibaca oleh bukan pengaturcara, tetapi ia berfungsi sebagaimana mestinya.


4. Bekerja dengan unsur tarikh

Anda boleh melakukan lebih banyak dengan Dateobjek daripada sekadar memaparkannya. Ia mempunyai kaedah yang membolehkan anda mendapatkan elemen individu tarikh yang disimpan secara dalaman:

Kaedah Penerangan
int getYear()
Mengembalikan tahun tarikh berbanding 1900.
int getMonth()
Mengembalikan bulan tarikh (bulan dinomborkan dari sifar)
int getDate()
Mengembalikan hari dalam bulan
int getDay()
Mengembalikan hari dalam seminggu
int getHours()
Mengembalikan jam
int getMinutes()
Mengembalikan minit
int getSeconds()
Mengembalikan detik

Contoh:

Kod Output konsol Catatan
Date current = new Date(105, 5, 4, 12, 15, 0);
System.out.println(current.getYear());
System.out.println(current.getMonth());
System.out.println(current.getDate());
System.out.println(current.getDay());

105
5
4
6

2005
Jun
hari bulan
Sabtu

Ngomong-ngomong, Dateobjek bukan sahaja membenarkan anda mendapatkan elemen individu tarikh, tetapi juga mengubahnya:

Kaedah Penerangan
void setYear(int year) Menukar tahun tarikh. Tahun ini ditunjukkan relatif kepada 1900.
void setMonth(int month) Menukar bulan tarikh (bulan dinomborkan daripada sifar)
void setDate(int date) Mengubah hari dalam bulan
void setHours(int hours) Tukar jam
void setMinutes(int minutes) Menukar minit
void setSeconds(int seconds) Berubah saat

5. milisaat

Seperti yang kami katakan sebelum ini, Dateobjek menyimpan bilangan milisaat yang telah berlalu sejak 1 Januari 1970.

Jika kita memerlukan nombor itu, kita boleh mendapatkannya daripada Dateobjek:

long time = date.getTime();

Kaedah ini getTime()mengembalikan bilangan milisaat yang disimpan di dalam Dateobjek.

Anda bukan sahaja boleh mendapatkan bilangan milisaat, tetapi anda juga boleh menukar nombor itu dalam objek sedia ada:

Date date = new Date();
date.setTime(1117876500000L);

Dengan cara ini, anda boleh menulis ini dengan lebih ringkas dengan meluangkan masa ke Dateobjek tepat apabila ia dibuat:

Date date = new Date(1117876500000L);

6. Membandingkan tarikh

Jika anda ingin membandingkan dua tarikh dan mengetahui yang mana satu datang dahulu, anda mempunyai tiga pilihan

Cara pertama ialah dengan hanya membandingkan bilangan milisaat yang mereka simpan setiap satu:

if (date1.getTime() < date2.getTime())

Cara kedua ialah menggunakan before()kaedah objek Date:

if (date1.before(date2))

Ia berbunyi seperti ini: jika date1datang sebelum date2, maka...

Cara ketiga ialah menggunakan after()kaedah objek Date:

if (date2.after(date1))

Ia berbunyi seperti ini: jika date2selepas date1, maka...


7. DateFormatkelas

Ingat, apabila kami memaparkan tarikh pada skrin, kami melihat sesuatu seperti ini: Thu Feb 21 14:01:34 EET 2019. Semuanya kelihatan betul, tetapi formatnya lebih kepada bagaimana tarikh akan dipaparkan untuk pengaturcara dan bukannya manusia biasa. Kami mahu memaparkan tarikh dengan lebih jelas untuk pengguna. Sesuatu seperti Tuesday, February 21.

Dan tanpa tahun. Atau dengan setahun, jika perlu. Secara umum, kami mahu dapat memaparkan tarikh dengan cara yang berbeza.

Ada kelas khas untuk ini: SimpleDateFormat.

Contoh:

Kod
Date current = new Date(105, 5, 4, 12, 15, 0);
SimpleDateFormat formatter = new SimpleDateFormat("MMM-dd-YYYY");
String message = formatter.format(current);
System.out.println(message);
Output konsol
Jun-04-2005

Lihat apa yang dipaparkan oleh program: Jun-04-2005. Itu sama sekali tidak seperti dulu.

Perbezaannya ialah kami tidak memaparkan Dateobjek itu sendiri, tetapi rentetan khas yang diperoleh dengan memanggil format()kaedah pada SimpleDateFormatobjek. Tetapi itu bukan perkara utama di sini.

Apabila SimpleDateFormatobjek dicipta, kami lulus dalam rentetan "MMM-dd-YYYY"sebagai parameter. Rentetan inilah yang menyampaikan format tarikh yang akhirnya kami lihat dalam output konsol.

  • MMM menunjukkan untuk memaparkan nama bulan, dipendekkan menggunakan tiga huruf
  • dd menunjukkan untuk memaparkan hari dalam sebulan
  • YYYY menunjukkan untuk memaparkan tahun menggunakan empat digit

Jika kita ingin mengeluarkan bulan sebagai nombor, maka bukannya MMM, kita perlu menulis MM, yang menghasilkan corak "MM-dd-YYYY". Output skrin akan menjadi06-04-2005

Kami akan membincangkan kelas ini dengan lebih terperinci kemudian.


8. Date.parsekaedah

Kelas Dateboleh melakukan sesuatu yang menarik dan berguna — ia boleh mendapatkan tarikh daripada rentetan. Atau, seperti yang dikatakan pengaturcara, ia boleh menghuraikan rentetan.

Ia mempunyai kaedah khas parse()untuk ini. Penghuraian kelihatan seperti ini:

Date date = new Date();
date.setTime( Date.parse("Jul 06 12:15:00 2019") );

Dengan cara ini, kod ini boleh ditulis dengan lebih padat:

Date date = new Date("Jul 06 12:15:00 2019");

Kami akan mempertimbangkan penghuraian rentetan dengan lebih terperinci dalam pelajaran lain.