Come analizzare / formattare le date con LocalDateTime? (Java 8)

Java 8 ha aggiunto una nuova API java.time per lavorare con date e ore ( JSR 310 ).

Ho la data e l’ora come stringa (es. "2014-04-08 12:30" ). Come posso ottenere un’istanza LocalDateTime dalla stringa specificata?

Dopo aver finito di lavorare con l’object LocalDateTime : Come posso quindi convertire l’istanza LocalDateTime in una stringa con lo stesso formato mostrato sopra?

Data e ora di analisi

Per creare un object LocalDateTime da una stringa, puoi utilizzare il metodo statico LocalDateTime.parse() . Prende una stringa e un DateTimeFormatter come parametro. DateTimeFormatter viene utilizzato per specificare il modello di data / ora.

 String str = "1986-04-08 12:30"; DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.parse(str, formatter); 

Formattazione di data e ora

Per creare una stringa formattata su un object LocalDateTime puoi utilizzare il metodo format() .

 DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); LocalDateTime dateTime = LocalDateTime.of(1986, Month.APRIL, 8, 12, 30); String formattedDateTime = dateTime.format(formatter); // "1986-04-08 12:30" 

Si noti che alcuni formati di data / ora comunemente usati sono predefiniti come costanti in DateTimeFormatter . Ad esempio: l’utilizzo di DateTimeFormatter.ISO_DATE_TIME per formattare l’istanza LocalDateTime da sopra comporterebbe la stringa "1986-04-08T12:30:00" .

I metodi parse() e format() sono disponibili per tutti gli oggetti correlati a data / ora (ad esempio, LocalDate o ZonedDateTime )

È inoltre ansible utilizzare LocalDate.parse() o LocalDateTime.parse() su una String senza fornire un modello, se la String è in formato ISO-8601 .

per esempio,

 String strDate = "2015-08-04"; LocalDate aLD = LocalDate.parse(strDate); System.out.println("Date: " + aLD); String strDatewithTime = "2015-08-04T10:11:30"; LocalDateTime aLDT = LocalDateTime.parse(strDatewithTime); System.out.println("Date with Time: " + aLDT); 

Uscita ,

 Date: 2015-08-04 Date with Time: 2015-08-04T10:11:30 

e utilizzare DateTimeFormatter solo se si ha a che fare con altri modelli di data, ad esempio, dd MMM uuuu rappresenta il giorno del mese (due cifre), tre lettere del nome del mese (Gen, Feb, Mar, …) e un anno a quattro cifre:

 DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu"); String anotherDate = "04 Aug 2015"; LocalDate lds = LocalDate.parse(anotherDate, dTF); System.out.println(anotherDate + " parses to " + lds); 

Produzione

 04 Aug 2015 parses to 2015-08-04 

ricorda anche che l’object DateTimeFormatter è bidirezionale; può analizzare sia l’input che il formato.

 String strDate = "2015-08-04"; LocalDate aLD = LocalDate.parse(strDate); DateTimeFormatter dTF = DateTimeFormatter.ofPattern("dd MMM uuuu"); System.out.println(aLD + " formats as " + dTF.format(aLD)); 

Produzione

 2015-08-04 formats as 04 Aug 2015 

(vedi l’ elenco completo dei Pattern per Formattazione e Parsing DateFormatter )

  Symbol Meaning Presentation Examples ------ ------- ------------ ------- G era text AD; Anno Domini; A u year year 2004; 04 y year-of-era year 2004; 04 D day-of-year number 189 M/L month-of-year number/text 7; 07; Jul; July; J d day-of-month number 10 Q/q quarter-of-year number/text 3; 03; Q3; 3rd quarter Y week-based-year year 1996; 96 w week-of-week-based-year number 27 W week-of-month number 4 E day-of-week text Tue; Tuesday; T e/c localized day-of-week number/text 2; 02; Tue; Tuesday; T F week-of-month number 3 a am-pm-of-day text PM h clock-hour-of-am-pm (1-12) number 12 K hour-of-am-pm (0-11) number 0 k clock-hour-of-am-pm (1-24) number 0 H hour-of-day (0-23) number 0 m minute-of-hour number 30 s second-of-minute number 55 S fraction-of-second fraction 978 A milli-of-day number 1234 n nano-of-second number 987654321 N nano-of-day number 1234000000 V time-zone ID zone-id America/Los_Angeles; Z; -08:30 z time-zone name zone-name Pacific Standard Time; PST O localized zone-offset offset-O GMT+8; GMT+08:00; UTC-08:00; X zone-offset 'Z' for zero offset-X Z; -08; -0830; -08:30; -083015; -08:30:15; x zone-offset offset-x +0000; -08; -0830; -08:30; -083015; -08:30:15; Z zone-offset offset-Z +0000; -0800; -08:00; p pad next pad modifier 1 ' escape for text delimiter '' single quote literal ' [ optional section start ] optional section end # reserved for future use { reserved for future use } reserved for future use 

Entrambe le risposte sopra spiegano molto bene la domanda riguardante i modelli di corde. Tuttavia, nel caso in cui si lavori con ISO 8601 non è necessario applicare DateTimeFormatter poiché LocalDateTime è già pronto per questo:

Converti LocalDateTime nella stringa del fuso orario ISO8601

 LocalDateTime ldt = LocalDateTime.now(); ZonedDateTime zdt = ldt.atZone(ZoneOffset.UTC); //you might use a different zone String iso8601 = zdt.toString(); 

Converti da una stringa ISO8601 a un LocalDateTime

 String iso8601 = "2016-02-14T18:32:04.150Z"; ZonedDateTime zdt = ZonedDateTime.parse(iso8601); LocalDateTime ldt = zdt.toLocalDateTime();