JavaRush /Blog Java /Random-MS /Bagaimana untuk tidak tersesat dalam masa - DateTime dan ...

Bagaimana untuk tidak tersesat dalam masa - DateTime dan Kalendar

Diterbitkan dalam kumpulan
hello! Hari ini kami akan mula bekerja dengan jenis data baharu yang belum pernah kami temui sebelum ini, iaitu tarikh. Bagaimana untuk tidak tersesat dalam masa - DateTime dan Kalendar - 1Saya rasa tidak ada keperluan untuk menerangkan apa itu tarikh :) Pada dasarnya, agak mungkin untuk menulis tarikh dan masa semasa di Jawa dalam rentetan biasa.
public class Main {
   public static void main(String[] args) {

       String date = "June 11, 2018";
       System.out.println(date);
   }
}
Tetapi pendekatan ini mempunyai banyak kelemahan. Kelas Stringdicipta untuk berfungsi dengan teks, dan ia mempunyai kaedah yang sesuai. Jika kita perlu menguruskan tarikh tersebut (contohnya, tambahkan 2 jam padanya), ia Stringtidak akan berfungsi di sini. Atau, sebagai contoh, paparkan tarikh dan masa semasa pada masa program disusun ke dalam konsol. Ia tidak akan membantu di sini Stringsama ada: semasa anda menulis kod dan menjalankannya, masa akan berubah dan yang tidak berkaitan akan dipaparkan dalam konsol. Oleh itu, di Jawa, penciptanya menyediakan beberapa kelas untuk bekerja dengan tarikh dan masa. Yang pertama ialah kelasjava.util.Date

Kelas Tarikh Java

Kami memberikan nama penuhnya kerana terdapat juga kelas dalam pakej lain di Jawa java.sql.Date. Jangan keliru! Perkara pertama yang perlu anda ketahui mengenainya ialah ia menyimpan tarikh dalam milisaat yang telah berlalu sejak 1 Januari 1970. Malah terdapat nama berasingan untuk tarikh ini - "Masa Unix". Cara yang agak menarik, tidakkah anda bersetuju? :) Perkara kedua yang perlu diingat: jika anda mencipta objek Datedengan pembina kosong, hasilnya akan menjadi tarikh dan masa semasa pada masa objek itu dicipta . StringAdakah anda masih ingat bagaimana kami menulis bahawa tugas sedemikian akan menjadi masalah untuk format tarikh ? Kelas Datemenyelesaikannya dengan mudah.
public class Main {
   public static void main(String[] args) {

       Date date = new Date();
       System.out.println(date);
   }
}
Jalankan kod ini beberapa kali dan anda akan melihat bagaimana masa akan berubah setiap kali :) Ini mungkin tepat kerana ia disimpan dalam milisaat: ia adalah unit masa terkecil, itulah sebabnya keputusannya sangat tepat. Terdapat satu lagi pembina untuk Date: anda boleh menentukan bilangan tepat milisaat yang telah berlalu dari 00:00 1 Januari 1970 ke tarikh yang diperlukan, dan ia akan dibuat:
public class Main {
   public static void main(String[] args) {

       Date date = new Date(1212121212121L);
       System.out.println(date);
   }
}
Output konsol:

Fri May 30 08:20:12 MSD 2008
Kami mendapatnya pada 30 Mei 2008. "Jumaat" bermaksud hari dalam seminggu - "Jumaat" (Jumaat), dan MSD - "Moscow Daylight Saving" (Waktu musim panas Moscow). Milidetik dihantar dalam format long, kerana bilangannya paling kerap tidak sesuai int. Jadi, apakah jenis operasi tarikh yang mungkin kita perlukan dalam kerja kita? Nah, perkara yang paling jelas, tentu saja, adalah perbandingan . Tentukan sama ada satu tarikh lewat atau lebih awal daripada tarikh lain. Ini boleh dilakukan dengan cara yang berbeza. Sebagai contoh, anda boleh memanggil kaedah . Date.getTime(), yang akan mengembalikan bilangan milisaat yang telah berlalu sejak tengah malam pada 1 Januari 1970. Mari kita panggilnya pada dua objek Date dan bandingkan antara satu sama lain:
public class Main {
   public static void main(String[] args) {

       Date date1 = new Date();

       Date date2 = new Date();

       System.out.println((date1.getTime() > date2.getTime())?
               "date1 is later than date2" : "date1 is earlier than date2");
   }
}
Kesimpulan:

