Converti la data della stringa UTC in formato data
Come convertire la stringa "2020-09-02T12: 22: 53.9" nel formato data 2020-09-02T12: 22: 53.9 in java?
String dateString = "2020-09-02T12:22:53.9";
String tz = "America/Mexico_City";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-mm hh:mm:ss.S");
ZoneId zoneId = ZoneId.of(tz);
Instant instant = Instant.parse(dateString);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(dtf));
Questo codice genera un java.time.format.DateTimeParseException: Text '2020-09-02T12:22:53.9' could not be parsed at index 21modulo nella riga Instant instant = Instant.parse(dateString);.
Risposte
Il tuo formato non è corretto. Hai usato mm, invece di MM, per il mese. Inoltre, ti sei perso il letterale Tnel formato. Si noti che è necessario utilizzare HHper il formato 24 ore.
Poiché la tua stringa data-ora non ha informazioni sul fuso orario, dovrai analizzare la stringa data-ora in LocalDateTimee quindi utilizzarla LocalDateTime#atZoneper convertirla in ZonedDateTime(se necessario ZonedDateTime) come mostrato di seguito:
import java.time.LocalDateTime;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String dateString = "2020-09-02T12:22:53.9";
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S");
String tz = "America/Mexico_City";
ZoneId zoneId = ZoneId.of(tz);
// Parse the given date-time string to LocalDateTime
LocalDateTime ldt = LocalDateTime.parse(dateString, dtf);
// Convert the LocalDateTime to ZonedDateTime
ZonedDateTime dateTimeInTz = ldt.atZone(zoneId);
// Display ZonedDateTime in its default format
System.out.println(dateTimeInTz);
// Display ZonedDateTime in your custom format
System.out.println(dateTimeInTz.format(dtf));
}
}
Produzione:
2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9
In alternativa, puoi usare ZoneIdcon DateTimeFormatterse stesso e quindi puoi analizzare la stringa data-ora fornita direttamente ZonedDateTimecome mostrato di seguito:
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
public class Main {
public static void main(String[] args) {
String dateString = "2020-09-02T12:22:53.9";
String tz = "America/Mexico_City";
ZoneId zoneId = ZoneId.of(tz);
DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-dd-MM'T'HH:mm:ss.S").withZone(ZoneId.of(tz));
// Parse the given date-time string into ZonedDateTime
ZonedDateTime dateTimeInTz = ZonedDateTime.parse(dateString, dtf);
// Display ZonedDateTime in its default format
System.out.println(dateTimeInTz);
// Display ZonedDateTime in your custom format
System.out.println(dateTimeInTz.format(dtf));
}
}
Produzione:
2020-02-09T12:22:53.900-06:00[America/Mexico_City]
2020-09-02T12:22:53.9
Nessun formattatore necessario
Presumo che la stringa della data si trovi nel fuso orario America / Mexico_City e che si desideri visualizzare lo stesso fuso orario, quindi la stessa data e ora. Suppongo inoltre che internamente nel tuo programma tu voglia rappresentare il punto nel tempo come un file Instant. Il cerchio completo dalla stringa della data ae Instantviceversa può essere:
String tz = "America/Mexico_City";
ZoneId zoneId = ZoneId.of(tz);
String dateString = "2020-09-02T12:22:53.9";
Instant instant = LocalDateTime.parse(dateString).atZone(zoneId).toInstant();
System.out.println(instant);
ZonedDateTime dateTimeInTz =ZonedDateTime.ofInstant(instant, zoneId);
System.out.println(dateTimeInTz.format(DateTimeFormatter.ISO_LOCAL_DATE_TIME));
Produzione:
2020-09-02T17:22:53.900Z 2020-09-02T12:22:53.9
Il tuo input e il tuo identico output sono in formato ISO 8601. LocalDateTimeanalizza il formato ISO 8601 senza fuso orario o offset come impostazione predefinita, ovvero senza alcun formattatore esplicito. Per stampare il ZonedDateTimeretro nello stesso formato, utilizziamo il built-in DateTimeFormatter.ISO_LOCAL_DATE_TIME. Come avrai già capito, essere liberi di specificare la nostra stringa di pattern di formato è un grande sollievo.
Cosa è andato storto nel tuo codice?
Arvind Kumar Avinash ha già segnalato gli errori nella stringa del modello di formato. Fondamentalmente, non puoi analizzare la tua stringa in un Instant, o più precisamente, ci vuole qualcosa di più per farlo. Il motivo è che Java e la Instantclasse non sanno e non possono indovinare quale fuso orario intendevi. La stringa della data ha la data e l'ora del giorno senza alcun fuso orario. An Instantè un punto nel tempo, concettualmente senza alcuna data o ora del giorno. La tua stringa potrebbe rappresentare diversi punti nel tempo in diversi fusi orari, quindi solo specificando il fuso orario è possibile determinare il punto nel tempo.
Ciò che la Instantclasse può analizzare è una data e un'ora in UTC denotate da un Z. Un esempio di tale stringa a è in uscita dal Instantsopra 2020-09-02T17:22:53.900Z. Poiché la tua stringa non è in UTC (e quindi non ha il Z), questa osservazione non ci aiuta nel tuo caso.
Link
- Articolo di Wikipedia: ISO 8601