JavaRush /Java Blog /Random-ID /Pustaka yang intuitif dan tangguh untuk bekerja dengan wa...
theGrass
Level 24
Саратов

Pustaka yang intuitif dan tangguh untuk bekerja dengan waktu dan tanggal akhirnya tersedia di Java (Bagian 2).

Dipublikasikan di grup Random-ID
Waktu dalam Sehari
    Jadi mari kita lanjutkan. Entitas berikutnya setelah tanggal adalah waktu, yang diwakili oleh kelas LocalTime . Contoh klasiknya adalah mewakili jam buka sebuah toko, misalnya dari pukul 7:00 hingga 23:00. Toko buka pada waktu ini di seluruh negeri, namun waktu sebenarnya akan bervariasi tergantung pada zona waktu.     LocalTime adalah kelas nilai yang hanya menyimpan waktu, tanpa tanggal atau zona waktu terkait. Saat menambah atau mengurangi jangka waktu, itu akan terpotong pada tengah malam. Artinya, 20:00 ditambah 6 jam adalah 2:00. Penggunaan LocalTime mirip dengan LocalDate : LocalTime time = LocalTime.of(20, 30); int hour = date.getHour(); // 20 int minute = date.getMinute(); // 30 time = time.withSecond(6); // 20:30:06 time = time.plusMinutes(3); // 20:33:06     Pengubah dapat bekerja dengan LocalTime , tetapi operasi waktu biasanya tidak terlalu rumit sehingga diperlukan pengubah.
Menggabungkan tanggal dan waktu
    Kelas selanjutnya yang akan kita lihat adalah LocalDateTime . Kelas nilai ini merupakan kombinasi dari LocalDate dan LocalTime . Ini mewakili tanggal dan waktu, tanpa zona waktu.      LocalDateTime dapat dibuat baik secara langsung atau dengan menggabungkan tanggal dan waktu: LocalDateTime dt1 = LocalDateTime.of(2014, Month.JUNE, 10, 20, 30); LocalDateTime dt2 = LocalDateTime.of(date, time); LocalDateTime dt3 = date.atTime(20, 30); LocalDateTime dt4 = date.atTime(time);     Opsi ketiga dan keempat menggunakan metode atTime() , yang menyediakan cara fleksibel untuk menggabungkan tanggal dan waktu. Kebanyakan kelas sistem tanggal dan waktu memiliki metode "at" yang dapat digunakan saat menggabungkan objek Anda dengan objek lain untuk membuat objek yang lebih kompleks. Metode lain dari kelas LocalDateTime mirip dengan LocalDate dan LocalTime . Pola penamaan metode serupa membuat API lebih mudah dipelajari . Tabel ini mencantumkan semua prefiks metode yang terlibat: Pustaka yang intuitif dan tangguh untuk bekerja dengan waktu dan tanggal akhirnya tersedia di Java (Bagian 2).  - 1
Instan
    Ketika kita berurusan dengan tanggal dan waktu, kita biasanya bekerja dengan tahun, bulan, hari, jam, menit, detik. Namun, ini hanyalah salah satu model waktu yang bisa disebut “manusia”. Model kedua yang umum digunakan adalah waktu “mesin” atau “kontinu”. Dalam model ini, suatu titik pada sumbu waktu diwakili oleh satu bilangan besar. Pendekatan ini menyederhanakan algoritma perhitungan, dan digunakan untuk menyimpan waktu dalam sistem operasi Unix , dimana waktu diwakili oleh jumlah detik yang telah berlalu sejak 1 Januari 1970. Demikian pula di Java , waktu disimpan sebagai jumlah milidetik yang telah berlalu sejak 1 Januari 1970. Pendekatan mesin terhadap perhitungan waktu di java.time API disediakan oleh kelas nilai Instan . Ini memberikan kemampuan untuk mewakili suatu titik pada sumbu waktu tanpa semua informasi yang menyertainya, seperti zona waktu. Faktanya, kelas ini berisi jumlah nanodetik yang telah berlalu sejak tengah malam pada tanggal 1 Januari 1970. Instant start = Instant.now(); // произведем вычисления Instant end = Instant.now(); assert end.isAfter(start); //машина времени не сработала     Biasanya kelas Instan digunakan untuk menyimpan dan membandingkan titik waktu ketika Anda perlu menyimpan kapan suatu peristiwa terjadi tetapi Anda tidak peduli dengan zona waktu terjadinya peristiwa tersebut. Dalam kebanyakan kasus, lebih menarik apa yang tidak bisa kita lakukan dengan kelas Instan daripada apa yang bisa kita lakukan dengannya. Misalnya, baris kode berikut akan memunculkan pengecualian: instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     Pengecualian terjadi karena objek instan hanya menyimpan jumlah nanodetik dan tidak memberikan kemampuan untuk bekerja dengan satuan waktu yang lebih berguna bagi manusia. Untuk menggunakan satuan pengukuran lain, Anda setidaknya harus menentukan zona waktu.
Zona waktu
    Prinsip zona waktu dikembangkan di Inggris ketika penemuan rel kereta api dan perbaikan sarana komunikasi lainnya memungkinkan orang melakukan perjalanan dalam jarak yang cukup agar perbedaan waktu matahari dapat terlihat. Hingga saat ini, setiap desa dan kota hidup menurut waktunya masing-masing, yang paling sering diukur dengan jam matahari. Gambar ini menunjukkan contoh kesulitan yang diakibatkannya - jarum jam berwarna merah menunjukkan waktu Greenwich, dan jarum hitam menunjukkan waktu setempat, yang berbeda 10 menit: Sistem zona waktu dikembangkan, menggantikan waktu matahari setempat Pustaka yang intuitif dan tangguh untuk bekerja dengan waktu dan tanggal akhirnya tersedia di Java (Bagian 2).  - 2     . Namun fakta utamanya adalah zona waktu diciptakan oleh politisi, dan sering kali digunakan untuk menunjukkan kendali politik atas suatu wilayah. Seperti halnya kebijakan apa pun, aturan terkait zona waktu sering kali tidak masuk akal. Dan juga, peraturan ini dapat berubah, dan sering kali berubah, tanpa peringatan apa pun. Aturan zona waktu disusun oleh kelompok internasional yang menerbitkan Database Zona Waktu IANA . Ini berisi pengidentifikasi setiap wilayah di Bumi, dan sejarah perubahan zona waktu untuknya. Pengidentifikasinya terlihat seperti “Eropa/London” atau “Amerika/New_York” . Sebelum java.time API dirilis, kelas TimeZone digunakan untuk mewakili zona waktu . Sekarang ZoneId digunakan sebagai gantinya . Ada dua perbedaan utama di antara keduanya. Pertama, ZoneId tidak dapat diubah, yang memungkinkan untuk menyimpan objek kelas ini dalam variabel statis, antara lain. Kedua, aturan itu sendiri disimpan di kelas ZoneRules , dan bukan di ZoneId itu sendiri , dan untuk mendapatkannya, Anda perlu memanggil metode getRules() pada objek kelas ZoneId . Fitur umum dari semua zona waktu adalah offset tetap dari UTC/Greenwich . Paling sering Anda menggunakan ini ketika berbicara tentang perbedaan waktu antara kota-kota yang berbeda, seperti "New York 5 jam lebih lambat dari London." Kelas ZoneOffset , turunan dari ZoneId , mewakili perbedaan waktu dengan meridian utama yang melewati Greenwich di London. Dari sudut pandang pengembang, akan lebih baik jika tidak harus berurusan dengan zona waktu dan kompleksitasnya. Java.time API memungkinkan Anda melakukan ini selama memungkinkan. Jika memungkinkan, gunakan kelas LocalDate, LocalTime, LocalDateTime dan Instant . Jika Anda tidak dapat melakukannya tanpa zona waktu, gunakan kelas ZonedDateTime . Kelas ZonedDateTimememungkinkan Anda mengonversi tanggal dan waktu dari satuan pengukuran manusia, yang kita lihat di kalender dan jam tangan, menjadi satuan mesin. Hasilnya, Anda dapat membuat ZonedTimeDate baik dari kelas Lokal atau dari kelas Instan : ZoneId zone = ZoneId.of("Europe/Paris"); LocalDate date = LocalDate.of(2014, Month.JUNE, 10); ZonedDateTime zdt1 = date.atStartOfDay(zone); Instant instant = Instant.now(); ZonedDateTime zdt2 = instant.atZone(zone);     Salah satu fitur zona waktu yang paling tidak menyenangkan adalah apa yang disebut waktu musim panas. Dengan peralihan Waktu Musim Panas ke dan dari Greenwich, perbedaan zona waktu Anda dengan Greenwich berubah dua kali (atau lebih) dalam setahun, biasanya meningkat pada musim semi dan menurun pada musim gugur. Jika ini terjadi, kita harus mengganti semua jam di rumah kita. Di kelas java.time , data offset direpresentasikan sebagai "transformasi offset" . Pada musim semi hal ini menyebabkan “celah” waktu, ketika beberapa nilai waktu tidak mungkin terjadi, dan pada musim gugur, sebaliknya, beberapa nilai waktu muncul dua kali. Semua ini didukung oleh kelas ZonedDateTime melalui metode pabrik dan metode konverternya. Misalnya, menambahkan satu hari akan menambahkan hari logis, yang dapat diwakili oleh lebih atau kurang dari 24 jam jika kita beralih ke waktu musim panas atau sebaliknya. Demikian pula, metode atStartOfDay() dinamai demikian karena kami tidak dapat menjamin bahwa hari akan dimulai tepat pada tengah malam - kami harus memperhitungkan kesenjangan waktu saat beralih ke musim panas. Dan satu tip terakhir mengenai waktu musim panas. Jika Anda ingin menunjukkan bahwa Anda telah memperhitungkan tumpang tindih waktu selama transisi dari musim panas ke musim dingin (ketika nilai waktu yang sama muncul dua kali), Anda dapat menggunakan salah satu dari dua metode khusus yang dirancang untuk situasi seperti ini: Metode ini akan mengembalikan nilai waktu yang lebih awal atau lebih lambat. zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();     value , jika objek terjebak dalam tumpang tindih selama transisi dari musim panas ke musim dingin. Dalam semua situasi lainnya, nilai yang dikembalikan akan sama.
