tl; dr
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.toString() // Generate a String in standard ISO 8601 format, wisely extended to append the name of the time zone in square brackets.
2008-01-01T00: 00 + 01: 00 [Europe / Paris]
Per generare una stringa nel formato desiderato, passare un file DateTimeFormatter
.
LocalDateTime.parse( // Lacking an offset or time zone, parse as a `LocalDateTime`. *Not* a specific moment in time.
"2008-01-01 13:15:00".replace( " " , "T" ) // Alter input string to comply with ISO 8601 standard format.
)
.toLocalDate() // Extract a date-only value.
.atStartOfDay( // Do not assume the day starts at 00:00:00. Let class determine start-of-day.
ZoneId.of( "Europe/Paris" ) // Determining a specific start-of-day requires a time zone.
) // Result is a `ZonedDateTime` object. At this point we have a specific moment in time, a point on the timeline.
.format( // Generate a String representing the object’s value.
DateTimeFormatter.ISO_LOCAL_DATE_TIME // Built-in predefined formatter close to what you want.
)
.replace( "T" , " " ) // Replace the standard’s use of a 'T' in the middle with your desired SPACE character.
2008-01-01 00:00:00
Dettagli
Altre risposte sono corrette, ma usano vecchie classi data-ora ora superate dal framework java.time.
java.time
Il framework java.time è integrato in Java 8 e versioni successive. Gran parte della funzionalità java.time è stata trasferita su Java 6 e 7 ( ThreeTen-Backport ) e ulteriormente adattata ad Android ( ThreeTenABP ).
Per prima cosa modifica la stringa di input in modo che sia conforme alla versione canonica del formato ISO 8601. I formati ISO 8601 standard vengono utilizzati per impostazione predefinita nelle classi java.time per analizzare / generare stringhe che rappresentano valori di data e ora. Dobbiamo sostituire quello SPAZIO nel mezzo con un file T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Ora possiamo analizzarlo come un LocalDateTime
, dove "Locale" significa nessuna località specifica. L'input è privo di informazioni sulla differenza di fuso orario o UTC .
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Se non ti interessa l'ora del giorno né il fuso orario, converti in un file LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 2008-01-01
Primo momento della giornata
Se invece vuoi che l'ora del giorno sia impostata sul primo momento della giornata, usa una ZonedDateTime
classe, quindi converti in un LocalDate
oggetto per chiamare il suo atStartOfDay
metodo. Tieni presente che il primo momento potrebbe non essere l'ora a 00:00:00
causa dell'ora legale o forse di altre anomalie.
Il fuso orario è fondamentale perché per un dato momento la data varia nel mondo in base alla zona. Ad esempio, pochi istanti dopo la mezzanotte a Parigi è un nuovo giorno per i parigini, ma è ancora "ieri" a Montréal per i canadesi.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ldt.atZone( zoneId );
LocalDate ldFromZdt = zdt.toLocalDate();
ZonedDateTime zdtStartOfDay = ldFromZdt.atStartOfDay( zoneId );
zdtStartOfDay.toString ()… 2008-01-01T00: 00: 00-05: 00 [America / Montreal]
UTC
Per vedere quel momento attraverso la lente del fuso orario UTC , estrai un Instant
oggetto. Sia l' ZonedDateTime
e Instant
rappresenterà nello stesso momento sulla timeline, ma appaiono come due diversi tempi di orologio a muro .
An Instant
è la classe building block di base in java.time, sempre in UTC per definizione. Utilizza questa classe frequentemente, poiché in genere dovresti eseguire la logica aziendale, l'archiviazione dei dati e lo scambio di dati in UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Vediamo le 5 del mattino anziché lo scoccare della mezzanotte. Nel formato standard, alla Z
fine è l'abbreviazione Zulu
e significa "UTC".
Informazioni su java.time
Il framework java.time è integrato in Java 8 e versioni successive. Queste classi soppiantare la vecchia fastidiosi legacy classi data-time come java.util.Date
, Calendar
, e SimpleDateFormat
.
Il progetto Joda-Time , ora in modalità di manutenzione , consiglia la migrazione alle classi java.time .
Per saperne di più, vedere il tutorial Oracle . E cerca Stack Overflow per molti esempi e spiegazioni. La specifica è JSR 310 .
Puoi scambiare oggetti java.time direttamente con il tuo database. Utilizza un driver JDBC compatibile con JDBC 4.2 o successivo. Non c'è bisogno di stringhe, non c'è bisogno di java.sql.*
classi.
Dove ottenere le classi java.time?
- Java SE 8 , Java SE 9 e versioni successive
- Built-in.
- Parte dell'API Java standard con un'implementazione in bundle.
- Java 9 aggiunge alcune funzionalità e correzioni minori.
- Java SE 6 e Java SE 7
- Gran parte delle funzionalità java.time sono portate indietro su Java 6 e 7 in ThreeTen-Backport .
- androide
- Versioni successive delle implementazioni di bundle Android delle classi java.time.
- Per precedenza Android (<26), il ThreeTenABP progetto si adatta ThreeTen-Backport (di cui sopra). Vedi Come usare ThreeTenABP… .
Il progetto ThreeTen-Extra estende java.time con classi aggiuntive. Questo progetto è un banco di prova per possibili future aggiunte a java.time. Si possono trovare alcune classi utili, come per esempio Interval
, YearWeek
, YearQuarter
e altro .