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:
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
. 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!
GO TO FULL VERSION