Interval waktu
    Semua kelas yang kita diskusikan sebelumnya berfungsi sebagai titik pada timeline. Dua kelas nilai tambahan diperlukan untuk mewakili interval waktu. Kelas Durasi mewakili jangka waktu, diukur dalam detik dan nanodetik. Misalnya, “23,6 detik”. Kelas Periode mewakili periode waktu yang diukur dalam tahun, bulan, dan hari. Misalnya - “3 tahun, 2 bulan dan 6 hari.” Interval berikut dapat ditambahkan atau dikurangi dari tanggal atau waktu: Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
Memformat dan menguraikan
    Seluruh paket dirancang untuk memformat dan menampilkan tanggal dan waktu - java.time.format . Paket ini berkisar pada kelas DateTimeFormatter dan pabrik DateTimeFormatterBuildernya . Cara paling umum untuk membuat formatter adalah melalui metode statis dan konstanta di DateTimeFormatter , termasuk:
  • Konstanta untuk format umum yang dijelaskan dalam ISO, seperti ISO_LOCAL_DATE.
  • Pola diidentifikasi dengan huruf, seperti ofPattern("dd/MM/uuuu").
  • Gaya yang dilokalkan seperti ofLocalizedDate(FormatStyle.MEDIUM).
    Setelah Anda membuat formatter, Anda biasanya menggunakannya dengan meneruskannya ke metode kelas tanggal yang sesuai: DateTimeFormatter f = DateTimeFormatter.ofPattern("dd/MM/uuuu"); LocalDate date = LocalDate.parse("24/06/2014", f); String str = date.format(f);     Dengan cara ini, kode yang bertanggung jawab untuk memformat keluaran tanggal diisolasi ke dalam kelas terpisah. Jika Anda perlu menentukan lokal secara terpisah untuk pemformatan tanggal, gunakan metode pemformat withLocale(Locale) . Kelas yang bertanggung jawab atas kalender, zona waktu, dan input/output bilangan pecahan memiliki metode serupa. Jika Anda memerlukan opsi penyesuaian lainnya, lihat dokumentasi untuk kelas DateTimeFormatterBuilder , yang memungkinkan Anda membuat pemformat kompleks langkah demi langkah. Ini juga memungkinkan Anda menyetel penguraian teks yang tidak peka huruf besar-kecil, mengabaikan beberapa kesalahan penguraian, menyetel offset, dan elemen opsional.
Intinya
     Java.time API adalah model komprehensif baru untuk bekerja dengan tanggal dan waktu di Java SE 8 . Dibutuhkan ide dan implementasi dari Joda-Time ke tingkat berikutnya dan akhirnya memungkinkan pengembang untuk menghindari penggunaan java.util.Date dan Calendar . Sekarang bekerja dengan tanggal dan waktu bisa menjadi hal yang menyenangkan!      Artikel asli
Komentar
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION