Cara menggunakan Java8 Time API
1. Gambaran Keseluruhan
Sebagai sebahagian daripada artikel ini, mari kita mulakan dengan beberapa masalah dengan API Tarikh dan Kalendar sedia ada dan meneroka cara API Tarikh dan Masa Java 8 yang baharu menyelesaikan masalah ini.
Kami juga akan melihat kelas teras dalam perpustakaan kelas masa Java 8, seperti LocalDate, LocalTime, LocalDateTime, ZonedDateTime, Tempoh, Tempoh dan API mereka.
2. Masalah dengan API lama (sebelum java8)
Keselamatan thread - Kelas Tarikh dan Kalendar tidak selamat untuk thread, menyukarkan pembangun untuk nyahpepijat Isu Concurrency API ini memerlukan penulisan kod tambahan untuk mengendalikan keselamatan benang. API Tarikh dan Masa baharu yang diperkenalkan dalam Java 8 adalah tidak berubah dan selamat untuk benang, membolehkan titik kesakitan ini diselesaikan.
Reka bentuk API dan mudah difahami - API zaman dahulu sangat sukar difahami, operasinya sangat kompleks, sangat berbelit-belit dan tidak menyediakan beberapa kaedah penghuraian dan penukaran yang biasa digunakan. API masa baharu adalah berteraskan ISO dan mengikut model domain yang konsisten untuk tarikh, masa, tempoh dan tempoh. Beberapa kaedah yang sangat berguna disediakan untuk menyokong operasi yang paling biasa. Kami tidak perlu lagi merangkum beberapa kelas operasi masa sendiri.
ZonedDate and Time - Pada masa dahulu pembangun api terpaksa menulis logik tambahan untuk mengendalikan logik zon masa API lama, manakala dengan API baharu, anda boleh menggunakan Local dan ZonedDate / API Masa untuk mengendalikan zon waktu. Tidak perlu terlalu risau tentang penukaran zon waktu.
3. Menggunakan LocalDate, LocalTime dan LocalDateTime
Kelas yang paling biasa digunakan ialah LocalDate, LocalTime dan LocalDateTime. Seperti namanya, mereka mewakili tarikh/masa setempat digabungkan dengan konteks.
Kelas ini digunakan terutamanya apabila zon waktu tidak perlu dinyatakan secara eksplisit dalam konteks. Sebagai sebahagian daripada bahagian ini, kami akan merangkumi API yang paling biasa digunakan.
3.1. Gunakan LocalDate
LocalDate mewakili tarikh tanpa masa tertentu dalam format ISO (YYYY-MM-DD).
selalunya digunakan untuk menyatakan hari lahir atau tarikh gaji yang paling kita minati.
Dapatkan tarikh di bawah jam sistem semasa seperti berikut:
LocalDate localDate = LocalDate.now();
Tarikh Tempatan yang mewakili hari, bulan dan tahun tertentu boleh menggunakan kaedah atau penggunaan " of " parse " kaedah untuk mendapatkan. Sebagai contoh, coretan kod berikut mewakili LocalDate 20 Februari 2015:
LocalDate.of(2015, 02, 20); LocalDate.parse("2015-02-20");
Bukankah ia sangat intuitif dan mudah! LocalDate menyediakan pelbagai kaedah utiliti untuk mendapatkan pelbagai maklumat tarikh. Mari kita lihat dengan pantas kaedah API ini.
Coretan kod berikut mendapat tarikh setempat semasa dan menambah satu hari:
LocalDate tomorrow = LocalDate.now().plusDays(1);
Contoh ini mendapat tarikh semasa dan menolak satu bulan. Perhatikan cara ia menerima enum sebagai unit masa:
LocalDate previousMonthSameDay = LocalDate.now().minus(1, ChronoUnit.MONTHS);
Dalam dua contoh kod berikut, kami menghuraikan tarikh "2016-06-12" dan masing-masing mendapatkan hari dalam minggu dan hari dalam sebulan. Perhatikan nilai pulangan. Yang pertama ialah objek yang mewakili DayOfWeek, dan yang kedua ialah int yang mewakili nilai ordinal bulan:
DayOfWeek sunday = LocalDate.parse("2016-06-12").getDayOfWeek(); int twelve = LocalDate.parse("2016-06-12").getDayOfMonth();
Kami boleh menguji sama ada tarikh berlaku dalam tahun lompat. Jika kita menggunakan kaedah lama Takut masuk syurga:
boolean leapYear = LocalDate.now().isLeapYear();
Menentukan susunan tarikh:
boolean notBefore = LocalDate.parse("2016-06-12").isBefore(LocalDate.parse("2016-06-11")); boolean isAfter = LocalDate.parse("2016-06-12").isAfter(LocalDate.parse("2016-06-11"));
Sempadan tarikh boleh diperolehi dari tarikh yang diberi. Dalam dua contoh berikut, kami mendapat LocalDateTime yang mewakili permulaan hari pada tarikh tertentu (2016-06-12T00:00) dan LocalDate yang mewakili permulaan bulan (2016-06-01):
LocalDateTime beginningOfDay = LocalDate.parse("2016-06-12").atStartOfDay(); LocalDate firstDayOfMonth = LocalDate.parse("2016-06-12") .with(TemporalAdjusters.firstDayOfMonth());
Sekarang Mari kita lihat bagaimana kita menggunakan waktu tempatan.
3.2. Gunakan Masa Setempat
untuk mewakili masa tanpa tarikh dalam waktu tempatan.
Serupa dengan LocalDate, kejadian LocalTime boleh dibuat daripada jam sistem atau menggunakan kaedah "parse" dan "of". Sila lihat sekilas beberapa API yang biasa digunakan di bawah.
Satu contoh LocalTime semasa boleh dibuat daripada jam sistem seperti berikut:
LocalTime now = LocalTime.now();
Dalam contoh kod berikut, kami mencipta perwakilan 06 dengan menghuraikan perwakilan rentetan : LocalTime untuk 30 PG:
LocalTime sixThirty = LocalTime.parse("06:30");
Kaedah "of" boleh digunakan untuk mencipta LocalTime. Sebagai contoh, kod berikut menggunakan kaedah "of" untuk mencipta LocalTime yang mewakili 06:30 AM:
LocalTime sixThirty = LocalTime.of(6, 30);
Contoh berikut mencipta LocalTime dengan menghuraikan rentetan dan menambah satu jam padanya menggunakan "tambah" API. Hasilnya ialah Masa Tempatan yang mewakili 07:30 PG:
LocalTime sevenThirty = LocalTime.parse("06:30").plus(1, ChronoUnit.HOURS);
Pelbagai kaedah getter boleh digunakan untuk mendapatkan unit masa tertentu seperti jam, minit dan saat, dapatkan jam seperti berikut:
int six = LocalTime.parse("06:30").getHour();
Seperti LocalDate, menyemak sama ada masa tertentu adalah sebelum atau selepas masa tertentu yang lain. Contoh kod berikut membandingkan dua LocalTimes yang menghasilkan true:
boolean isbefore = LocalTime.parse("06:30").isBefore(LocalTime.parse("07:30"));
Masa maksimum, minimum dan tengah hari dalam sehari boleh diperoleh melalui pemalar dalam kelas LocalTime. Ini berguna apabila melakukan pertanyaan pangkalan data untuk mencari rekod dalam julat masa tertentu. Contohnya, kod di bawah mewakili 23:59:59.99:
LocalTime maxTime = LocalTime.MAX
Sekarang mari kita lihat dengan lebih mendalam pada LocalDateTime.
3.3. Menggunakan LocalDateTime
LocalDateTime digunakan untuk mewakili gabungan tarikh dan masa.
Ini ialah kelas yang paling biasa digunakan apabila kita perlu menggabungkan tarikh dan masa. Kelas ini menyediakan pelbagai API dan kami akan memperkenalkan beberapa API yang paling biasa digunakan.
Serupa dengan LocalDate dan LocalTime Dapatkan contoh LocalDateTime daripada jam sistem:
LocalDateTime.now();
下面的代码示例解释了如何使用工厂“of”和“parse”方法创建实例。结果将是代表2015年2月20日06:30 AM 的LocalDateTime实例:
LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30); LocalDateTime.parse("2015-02-20T06:30:00");
有一些实用的API可以支持特定时间单位的时间运算,例如天,月,年和分钟。以下代码示例演示了“加”和“减”方法的用法。这些API的行为与LocalDate和LocalTime中的 API完全相同:
localDateTime.plusDays(1); localDateTime.minusHours(2);
Getter方法可用于提取类似于日期和时间类的特定单位。鉴于上面的LocalDateTime实例,下面的代码示例将返回2月份的月份:
localDateTime.getMonth();
4.使用ZonedDateTime API
当我们需要处理时区特定的日期和时间时,Java 8提供了ZonedDateTime 类。ZoneID是用于表示不同区域的标识符。大约有40个不同的时区,使用ZoneID表示它们,如下所示
下面的代码我们来获取下“亚洲/上海”时区:
ZoneId zoneId = ZoneId.of("Aisa/Shanghai");
获取所有的时区:
Set<String> allZoneIds = ZoneId.getAvailableZoneIds();
LocalDateTime转化为特定的时区中的时间:
ZonedDateTime zonedDateTime = ZonedDateTime.of(localDateTime, zoneId);
ZonedDateTime提供解析方法来获取时区的特定日期时间:
ZonedDateTime.parse("2015-05-03T10:15:30+01:00[Aisa/Shanghai]");
使用时区的另一种方法是使用OffsetDateTime。OffsetDateTime是具有偏移量的日期时间的不可变表示形式。此类存储所有日期和时间字段,精确到纳秒,以及从UTC/格林威治的偏移量。可以使用ZoneOffset创建OffsetDateTime实例。这里我们创建一个LocalDateTime来表示2015年2月20日上午6:30:
LocalDateTime localDateTime = LocalDateTime.of(2015, Month.FEBRUARY, 20, 06, 30);
然后我们通过创建ZoneOffset并为LocalDateTime实例设置来增加两个小时:
ZoneOffset offset = ZoneOffset.of("+02:00"); OffsetDateTime offSetByTwo = OffsetDateTime.of(localDateTime, offset);
我们现在的本地日期时间为2015-02-20 06:30 +02:00。现在让我们继续讨论如何使用Period和Duration类修改日期和时间值。
5.使用Period和Duration
Period : 用于计算两个日期(年月日)间隔。
Duration : 用于计算两个时间(秒,纳秒)间隔。
5.1.使用Period
Period 类被广泛地用于修改给定的日期的值或者获取两个日期之间的差值:
LocalDate initialDate = LocalDate.parse("2007-05-10"); LocalDate finalDate = initialDate.plus(Period.ofDays(5));
Period 类有各种getter方法,如getYears,getMonths和getDays从获取值周期对象。下面的代码示例返回一个int值为5,是基于上面示例的逆序操作:
int five = Period.between(finalDate, initialDate).getDays();
该Period 可以在特定的单元获得两个日期之间的如天或月或数年,使用ChronoUnit.between:
int five = ChronoUnit.DAYS.between(finalDate , initialDate);
此代码示例返回五天。让我们继续看看Duration类。
5.2.使用Duration
类似Period ,该Duration类是用来处理时间。在下面的代码中,我们创建一个本地时间上午6:30,然后加30秒的持续时间,以使本地时间上午6时三十〇分30秒的:
LocalTime initialTime = LocalTime.of(6, 30, 0); LocalTime finalTime = initialTime.plus(Duration.ofSeconds(30));
两个时刻之间的持续时间可以作为持续时间或作为特定单位获得。在第一个代码片段中,我们使用Duration类的between()方法来查找finalTime和initialTime之间的时间差,并以秒为单位返回差异:
int thirty = Duration.between(finalTime, initialTime).getSeconds();
在第二个例子中,我们使用ChronoUnit类的between()方法来执行相同的操作:
int thirty = ChronoUnit.SECONDS.between(finalTime, initialTime);
现在我们来看看如何将旧的Date 和Calendar 转换为新的Date和Time。
6.与日期和日历的兼容性
Java 8添加了toInstant()方法,该方法有助于将旧API中的Date和Calendar实例转换为新的Date Time API,如下面的代码片段所示:
LocalDateTime.ofInstant(date.toInstant(), ZoneId.systemDefault()); LocalDateTime.ofInstant(calendar.toInstant(), ZoneId.systemDefault());
所述LocalDateTime可以从如下“ofEpochSecond"方法来构造。以下代码的结果将是代表2016-06-13T11:34:50 的LocalDateTime:
LocalDateTime.ofEpochSecond(1465817690, 0, ZoneOffset.UTC);
现在让我们继续进行日期和时间格式化。
7. 日期和时间格式化
Java 8提供了用于轻松格式化日期和时间的 API :
LocalDateTime localDateTime = LocalDateTime.of(2015, Month.JANUARY, 25, 6, 30);
以下代码传递ISO日期格式以格式化本地日期。结果将是2015-01-25:
String localDateString = localDateTime.format(DateTimeFormatter.ISO_DATE);
该DateTimeFormatter提供多种标准格式选项。也可以提供自定义模式来格式化方法,如下所示,它将返回LocalDate为2015/01/25:
localDateTime.format(DateTimeFormatter.ofPattern("yyyy/MM/dd"));
我们可以将格式样式传递为SHORT,LONG或MEDIUM作为格式化选项的一部分。
下面的代码示例输出2015年1月25日06:30:00 me的输:
localDateTime .format(DateTimeFormatter.ofLocalizedDateTime(FormatStyle.MEDIUM) .withLocale(Locale.UK);
最后让我们看看Java 8 Core Date / Time API 可用的替代方案。
8.替代方案
8.1.使用Threeten 类库
对于从Java 7或Java 6这些老项目来说可以使用Threeten ,然后可以像在上面java 8一样使用相同的功能,一旦你迁移到java 8 只需要修改你的包路径代码而无需变更:
<dependency> <groupId>org.threeten</groupId> <artifactId>threetenbp</artifactId> <version>LATEST</version> </dependency>
8.2.Joda-Time类库
Java 8 日期和时间库的另一种替代方案是Joda-Time库。事实上,Java 8 Date Time API由Joda-Time库(Stephen Colebourne)和Oracle共同领导。该库提供了Java 8 Date Time项目中支持的几乎所有功能。通过在项目中引用以下pom依赖项就可以立即使用:
<dependency> <groupId>joda-time</groupId> <artifactId>joda-time</artifactId> <version>LATEST</version> </dependency>
Atas ialah kandungan terperinci Cara menggunakan Java8 Time API. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Alat AI Hot

Undresser.AI Undress
Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover
Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool
Gambar buka pakaian secara percuma

Clothoff.io
Penyingkiran pakaian AI

AI Hentai Generator
Menjana ai hentai secara percuma.

Artikel Panas

Alat panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas



Panduan Nombor Sempurna di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor Perfect dalam Java?, contoh dengan pelaksanaan kod.

Panduan untuk Weka di Jawa. Di sini kita membincangkan Pengenalan, cara menggunakan weka java, jenis platform, dan kelebihan dengan contoh.

Panduan untuk Nombor Smith di Jawa. Di sini kita membincangkan Definisi, Bagaimana untuk menyemak nombor smith di Jawa? contoh dengan pelaksanaan kod.

Dalam artikel ini, kami telah menyimpan Soalan Temuduga Spring Java yang paling banyak ditanya dengan jawapan terperinci mereka. Supaya anda boleh memecahkan temuduga.

Java 8 memperkenalkan API Stream, menyediakan cara yang kuat dan ekspresif untuk memproses koleksi data. Walau bagaimanapun, soalan biasa apabila menggunakan aliran adalah: bagaimana untuk memecahkan atau kembali dari operasi foreach? Gelung tradisional membolehkan gangguan awal atau pulangan, tetapi kaedah Foreach Stream tidak menyokong secara langsung kaedah ini. Artikel ini akan menerangkan sebab -sebab dan meneroka kaedah alternatif untuk melaksanakan penamatan pramatang dalam sistem pemprosesan aliran. Bacaan Lanjut: Penambahbaikan API Java Stream Memahami aliran aliran Kaedah Foreach adalah operasi terminal yang melakukan satu operasi pada setiap elemen dalam aliran. Niat reka bentuknya adalah

Panduan untuk TimeStamp to Date di Java. Di sini kita juga membincangkan pengenalan dan cara menukar cap waktu kepada tarikh dalam java bersama-sama dengan contoh.

Java ialah bahasa pengaturcaraan popular yang boleh dipelajari oleh pembangun pemula dan berpengalaman. Tutorial ini bermula dengan konsep asas dan diteruskan melalui topik lanjutan. Selepas memasang Kit Pembangunan Java, anda boleh berlatih pengaturcaraan dengan mencipta program "Hello, World!" Selepas anda memahami kod, gunakan gesaan arahan untuk menyusun dan menjalankan program, dan "Hello, World!" Pembelajaran Java memulakan perjalanan pengaturcaraan anda, dan apabila penguasaan anda semakin mendalam, anda boleh mencipta aplikasi yang lebih kompleks.

Kapsul adalah angka geometri tiga dimensi, terdiri daripada silinder dan hemisfera di kedua-dua hujungnya. Jumlah kapsul boleh dikira dengan menambahkan isipadu silinder dan jumlah hemisfera di kedua -dua hujungnya. Tutorial ini akan membincangkan cara mengira jumlah kapsul yang diberikan dalam Java menggunakan kaedah yang berbeza. Formula volum kapsul Formula untuk jumlah kapsul adalah seperti berikut: Kelantangan kapsul = isipadu isipadu silinder Dua jumlah hemisfera dalam, R: Radius hemisfera. H: Ketinggian silinder (tidak termasuk hemisfera). Contoh 1 masukkan Jejari = 5 unit Ketinggian = 10 unit Output Jilid = 1570.8 Unit padu menjelaskan Kirakan kelantangan menggunakan formula: Kelantangan = π × r2 × h (4
