English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Java 8 ha rafforzato ulteriormente la gestione delle date e delle ore con la pubblicazione di un nuovo API di data/ora (JSR 310).
Nella versione precedente di Java, l'API di data/ora presentava molti problemi, tra cui:
Non thread-safe java.util.Date è non thread-safe, tutte le classi di data sono mutabili, questo è uno dei principali problemi delle classi di data Java.
Progettazione scadente − La definizione delle classi di date/ora in Java non è coerente. Esistono classi di date sia nel pacchetto java.util che in java.sql, oltre a classi per la formattazione e la解析 nel pacchetto java.text. La classe java.util.Date contiene sia la data che l'ora, mentre java.sql.Date contiene solo la data, il che non è ragionevole includerlo nel pacchetto java.sql. Inoltre, entrambe le classi hanno lo stesso nome, il che rappresenta un pessimo design.
Gestione delle timezone complicata − Le classi di date non forniscono internazionalizzazione né supporto per le timezone, quindi Java ha introdotto le classi java.util.Calendar e java.util.TimeZone, ma anch'esse presentano tutti i problemi menzionati.
Java 8 ha introdotto java.time Il pacchetto fornisce molti nuovi API. Ecco due dei più importanti API:
Local(locale) − Semplifica la gestione delle date/ora, senza problemi di timezone.
Zoned(timezone) − Gestisce le date/ora tramite la timezone specificata.
Il nuovo pacchetto java.time copre tutte le operazioni di gestione delle date, delle ore, delle date/ora, delle timezone, degli istanti (instants), dei periodi (during) e degli orologi (clock).
LocalDate/LocalTime e LocalDateTime possono essere utilizzati senza dover gestire le timezone. Ecco un esempio di codice:
import java.time.LocalDate; import java.time.LocalTime; import java.time.LocalDateTime; import java.time.Month; public class Java8Tester {} public static void main(String args[]){} Java8Tester java8tester = new Java8Tester(); java8tester.testLocalDateTime(); {} public void testLocalDateTime(){ // Ottenere la data e ora corrente LocalDateTime currentTime = LocalDateTime.now(); System.out.println("Ora corrente: " + currentTime); LocalDate date1 = currentTime.toLocalDate(); System.out.println("date1: " + date1); Month month = currentTime.getMonth(); int day = currentTime.getDayOfMonth(); int seconds = currentTime.getSecond(); System.out.println("Mese: " + month +", Giorno: " + day +", Secondo: " + seconds); LocalDateTime date2 = currentTime.withDayOfMonth(10).withYear(2012); System.out.println("date2: " + date2); // 12 dicembre 2014 LocalDate date3 = LocalDate.of(2014, Month.DECEMBER, 12); System.out.println("date3: " + date3); // 22 ore 15 minuti LocalTime date4 = LocalTime.of(22, 15); System.out.println("date4: " + date4); // 解析字符串 LocalTime date5 = LocalTime.parse("20:15:30"); System.out.println("date5: " + date5); {} {}
Esegui lo script sopra, il risultato di output sarà:
$ javac Java8Tester.java $ java Java8Tester Ora corrente: 2016-04-15T16:55:48.668 date1: 2016-04-15 Mese: APRIL, Giorno: 15, Secondo: 48 date2: 2012-04-10T16:55:48.668 date3: 2014-12-12 date4: 22:15 date5: 20:15:30
Se dobbiamo considerare la zona temporale, possiamo utilizzare l'API delle date e ore con la zona temporale:
import java.time.ZonedDateTime; import java.time.ZoneId; public class Java8Tester {} public static void main(String args[]){} Java8Tester java8tester = new Java8Tester(); java8tester.testZonedDateTime(); {} public void testZonedDateTime(){} // 获取当前时间日期 ZonedDateTime date1 = ZonedDateTime.parse("2015-12-03T10:15:30+05:30[Asia/Shanghai]"); System.out.println("date1: " + date1); ZoneId id = ZoneId.of("Europe/Paris"); System.out.println("ZoneId: " + id); ZoneId currentZone = ZoneId.systemDefault(); System.out.println("Fuso orario corrente: " + currentZone); {} {}
Esegui lo script sopra, il risultato di output sarà:
$ javac Java8Tester.java $ java Java8Tester date1: 2015-12-03T10:15:30+08:00[Asia/Shanghai] ZoneId: Europe/Paris Fuso orario corrente: Asia/Shanghai