English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

教程基础Java

Controllo di流程 Java

Array Java

Java orientata agli oggetti (I)

Java orientata agli oggetti (II)

Java orientata agli oggetti (III)

Gestione delle eccezioni Java

List Java

Queue (coda) Java

Map di Java

Set di Java

Input/Output (I/O) Java

Reader/Writer Java

Altri argomenti Java

API di data/ora Java 8

Nuove funzionalità Java 8

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).

API per la localizzazione delle date e delle ore

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

Utilizzo dell'API delle date e ore con la zona temporale

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

Nuove funzionalità Java 8