date1 раньше date2
Tetapi ada cara yang lebih mudah, iaitu, menggunakan kaedah khas kelas Date: before(), after()dan equals(). Mereka semua mengembalikan keputusan dalam boolean. Kaedah before()menyemak sama ada tarikh kami lebih awal daripada tarikh yang kami lalukan sebagai hujah:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.before(date2));
   }
}
Output konsol:

true
Kaedah ini berfungsi dengan cara yang sama after(); ia menyemak sama ada tarikh kami lewat daripada tarikh yang kami lalukan sebagai hujah:
public class Main {
   public static void main(String[] args) throws InterruptedException {

       Date date1 = new Date();

       Thread.sleep(2000);//pause the program for 2 seconds
       Date date2 = new Date();

       System.out.println(date1.after(date2));
   }
}
Output konsol:

false
Dalam contoh kami, kami meletakkan program untuk tidur selama 2 saat supaya kedua-dua tarikh itu dijamin berbeza. Pada komputer pantas, masa antara membuat date1dan date2boleh kurang daripada satu milisaat, dalam hal ini kedua-duanya dan before()dan after()akan kembali false. Tetapi kaedah equals()dalam keadaan sedemikian akan kembali true! Lagipun, ia membandingkan dengan tepat bilangan milisaat yang telah berlalu sejak 00:00 1 Januari 1970 untuk setiap tarikh. Objek hanya akan dianggap sama jika ia sepadan dengan milisaat:
public static void main(String[] args) {

   Date date1 = new Date();
   Date date2 = new Date();

   System.out.println(date1.getTime());
   System.out.println(date2.getTime());

   System.out.println(date1.equals(date2));
}
Berikut adalah perkara lain yang perlu anda perhatikan. Jika anda membuka dokumentasi untuk kelas Datedi tapak web Oracle, anda akan melihat bahawa banyak kaedah dan pembinanya telah ditetapkan sebagai Deprecated("tidak digunakan"). Di sini, lihat: Tarikh Kelas Inilah yang dikatakan oleh pencipta Java sendiri tentang bahagian kelas yang telah tidak digunakan lagi: “Elemen program yang dianotasi dengan @Deprecated ialah sesuatu yang tidak digalakkan oleh pengaturcara untuk menggunakannya, biasanya kerana ia berbahaya atau kerana itu ada alternatif yang lebih baik.” Ini tidak bermakna kaedah ini tidak boleh digunakan sama sekali. Lebih-lebih lagi, jika anda sendiri cuba menjalankan kod menggunakan kod tersebut dalam IDEA, kemungkinan besar ia akan berfungsi. Mari kita ambil sebagai contoh kaedah yang tidak digunakan Date.getHours(), yang mengembalikan bilangan jam daripada objek Date.
public static void main(String[] args) {

   Date date1 = new Date();

   System.out.println(date1.getHours());

}
Jika pada masa anda menjalankan kod, contohnya, masa ialah 14:21, ia akan memaparkan nombor 14. Seperti yang anda lihat, kaedah yang tidak digunakan dipalang, tetapi ia berfungsi dengan baik. Kaedah ini tidak dialih keluar sepenuhnya, supaya tidak memecahkan sekumpulan kod yang telah ditulis menggunakannya. Iaitu, kaedah ini tidak "pecah" atau "dialih keluar", mereka hanya tidak disyorkan untuk digunakan kerana ketersediaan alternatif yang lebih mudah. Ngomong-ngomong, ia ditulis mengenainya betul-betul dalam dokumentasi: Bagaimana untuk tidak tersesat dalam masa - DateTime dan Kalendar - 2Kebanyakan kaedah kelas Date telah dipindahkan ke versi yang dipertingkatkan dan diperluas - kelas Calendar. Kami akan mengenalinya lebih lanjut :)

Kalendar Java

Java 1.1 memperkenalkan kelas baharu - Calendar. Dia membuat kerja dengan kurma di Jawa sedikit lebih mudah daripada yang dilihat sebelum ini. Satu-satunya pelaksanaan kelas Calendaryang akan kami gunakan ialah kelas GregorianCalendar(ia melaksanakan kalendar Gregorian, mengikut mana kebanyakan negara di dunia tinggal). Kemudahan utamanya ialah ia boleh berfungsi dengan tarikh dalam format yang lebih mudah. Sebagai contoh, dia boleh:
  • Tambahkan bulan atau hari pada tarikh semasa
  • Semak sama ada tahun itu adalah tahun lompat;
  • Dapatkan komponen tarikh individu (contohnya, dapatkan nombor bulan daripada tarikh keseluruhan)
  • Dan juga, sistem pemalar yang sangat mudah telah dibangunkan di dalamnya (kita akan melihat banyak daripada mereka di bawah).
Satu lagi perbezaan penting kelas Calendarialah ia melaksanakan pemalar Calendar.Era: anda boleh menetapkan tarikh kepada era SM (“Sebelum Kristus” - sebelum kelahiran Kristus, iaitu “sebelum era kita”) atau AC (“Selepas Kristus” - “ zaman kita"). Mari kita lihat semua ini dengan contoh. Mari buat kalendar dengan tarikh 25 Januari 2017:
public static void main(String[] args) {

  Calendar calendar = new GregorianCalendar(2017, 0 , 25);
}
Bulan dalam kelas Calendar(seperti dalam Date, dengan cara itu) bermula dari sifar, jadi kami melepasi nombor 0 sebagai hujah kedua. Perkara utama apabila bekerja dengan kelas Calendaradalah untuk memahami bahawa ini adalah kalendar , dan bukan tarikh yang berasingan. Bagaimana untuk tidak tersesat dalam masa - DateTime dan Kalendar - 3Tarikh hanyalah satu siri nombor yang mewakili tempoh masa tertentu. Dan kalendar ialah peranti keseluruhan yang anda boleh melakukan banyak perkara dengan tarikh :) Ini boleh dilihat dengan jelas jika anda cuba mengeluarkan objek Kalendar ke konsol: Output:

java.util.GregorianCalendar[time=?,areFieldsSet=false,areAllFieldsSet=false,lenient=true,zone=sun.util.calendar.ZoneInfo[id="Europe/Moscow",offset=10800000,dstSavings=0,useDaylight=false,transitions=79,lastRule=null],firstDayOfWeek=2,minimalDaysInFirstWeek=1,ERA=?,YEAR=2017,MONTH=0,WEEK_OF_YEAR=?,WEEK_OF_MONTH=?,DAY_OF_MONTH=25,DAY_OF_YEAR=?,DAY_OF_WEEK=?,DAY_OF_WEEK_IN_MONTH=?,AM_PM=0,HOUR=0,HOUR_OF_DAY=0,MINUTE=0,SECOND=0,MILLISECOND=?,ZONE_OFFSET=?,DST_OFFSET=?]
Lihat berapa banyak maklumat yang ada! Kalendar mempunyai sekumpulan sifat yang tidak ada pada tarikh biasa, dan kesemuanya adalah output kepada konsol (begini cara kaedah toString()dalam kelas berfungsi Calendar). Jika, semasa bekerja, anda hanya perlu mendapatkan tarikh ringkas dari kalendar, i.e. objek Date- ini dilakukan menggunakan kaedah Calendar.getTime()(nama itu bukan yang paling logik, tetapi tiada apa yang boleh dilakukan):
public static void main(String[] args) {

   Calendar calendar = new GregorianCalendar(2017, 0 , 25);
   Date date = calendar.getTime();
   System.out.println(date);
}
Kesimpulan:

Wed Jan 25 00:00:00 MSK 2017
Kini kami telah "mempermudahkan" kalendar kepada tarikh biasa. Jom teruskan. Sebagai tambahan kepada simbol berangka selama berbulan-bulan, Calendarpemalar boleh digunakan di dalam bilik darjah. Pemalar ialah medan statik kelas Calendardengan nilai yang telah ditetapkan yang tidak boleh diubah. Pilihan ini sebenarnya lebih baik, kerana ia meningkatkan kebolehbacaan kod.
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
}
Calendar.JANUARY— salah satu pemalar untuk menunjukkan bulan. Dengan pilihan penamaan ini, tiada siapa yang akan lupa, sebagai contoh, bahawa nombor "3" bermaksud April, dan bukan bulan ketiga yang kita biasa - Mac. Anda hanya menulis Calendar.APRIL- dan itu sahaja :) Semua medan kalendar (hari, bulan, minit, saat, dll.) boleh ditetapkan secara individu menggunakan kaedah set(). Ia sangat mudah, kerana Calendarsetiap medan mempunyai pemalar sendiri dalam kelas, dan kod akhir akan kelihatan semudah mungkin. Sebagai contoh, dalam contoh sebelumnya, kami mencipta tarikh, tetapi tidak menetapkan masa semasa untuk tarikh tersebut. Mari tetapkan masa kepada 19:42:12
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar();
   calendar.set(Calendar.YEAR, 2017);
   calendar.set(Calendar.MONTH, 0);
   calendar.set(Calendar.DAY_OF_MONTH, 25);
   calendar.set(Calendar.HOUR_OF_DAY, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println(calendar.getTime());
}
Kesimpulan:

Wed Jan 25 19:42:12 MSK 2017
Kami memanggil kaedah set(), hantar pemalar kepadanya (bergantung pada medan yang ingin kami ubah) dan nilai baharu untuk medan ini. Ternyata kaedah itu set()adalah sejenis "super-setter" yang boleh menetapkan nilai bukan untuk satu medan, tetapi untuk banyak medan :) Menambah dan menolak nilai dalam kelas Calendardijalankan menggunakan add(). Anda perlu memasukkan medan yang ingin anda ubah ke dalamnya, dan nombor - berapa banyak yang anda mahu tambah/tolak daripada nilai semasa. Sebagai contoh, mari kita tetapkan tarikh yang kita buat kembali kepada 2 bulan yang lalu:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 19);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.add(Calendar.MONTH, -2);//to subtract a value - a negative number must be passed to the method
   System.out.println(calendar.getTime());
}
Kesimpulan:

Fri Nov 25 19:42:12 MSK 2016
Hebat! Kami telah menetapkan tarikh kembali kepada 2 bulan yang lalu. Akibatnya, bukan sahaja bulan, tetapi juga tahun telah berubah, dari 2017 hingga 2016. Pengiraan tahun semasa apabila memindahkan tarikh, sudah tentu, dilakukan secara automatik dan tidak perlu dikawal secara manual. Tetapi jika untuk tujuan tertentu anda perlu melumpuhkan tingkah laku ini, anda boleh melakukannya. Kaedah khas roll()boleh menambah dan menolak nilai tanpa menjejaskan nilai lain. Sebagai contoh, seperti ini:
public static void main(String[] args) {
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(calendar.getTime());
}
Kami melakukan perkara yang sama seperti dalam contoh sebelumnya - kami menolak 2 bulan dari tarikh semasa. Tetapi kini kod itu berfungsi secara berbeza: bulan berubah dari Januari ke November, tetapi tahun itu kekal sama seperti 2017! Kesimpulan:

Sat Nov 25 10:42:12 MSK 2017
Selanjutnya. Seperti yang kami katakan di atas, semua medan objek Calendarboleh diperoleh secara berasingan. Kaedah ini bertanggungjawab untuk ini get():
public static void main(String[] args) {
   GregorianCalendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   System.out.println("Year: " + calendar.get(Calendar.YEAR));
   System.out.println("Month: " + calendar.get(Calendar.MONTH));
   System.out.println("Number of the week in the month: " + calendar.get(Calendar.WEEK_OF_MONTH));// serial number of the week in the month

   System.out.println("Number: " + calendar.get(Calendar.DAY_OF_MONTH));

   System.out.println("Watch: " + calendar.get(Calendar.HOUR));
   System.out.println("Minutes: " + calendar.get(Calendar.MINUTE));
   System.out.println("Seconds: " + calendar.get(Calendar.SECOND));
   System.out.println("Milliseconds: " + calendar.get(Calendar.MILLISECOND));

}
Kesimpulan:

Год: 2017 
Месяц: 0 
Порядковый номер недели в месяце: 4 
Число: 25 
Часы: 10 
Минуты: 42 
Секунды: 12 
Миллисекунды: 0
Iaitu, sebagai tambahan kepada "super-setter" di dalam kelas Calendarterdapat juga "super-getter" :) Satu lagi perkara yang menarik ialah, sudah tentu, bekerja dengan era. Untuk mencipta tarikh "SM" anda perlu menggunakan medan Calendar.Era Contohnya, mari buat tarikh yang menunjukkan Pertempuran Cannae, di mana Hannibal mengalahkan tentera Rom. Ini berlaku pada 2 Ogos 216 SM. e.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Di sini kami menggunakan kelas SimpleDateFormatuntuk memaparkan tarikh dalam format yang lebih mudah difahami oleh kami (huruf "GG" bertanggungjawab untuk memaparkan era). Kesimpulan:

02 авг 216 до н.э.
CalendarTerdapat banyak lagi kaedah dan pemalar dalam kelas , baca tentangnya dalam dokumentasi:

Menukar rentetan kepada Tarikh

Untuk menukar String kepada Date, anda boleh menggunakan kelas pembantu Java - SimpleDateFormat . Ini ialah kelas yang anda perlukan untuk menukar tarikh kepada format yang anda tentukan. Bagaimana untuk tidak tersesat dalam masa - DateTime dan Kalendar - 5Sebaliknya, ia sangat serupa dengan DateFormat . Satu-satunya perbezaan ketara antara kedua-duanya ialah SimpleDateFormat boleh digunakan untuk pemformatan (menukar tarikh kepada rentetan) dan menghuraikan rentetan ke tarikh sedar setempat, manakala DateFormat tidak menyokong tempat. Selain itu, DateFormat ialah kelas abstrak yang menyediakan sokongan asas untuk pemformatan dan penghuraian tarikh, manakala SimpleDateFormat ialah kelas konkrit yang memanjangkan kelas DateFormat. Inilah contoh mencipta objek SimpleDateFormat dan memformat Tarikh:
SimpleDateFormat formater = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = new Date(1212121212121L);

System.out.println(formatter.format(date));
Dalam contoh di atas kami menggunakan corak "yyyy-MM-dd HH:mm:ss" yang bermaksud:
  • 4 digit untuk tahun (yyyy);
  • 2 digit untuk bulan (MM);
  • 2 digit untuk hari (dd);
  • 2 digit untuk jam dalam format 24 jam (HH);
  • 2 digit untuk minit (mm);
  • 2 digit untuk saat (ss).
Tanda pemisahan dan susunan simbol corak dikekalkan. Output konsol:
2008-05-30 08:20:12
Terdapat banyak huruf templat untuk kelas SimpleDateFormat . Supaya anda tidak keliru, kami telah mengumpulkannya dalam jadual:
Simbol Penerangan Contoh
G era (dalam penyetempatan Inggeris - AD dan BC) AD
y tahun (4 digit nombor) 2020
yy tahun (2 digit terakhir) 20
yyyy tahun (4 digit nombor) 2020
M nombor bulan (tanpa mendahului sifar) 8
MM nombor bulan (dengan sifar pendahuluan jika nombor bulan < 10) 04
MMM singkatan bulan tiga huruf (mengikut penyetempatan) Jan
MMMM nama bulan penuh Jun
w minggu dalam setahun (tanpa mendahului sifar) 4
ww minggu dalam setahun (dengan sifar pendahuluan) 04
W minggu dalam bulan (tanpa mendahului sifar) 3
WW minggu dalam bulan (dengan sifar pendahuluan) 03
D hari dalam setahun 67
d hari dalam bulan (tanpa mendahului sifar) 9
dd hari dalam bulan (dengan sifar pendahuluan) 09
F hari dalam minggu dalam bulan tersebut (tanpa mendahului sifar) 9
FF hari dalam minggu dalam bulan (dengan sifar pendahuluan) 09
E hari dalam seminggu (singkatan) W
EEEE hari dalam seminggu (penuh) Jumaat
u nombor hari dalam minggu (tanpa sifar pendahuluan) 5
uu bilangan hari dalam seminggu (dengan sifar pendahuluan) 05
a Penanda AM/PM A.M.
H jam dalam format 24 jam tanpa sifar pendahuluan 6
HH jam dalam format 24 jam dengan sifar pendahuluan 06
k bilangan jam dalam format 24 jam 18
K bilangan jam dalam format 12 jam 6
h masa dalam format 12 jam tanpa mendahului sifar 6
hh masa dalam format 12 jam dengan sifar pendahuluan 06
m minit tanpa mendahului sifar 32
mm minit dengan sifar pendahuluan 32
s saat tanpa mendahului sifar sebelas
ss saat dengan sifar pendahuluan sebelas
S milisaat 297
z Zon masa EET
Z zon waktu dalam format RFC 822 300
Contoh gabungan aksara corak:
Sampel Contoh
dd-MM-yyyy 01-11-2020
yyyy-MM-dd 2019-10-01
HH:mm:ss.SSS 23:59.59.999
tttt-MM-dd HH:mm:ss 30-11-2018 03:09:02
tttt-MM-dd HH:mm:ss.SSS 01-03-2016 01:20:47.999
tttt-MM-dd HH:mm:ss.SSS Z 13-13-2013 23:59:59.999 +0100
Jika anda membuat sedikit kesilapan dengan format, anda boleh menjadi pemilik java.text.ParseException, dan ini bukanlah pencapaian yang sangat menggembirakan. Nah, lawatan singkat ke SimpleDateFormat telah tamat - mari kembali ke terjemahan rentetan java hingga kini . SimpleDateFormat memberi kami keupayaan sedemikian, dan kami akan melalui proses ini langkah demi langkah.
  1. Buat baris yang anda perlukan untuk menetapkan tarikh:

    String strDate = "Sat, April 4, 2020";
  2. Kami mencipta objek SimpleDateFormat baharu dengan templat yang sepadan dengan apa yang kami ada dalam rentetan (jika tidak, kami tidak akan dapat menghuraikannya):

    SimpleDateFormat formatter = new SimpleDateFormat("EEE, MMMM d, yyyy", Locale.ENGLISH);

    Seperti yang anda lihat, kami mempunyai hujah Locale di sini. Jika kami meninggalkannya, ia akan menggunakan Locale lalai, yang tidak selalunya bahasa Inggeris.

    Jika tempattempat tidak sepadan dengan rentetan input, maka data rentetan yang terikat pada bahasa, seperti kami Mon atau April , tidak akan dikenali dan akan membuang java.text.ParseException, walaupun coraknya sepadan.

    Walau bagaimanapun, kami tidak perlu menentukan format jika kami menggunakan templat yang tidak khusus bahasa. Sebagai contoh - tttt-MM-dd HH:mm:ss

  3. Kami mencipta tarikh menggunakan pemformat, yang seterusnya menghuraikannya daripada rentetan input:

    try {
      Date date = formatter.parse(strDate);
      System.out.println(date);
    }
    catch (ParseException e) {
      e.printStackTrace();
    }

    Output konsol:

    
    Sat Apr 04 00:00:00 EEST 2020

    Hmmm... Tapi format dah tak sama!

    Untuk membuat format yang sama, kami menggunakan pemformat sekali lagi:

    System.out.println(formatter.format(date));

    Output konsol:

    
    Sat, April 4, 2020

SimpleDateFormat dan Kalendar

SimpleDateFormat membolehkan anda memformat semua objek Tarikh dan Kalendar yang anda buat untuk kegunaan kemudian. Mari kita pertimbangkan perkara yang menarik seperti bekerja dengan era. Untuk membuat tarikh "SM", anda perlu menggunakan medan Calendar.Era. Contohnya, mari buat tarikh yang menunjukkan Pertempuran Cannae, di mana Hannibal mengalahkan tentera Rom. Ini berlaku pada 2 Ogos 216 SM. e.:
public static void main(String[] args) {
   GregorianCalendar cannes = new GregorianCalendar(216, Calendar.AUGUST, 2);
   cannes.set(Calendar.ERA, GregorianCalendar.BC);

   DateFormat df = new SimpleDateFormat("dd MMM yyy GG");
   System.out.println(df.format(cannes.getTime()));
}
Di sini kami menggunakan kelas SimpleDateFormat untuk memaparkan tarikh dalam format yang lebih mudah difahami oleh kami (seperti yang ditunjukkan di atas, huruf "GG" bertanggungjawab untuk memaparkan era). Kesimpulan:

02 авг 216 до н.э.

Format Tarikh Java

Ini satu lagi kes. Mari kita anggap bahawa format tarikh ini tidak sesuai dengan kita:

Sat Nov 25 10:42:12 MSK 2017
Jadi begini. Menggunakan keupayaan kami dalam format tarikh java, anda boleh menukarnya kepada anda sendiri tanpa banyak kesukaran:
public static void main(String[] args) {

   SimpleDateFormat dateFormat = new SimpleDateFormat("EEEE, d MMMM yyyy");
   Calendar calendar = new GregorianCalendar(2017, Calendar.JANUARY , 25);
   calendar.set(Calendar.HOUR, 10);
   calendar.set(Calendar.MINUTE, 42);
   calendar.set(Calendar.SECOND, 12);

   calendar.roll(Calendar.MONTH, -2);
   System.out.println(dateFormat.format(calendar.getTime()));
}
Kesimpulan:

суббота, 25 Ноябрь 2017
Jauh lebih baik, bukan? :)
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION