JavaRush /Blog Java /Random-MS /Perpustakaan yang intuitif dan mantap untuk bekerja denga...
theGrass
Tahap
Саратов

Perpustakaan yang intuitif dan mantap untuk bekerja dengan masa dan tarikh akhirnya tersedia di Java (Bahagian 2).

Diterbitkan dalam kumpulan
Masa dalam Hari
    Jadi mari kita teruskan. Entiti seterusnya selepas tarikh ialah masa hari, diwakili oleh kelas LocalTime . Contoh klasik ialah mewakili waktu buka kedai, katakan dari 7:00 hingga 23:00. Kedai dibuka pada masa ini di seluruh negara, tetapi masa sebenar akan berbeza-beza bergantung pada zon waktu.     LocalTime ialah kelas nilai yang menyimpan masa sahaja, tanpa tarikh atau zon masa yang berkaitan. Apabila menambah atau menolak tempoh masa, ia akan dipotong pada tengah malam. Iaitu, 20:00 ditambah 6 jam ialah 2:00. Menggunakan LocalTime adalah serupa 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 suai boleh berfungsi dengan LocalTime , tetapi operasi masa biasanya tidak begitu rumit sehingga pengubahsuai diperlukan.
Menggabungkan tarikh dan masa
    Kelas seterusnya yang akan kita lihat ialah LocalDateTime . Kelas nilai ini ialah gabungan LocalDate dan LocalTime . Ia mewakili kedua-dua tarikh dan masa, tanpa zon waktu.      LocalDateTime boleh dibuat sama ada secara langsung atau dengan menggabungkan tarikh dan masa: 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);     Pilihan ketiga dan keempat menggunakan kaedah atTime() , yang menyediakan cara yang fleksibel untuk menggabungkan tarikh dan masa. Kebanyakan kelas sistem tarikh dan masa mempunyai kaedah "pada" yang boleh digunakan apabila menggabungkan objek anda dengan yang lain untuk mencipta yang lebih kompleks. Kaedah lain bagi kelas LocalDateTime adalah serupa dengan kaedah LocalDate dan LocalTime . Corak penamaan kaedah yang serupa menjadikan API lebih mudah dipelajari . Jadual ini menyenaraikan semua awalan kaedah yang terlibat: Perpustakaan yang intuitif dan mantap untuk bekerja dengan masa dan tarikh akhirnya tersedia di Java (Bahagian 2).  - 1
segera
    Apabila kita berurusan dengan tarikh dan masa, kita biasanya bekerja dengan tahun, bulan, hari, jam, minit, saat. Walau bagaimanapun, ini hanya satu model masa yang boleh dipanggil "manusia". Model kedua yang biasa digunakan ialah masa "mesin" atau "berterusan". Dalam model ini, satu titik pada paksi masa diwakili oleh satu nombor besar. Pendekatan ini memudahkan algoritma pengiraan, dan digunakan untuk menyimpan masa dalam sistem pengendalian Unix , di mana masa diwakili oleh bilangan saat yang telah berlalu sejak 1 Januari 1970. Begitu juga, di Jawa , masa disimpan sebagai bilangan milisaat yang telah berlalu sejak 1 Januari 1970. Pendekatan mesin kepada pengiraan masa dalam API java.time disediakan oleh kelas nilai Segera . Ia menyediakan keupayaan untuk mewakili titik pada paksi masa tanpa semua maklumat yang disertakan, seperti zon waktu. Malah, kelas ini mengandungi bilangan nanosaat yang telah berlalu sejak tengah malam pada 1 Januari 1970. Instant start = Instant.now(); // произведем вычисления Instant end = Instant.now(); assert end.isAfter(start); //машина времени не сработала     Biasanya kelas Segera digunakan untuk menyimpan dan membandingkan titik dalam masa apabila anda perlu menyimpan apabila beberapa peristiwa berlaku tetapi anda tidak mengambil berat tentang zon waktu di mana ia berlaku. Dalam kebanyakan kes, perkara yang tidak boleh kita lakukan dengan kelas Segera adalah lebih menarik daripada perkara yang boleh kita lakukan dengannya. Sebagai contoh, baris kod berikut akan membuang pengecualian: instant.get(ChronoField.MONTH_OF_YEAR); instant.plus(6, ChronoUnit.YEARS);     Pengecualian berlaku kerana objek segera hanya menyimpan bilangan nanosaat dan tidak memberikan keupayaan untuk bekerja dengan unit masa yang lebih berguna kepada manusia. Untuk menggunakan unit ukuran lain, anda mesti sekurang-kurangnya menentukan zon waktu.
Zon Waktu
    Prinsip zon waktu telah dibangunkan di England apabila penciptaan jalan kereta api dan penambahbaikan dalam cara komunikasi lain membolehkan orang ramai menempuh jarak yang mencukupi untuk perbezaan dalam masa suria menjadi ketara. Sehingga masa ini, setiap kampung dan bandar hidup mengikut masanya sendiri, yang paling kerap diukur dengan jam matahari. Gambar ini menunjukkan contoh kesukaran yang menyebabkannya - jarum merah pada jam menunjukkan waktu Greenwich, dan tangan hitam menunjukkan waktu tempatan, yang berbeza sebanyak 10 minit: Sistem zon waktu dibangunkan, menggantikan waktu solar tempatan Perpustakaan yang intuitif dan mantap untuk bekerja dengan masa dan tarikh akhirnya tersedia di Java (Bahagian 2).  - 2     . Tetapi fakta utama ialah zon waktu dicipta oleh ahli politik, dan sering digunakan untuk menunjukkan kawalan politik ke atas sesuatu kawasan. Seperti mana-mana dasar, peraturan yang berkaitan dengan zon waktu sering menentang logik. Dan juga, peraturan ini boleh berubah, dan sering berubah, tanpa sebarang amaran. Peraturan zon waktu disusun oleh kumpulan antarabangsa yang menerbitkan Pangkalan Data Zon Waktu IANA . Ia mengandungi pengecam setiap kawasan Bumi, dan sejarah zon waktu berubah untuknya. Pengecam kelihatan seperti "Eropah/London" atau "Amerika/New_York" . Sebelum java.time API dikeluarkan, kelas TimeZone telah digunakan untuk mewakili zon waktu . Kini ZoneId digunakan sebaliknya . Terdapat dua perbezaan utama antara mereka. Pertama, ZoneId tidak boleh diubah, yang memungkinkan untuk menyimpan objek kelas ini dalam pembolehubah statik, antara lain. Kedua, peraturan itu sendiri disimpan dalam kelas ZoneRules , dan bukan dalam ZoneId itu sendiri , dan untuk mendapatkannya, anda perlu memanggil kaedah getRules() pada objek kelas ZoneId . Ciri biasa semua zon waktu ialah ofset tetap daripada UTC/Greenwich . Selalunya anda menggunakan ini apabila bercakap tentang perbezaan masa antara bandar yang berbeza, seperti "New York adalah 5 jam di belakang London." Kelas ZoneOffset , keturunan ZoneId , mewakili perbezaan masa dengan meridian utama yang melalui Greenwich di London. Dari sudut pandangan pembangun, adalah bagus untuk tidak berurusan dengan zon waktu dan kerumitannya. API java.time membolehkan anda melakukan ini selagi boleh. Jika boleh, gunakan kelas LocalDate, LocalTime, LocalDateTime dan Instant . Di mana anda tidak boleh melakukannya tanpa zon waktu, gunakan kelas ZonedDateTime . Kelas ZonedDateTimemembolehkan anda menukar tarikh dan masa daripada unit ukuran manusia, yang kita lihat pada kalendar dan jam tangan, kepada unit mesin. Akibatnya, anda boleh mencipta ZonedTimeDate sama ada daripada kelas Tempatan atau daripada kelas Segera : 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 ciri zon waktu yang paling tidak menyenangkan ialah apa yang dipanggil waktu penjimatan siang. Dengan Waktu Penjimatan Siang bertukar ke dan dari Greenwich, perbezaan zon waktu anda dengan Greenwich berubah dua kali (atau lebih) setahun, biasanya meningkat pada musim bunga dan berkurangan pada musim luruh. Apabila ini berlaku, kita perlu menukar semua jam di rumah kita. Dalam kelas java.time , data mengimbangi diwakili sebagai "transformasi mengimbangi" . Pada musim bunga ini menyebabkan "jurang" dalam masa, apabila beberapa nilai masa adalah mustahil, dan pada musim gugur, sebaliknya, beberapa nilai masa berlaku dua kali. Semua ini disokong oleh kelas ZonedDateTime melalui kaedah kilang dan kaedah penukarnya. Sebagai contoh, menambah satu hari menambah hari yang logik, yang boleh diwakili lebih atau kurang daripada 24 jam jika kita beralih kepada masa penjimatan siang atau balik. Begitu juga, kaedah atStartOfDay() dinamakan demikian kerana kami tidak dapat menjamin bahawa hari itu akan bermula tepat pada tengah malam - kami mesti mengambil kira jurang masa apabila bertukar kepada penjimatan siang. Dan satu petua terakhir mengenai masa penjimatan siang hari. Jika anda ingin menunjukkan bahawa anda telah mengambil kira pertindihan masa semasa peralihan dari musim panas ke musim sejuk (apabila nilai masa yang sama muncul dua kali), anda boleh menggunakan salah satu daripada dua kaedah khas yang direka untuk situasi sedemikian: Kaedah ini akan mengembalikan yang lebih awal atau kemudian. zdt = zdt.withEarlierOffsetAtOverlap(); zdt = zdt.withLaterOffsetAtOverlap();     value , jika objek terperangkap dalam pertindihan semasa peralihan dari musim panas ke musim sejuk. Dalam semua situasi lain, nilai pulangan akan sama.
Selang masa
    Semua kelas yang kami bincangkan sebelum ini berfungsi sebagai titik pada garis masa. Dua kelas nilai tambahan diperlukan untuk mewakili selang masa. Kelas Tempoh mewakili tempoh masa, diukur dalam saat dan nanosaat. Contohnya, "23.6 saat." Kelas Tempoh mewakili tempoh masa yang diukur dalam tahun, bulan dan hari. Contohnya - "3 tahun, 2 bulan dan 6 hari." Selang ini boleh ditambah atau ditolak daripada tarikh atau masa: Period sixMonths = Period.ofMonths(6); LocalDate date = LocalDate.now(); LocalDate future = date.plus(sixMonths);
Memformat dan menghuraikan
    Keseluruhan pakej direka bentuk untuk memformat dan memaparkan tarikh dan masa - java.time.format . Pakej ini berkisar pada kelas DateTimeFormatter dan kilang DateTimeFormatterBuildernya . Cara paling biasa untuk mencipta pemformat adalah melalui kaedah statik dan pemalar dalam DateTimeFormatter , termasuk:
  • Pemalar untuk format biasa yang diterangkan dalam ISO, seperti ISO_LOCAL_DATE.
  • Corak yang dikenal pasti melalui huruf, seperti ofPattern("dd/MM/uuuu").
  • Gaya setempat seperti ofLocalizedDate(FormatStyle.MEDIUM).
    Sebaik sahaja anda telah mencipta pemformat, anda biasanya menggunakannya dengan menghantarnya kepada kaedah kelas tarikh 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, kod yang bertanggungjawab untuk memformat output tarikh diasingkan ke dalam kelas yang berasingan. Jika anda perlu menentukan tempat secara berasingan untuk pemformatan tarikh, gunakan kaedah pemformat denganLocale(Locale) . Kelas yang bertanggungjawab untuk kalendar, zon waktu dan input/output nombor pecahan mempunyai kaedah yang serupa. Jika anda memerlukan lebih banyak pilihan penalaan halus, lihat dokumentasi untuk kelas DateTimeFormatterBuilder , yang membolehkan anda membuat pemformat kompleks langkah demi langkah. Ia juga membolehkan anda menetapkan penghuraian teks tidak sensitif huruf besar-besaran, mengabaikan beberapa ralat penghuraian, set offset dan elemen pilihan.
Pokoknya
     API java.time ialah model komprehensif baharu untuk bekerja dengan tarikh dan masa dalam Java SE 8 . Ia membawa idea dan pelaksanaan daripada Joda-Time ke peringkat seterusnya dan akhirnya membolehkan pembangun mengelak daripada menggunakan java.util.Date dan Kalendar . Sekarang bekerja dengan tarikh dan masa boleh menjadi menyeronokkan!      Artikel asal
Komen
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION