Sejak rilis Java 8 pada tahun 2014, Java.util.Date kuno kami akhirnya bukan lagi satu -satunya pilihan untuk tanggal operasi dan waktu di Java.
Bahkan, API terkait tanggal dan waktu di Java selalu dikritik oleh dunia. Bukan hanya itu bukan hanya karena divisi desainnya tidak jelas, tetapi sering dapat menangani tanggal dan waktu, yang sangat membingungkan. Ini juga pemetaan numerik dari tahun -tahun tertentu, bulan dan tanggal disimpan terhadap manusia, seperti: 0 sesuai dengan bulan Januari, 11 sesuai dengan bulan Desember, 118 sesuai dengan tahun 2018 (1900 + 118), dll.
Seringkali, ketika kita mendapatkan nilai tahun dan bulan tertentu, kita perlu melakukan operasi yang sesuai untuk mendapatkan informasi tahun, bulan dan tanggal yang akurat. Sampai Java 8 kami, kami meminjam desain yang sangat baik dari perpustakaan open source pihak ketiga Joda-Time, dan mendesain ulang API tanggal dan waktu. Dibandingkan dengan yang sebelumnya, dapat dikatakan bahwa seratus kali lebih mudah digunakan. Semua antarmuka API terkait terletak di paket java.time.
Antarmuka Tanggal dan Waktu Kuno
Tanggal mewakili informasi waktu
Semua komputer di dunia menggunakan bilangan bulat tipe panjang, dan nilai bilangan bulat ini adalah jumlah milidetik relatif terhadap GMT di Inggris (0: 0: 00, 1 Januari 1970). Misalnya:
public static void main (string [] args) {// 1 Januari 1970 00:00:00 GMT. Tanggal Tanggal = Tanggal Baru (1000); System.out.println (tanggal);}Hasil output:
// 1970-1-1 8: 00: 01thu 01 Jan 08:00:01 CST 1970
Banyak orang mungkin bertanya -tanya, 1000 berarti 1 detik sebelum waktu standar, jadi mengapa waktu berlalu delapan jam lagi?
Ini ada hubungannya dengan "zona waktu". Jika Anda berada di Greenwich, hasilnya akan seperti yang diharapkan, tetapi kami berlokasi di Distrik Kedelapan Timur Cina, dan waktunya delapan jam sebelumnya, sehingga nilai -nilai dasar berdasarkan zona waktu yang berbeda berbeda.
Kelas tanggal telah benar -benar memainkan banyak peran sebelumnya. Dapat dilihat dari kode sumbernya bahwa ada metode yang dapat mengoperasikan waktu, metode yang dapat beroperasi tahun, bulan dan hari, dan bahkan mengelola zona waktu. Dapat dikatakan bahwa sudah cukup untuk memilikinya pada operasi dan waktu terkait saja.
Tapi ini dunia. Jika Anda terlalu peduli, Anda secara alami tidak akan dapat mencakup semuanya. Desain banyak metode dalam tanggal tidak terlalu masuk akal. Kami juga telah mengatakannya sebelumnya, dan itu bahkan agak anti-manusia. Oleh karena itu, hampir 80% dari metode dalam kelas tanggal saat ini telah ditinggalkan dan ditandai @Deprecated.
Posisi Sun Company saat ini untuk tanggal adalah untuk mewakili momen saja, sehingga posisi internalnya harus berputar di sekitar milidetik bilangan bulat itu, dan tidak lagi fokus pada berbagai zona waktu kalender tahunan dan informasi lainnya.
Tanggal memungkinkan suatu objek dipakai melalui dua konstruktor:
Private Transient Long Fasttime; Tanggal Publik () {this (System.CurrentTimeMillis ());} Tanggal Publik (Tanggal Panjang) {Fasttime = Date;}Atribut Fasttime di sini menyimpan jumlah milidetik yang sesuai dengan waktu. Kedua konstruktor masih sangat sederhana. Jika konstruktor tanpa parameter dipanggil, mesin virtual akan menetapkan fasttime dengan nilai waktu saat ini dari sistem.
Ada beberapa metode lain yang belum dibuang:
Ada dua metode lain yang baru ditambahkan ke JDK1.8 setelah itu, dan digunakan untuk mengonversi antarmuka baru ke Java 8, yang akan diperkenalkan nanti.
Kalender yang menggambarkan almanak
Kalender digunakan untuk mewakili informasi tanggal seperti tahun, bulan, hari, dll. Ini adalah kelas abstrak, sehingga objek instannya umumnya diperoleh melalui empat metode pabrik berikut.
Kalender Statis Publik GetInstance () Kalender Statis Publik GetInstance (TimeZone Zone) Kalender Statis Publik GetInstance (Lokal Alocale) Kalender statis Publik GetInstance (TimeZone Zone, Locale Alocale)
Faktanya, metode internal yang sama pada akhirnya akan disebut:
Kalender Privat Kalender CreateCalendar (zona waktu, lokal Alocale)
Metode ini membutuhkan dua parameter, satu adalah zona waktu dan yang lainnya adalah negara dan bahasa. Dengan kata lain, membangun instance kalender membutuhkan setidaknya dua informasi parameter ini, jika tidak, zona waktu default sistem atau informasi bahasa akan digunakan.
Karena zona waktu dan bahasa nasional yang berbeda menghasilkan informasi yang berbeda untuk informasi waktu dan tahun, bulan dan hari, ini juga menjadi alasan mengapa instance kalender harus dilewati di zona waktu dan informasi negara. Lihat contoh:
public static void main (string [] args) {calendar calendar = calendar.getInstance (); System.out.println (calendar.getTime ()); Kalender kalender1 = calendar.getInstance (timezone.gettimezone ("GMT"), locale.English); System.out.println (calendar1.get (calendar.year) + ":" + calendar1.get (calendar.hour) + ":" + calendar1.get (calendar.minute)); }Hasil output:
SAT 21 Apr 10:32:20 CST 20182018: 2: 32
Seperti yang Anda lihat, output pertama adalah waktu saat ini dari zona waktu default sistem kami dan negara, dan contoh kalender kedua kami menentukan bahwa itu terletak di zona waktu Greenwich (zona waktu 0), dan hasilnya juga jelas, dengan perbedaan delapan jam, karena kami terletak di kedelapan timur, yang delapan jam lebih awal dari zona 0 waktu.
Beberapa orang mungkin bertanya -tanya mengapa output dari instance kalender kedua sangat rumit untuk disambungkan, daripada menyebut metode gettime secara langsung ringkas seperti instance kalender pertama?
Ini melibatkan implementasi internal kalender, mari kita lihat bersama:
Dilindungi Waktu Lama; GetTime Tanggal Akhir Publik () {Kembali Tanggal Baru (GetTimeInmillis ());}Seperti tanggal, Calendar mempertahankan informasi waktu di dalam, dan metode GetTime sebenarnya membangun objek tanggal berdasarkan waktu ini dan kembali.
Secara umum, ketika kami membangun instance kalender, kami tidak akan melewati informasi waktu, jadi ketika instance diinisialisasi, program akan menghitung nomor milidetik berdasarkan zona waktu default sistem dan waktu saat ini dan menetapkannya ke waktu.
Oleh karena itu, di dalam semua instance kalender yang nilai atributnya belum dimodifikasi secara manual, nilai waktu adalah nilai waktu dari zona waktu default pada waktu itu. Dengan kata lain, hasil output dari GetTime mengabaikan informasi zona waktu yang sesuai dengan instance saat ini. Ini juga merupakan cacat dalam desain kalender, karena ini akan menyebabkan nilai output gettime dari dua instance kalender hanya bergantung pada waktu berjalan sistem ketika instance diinisialisasi.
Kalender juga mendefinisikan banyak konstanta statis dan beberapa array atribut:
Publik final statis int era = 0; tahun int statis final publik = 1; bulan int statis final publik = 2; public final static int week_of_year = 3; public final static int week_of_month = 4; Tanggal int statis final publik = 5; .... bidang int yang dilindungi []; BOOLEAN ISSET yang dilindungi []; ... ...
Semua informasi yang relevan tentang tanggal disimpan dalam array atribut, dan nilai -nilai konstanta statis ini sering mewakili nilai indeks. Melalui metode GET, kami melewati indeks atribut dan mengembalikan nilai atribut. Misalnya:
Kalender mycalendar = calendar.getInstance (); int tahun = mycalendar.get (calendar.year);
Metode GET di sini sebenarnya untuk secara langsung mengambil bidang [1] sebagai nilai pengembalian. Array atribut bidang dihitung dan ditugaskan oleh sistem sesuai dengan zona waktu dan bahasa ketika instance kalender diinisialisasi. Perhatikan bahwa itu akan dihitung berdasarkan zona waktu yang Anda tentukan, tidak seperti waktu, yang selalu didasarkan pada zona waktu default sistem.
Saya pribadi berpikir bahwa desain kalender memiliki aspek yang elegan dan tidak masuk akal. Bagaimanapun, ini adalah "antik" dan pada akhirnya akan diganti.
Konversi Format DateFormat
Seperti yang dapat kita lihat dari salah satu contoh kami sebelumnya, sangat merepotkan informasi tanggal output dalam format yang diharapkan untuk kalender dan perlu disambungkan secara manual. Tanggal kami digunakan untuk menangani konversi antara string yang diformat dan datetimes.
Seperti kalender, DateFormat juga merupakan kelas abstrak. Kita perlu menghasilkan objek instannya melalui metode pabrik. Terutama ada metode pabrik berikut:
// Hanya Proses Konversi Waktu Publik Final Tanggal Statis GetTimeInstance () // Hanya Tanggal Proses Konversi Publik Final Tanggal Statis GetDateInstance () // Anda dapat menangani waktu dan tanggal final final public static getDateTimeInstance ()
Tentu saja, mereka masing -masing memiliki metode kelebihan beban sendiri, dan kami akan melihat detailnya nanti.
Ada dua jenis metode untuk format tanggal, format dan parse.
Format String Akhir Publik (Tanggal Tanggal) Parse Tanggal Publik (Sumber String)
Metode format digunakan untuk memformat objek tanggal sebagai string, dan metode parse digunakan untuk mengganti string yang diformat dengan objek tanggal. Misalnya:
public static void main (string [] args) {calendar calendar = calendar.getInstance (); DateFormat dateFormat = dateFormat.getDateTimeInstance (); System.out.println (dateFormat.format (calendar.gettime ()));}Hasil output:
2018-4-21 16:58:09
Jelas, contoh tanggal yang dibangun oleh pabrik tidak dapat menyesuaikan konten pemformatan output, yaitu, format string output diperbaiki dan tidak dapat memenuhi kebutuhan khusus dalam beberapa kasus. Secara umum, kami akan secara langsung menggunakan salah satu kelas implementasinya, SimpleDateFormat.
SimpleDateFormat memungkinkan Anda untuk melewati parameter pola saat membuat instance untuk menyesuaikan format output karakter tanggal. Misalnya:
public static void main (string [] args) {dateFormat dateFormat = new SimpleDateFormat ("yyyyy tahun mm bulan dd day"); System.out.println (dateFormat.format (new date ()));}Hasil output:
21 April 2018
di dalam,
Tentu saja, juga sangat nyaman untuk mengonversi tanggal string. Mode yang disesuaikan diizinkan, tetapi Anda harus mematuhi pola yang Anda tetapkan sendiri, jika tidak program tidak akan berhasil menguraikan. Misalnya:
public static void main (string [] args) {string str = "Sabtu, 21 April 2018"; DateFormat sdateFormat = new SimpleDateFormat ("yyyy tahun m bulan dd hari hh point mm point e"); sdateFormat.parse (str); System.out.println (sdateFormat.getCalendar (). GetTime ());}Hasil output:
SAT 21 Apr 17:17:00 CST 2018
Jelas, program ini dengan benar mem -parsing string kami dan mengubahnya menjadi objek kalender yang disimpan di dalam DateFormat.
Secara umum, Tanggal, Kalender dan Tanggal telah mampu menangani masalah waktu dan tanggal umum, tetapi tidak dapat dihindari, mereka masih rumit dan sulit digunakan.
Karena keterbatasan ruang, kami akan membandingkan API tanggal dan waktu baru Java 8 di artikel berikutnya, dan Anda akan menemukan bahwa ia memiliki desain yang lebih elegan dan operasi sederhana.