tl; dr
LocalDateTime.parse( // Parse string as value without time zone.
"2017-01-23 12:34 PM" ,
DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a")
).atZone(ZoneId.of("America/Montreal")) // Assign time zone.
.toString() // Generate string: 2017-01-23T17:34:00Z
.replace("T" , " ") // Substitute SPACE for 'T' in middle.
.replace("Z" , " Z") // Insert SPACE before 'Z'.
Evita legacy classi data-ora
Le altre risposte utilizzano le classi fastidiosi scendere Data-time (Date
, Calendar
, ecc), ora legacy, soppiantato dal classi java.time.
LocalDateTime
Ho una stringa nel modello hh aaaa-MM-dd: mm a
Tale stringa di input è priva di qualsiasi indicazione di offset da-UTC o fuso. Quindi analizziamo come LocalDateTime
.
Definire un modello di formattazione che corrisponda all'input con un oggetto DateTimeFormatter
.
String input = "2017-01-23 12:34 PM" ;
DateTimeFormatter f = DateTimeFormatter.ofPattern("uuuu-MM-dd hh:mm a");
LocalDateTime ldt = LocalDateTime.parse(input , f);
ldt.toString(): 2017-01-23T12: 34
Nota che un LocalDateTime
è non uno specifico momento, solo una vaga idea di una serie di possibili momenti . Ad esempio, pochi minuti dopo la mezzanotte a Parigi, la Francia è ancora "ieri" a Montréal, in Canada. Quindi, senza il contesto di un fuso orario come Europe/Paris
o America/Montreal
, solo dire "pochi minuti dopo mezzanotte" non ha alcun significato.
ZoneId
e posso ottenere la zona oggetto tempo separatamente in cui la stringa sopra rappresenta la data.
Un fuso orario è rappresentato dalla classe ZoneId
.
Specificare un proper time zone name nel formato continent/region
, come ad esempio America/Montreal
, Africa/Casablanca
o Pacific/Auckland
. Non utilizzare mai l'abbreviazione di 3-4 lettere come EST
o IST
poiché sono non fusi orari reali, non standardizzati e nemmeno univoci (!).
ZoneId z = ZoneId.of("America/Montreal");
ZonedDateTime
Applicare la ZoneId
per ottenere un ZonedDateTime
, che è davvero un punto sulla timeline, un determinato momento della storia.
ZonedDateTime zdt = ldt.atZone(z);
zdt.toString(): 2017-01-23T12: 34-05: 00 [America/Montreal]
Instant
voglio convertire questo a il seguente formato aaaa-MM-dd HH: mm: ss Z
Innanzitutto, sappiamo che un carattere letterale Z
è l'abbreviazione di Zulu
e mezzi UTC. In altre parole, un offset-from-UTC di zero ore, +00:00
.
La classe Instant
rappresenta un momento sulla timeline in UTC con una risoluzione di nanoseconds (fino a nove (9) cifre di una frazione decimale).
È possibile estrarre un oggetto Instant
da un ZonedDateTime
.
Instant instant = zdt.toInstant(); // Extracting the same moment but in UTC.
per generare una stringa in formato standard ISO 8601, come ad esempio 2017-01-22T18:21:13.354Z
, chiamare toString
. Il formato standard non ha spazi, utilizza uno T
per separare l'anno-mese-data dall'ora-minuto-secondo e aggiunge il Z
canonico per un offset pari a zero.
String output = instant.toString();
instant.toString(): 2017-01-23T17: 34: 00Z
vi consiglio vivamente di utilizzare i formati standard quando possibile. Se si insiste a utilizzare gli spazi come nel formato desiderato specificato, definire il proprio modello di formattazione in un oggetto DateTimeFormatter
o eseguire semplicemente una manipolazione di stringa sull'output di Instant::toString
.
String output = instant.toString()
.replace("T" , " ") // Substitute SPACE for T.
.replace("Z" , " Z"); // Insert SPACE before Z.
uscita: 2017/01/23 17:34:00 Z
Prova questo code live at IdeOne.com.
Chi java.time
Il quadro java.time è costruito in Java 8 e versioni successive. Queste classi soppiantano le fastidiose classi data legacy come java.util.Date
, Calendar
, & SimpleDateFormat
.
Il progetto Joda-Time, ora in maintenance mode, consiglia la migrazione alle classi java.time.
Per ulteriori informazioni, vedere Oracle Tutorial. E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310.
Dove ottenere le classi java.time?
- Java SE 8 e SE 9 e successivamente
- incorporato.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e SE 7
- Molte delle funzionalità java.time è di back-porting per Java 6 .
- Android
Il progetto ThreeTen-Extra java.time prolunga con classi aggiuntive. Questo progetto è un terreno di prova per possibili aggiunte future a java.time. È possibile trovare alcune classi utili come Interval
, YearWeek
, YearQuarter
e more.
http://joda-time.sourceforge.net/ rende tutte le manipolazioni di date in java molto più facili – NimChimpsky
@Emil ho avuto modo di conoscere questa funzione dopo aver detto :), grazie. – John
FYI, il progetto [Joda-Time] (http://www.joda.org/joda-time/) è ora in [modalità manutenzione] (https://en.wikipedia.org/wiki/Maintenance_mode), con il team che consiglia la migrazione alle classi [java.time] (http://docs.oracle.com/javase/8/docs/api/java/time/package-summary.html). –