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.
01-01-2008T00: 00 + 01: 00 [Europa / Paris]
Para gerar uma String no formato desejado, passe a 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.
01-01-2008 00:00:00
Detalhes
Outras respostas estão corretas, mas use classes de data e hora antigas, agora ultrapassadas pela estrutura java.time.
java.time
A estrutura java.time é integrada ao Java 8 e posterior. Grande parte da funcionalidade java.time é portada para Java 6 e 7 ( ThreeTen-Backport ) e posteriormente adaptada para Android ( ThreeTenABP ).
Primeiro altere a string de entrada para ficar em conformidade com a versão canônica do formato ISO 8601. Os formatos padrão ISO 8601 são usados por padrão nas classes java.time para analisar / gerar strings que representam valores de data e hora. Precisamos substituir esse ESPAÇO no meio por um T
.
String input = "2008-01-01 13:15:00".replace( " " , "T" ); // → 2008-01-01T13:15:00
Agora podemos analisá-lo como um LocalDateTime
, onde “Local” significa nenhuma localidade específica. A entrada não possui informações de deslocamento do UTC ou fuso horário.
LocalDateTime ldt = LocalDateTime.parse( input );
ldt.toString ()… 2008-01-01T13: 15: 00
Se você não se importa com a hora do dia nem com o fuso horário, converta para a LocalDate
.
LocalDate ld = ldt.toLocalDate();
ld.toString ()… 01-01-2008
Primeiro momento do dia
Se, em vez disso, você quiser que a hora do dia seja definida como o primeiro momento do dia, use uma ZonedDateTime
classe e, a seguir, converta em um LocalDate
objeto para chamar seu atStartOfDay
método. Esteja ciente de que o primeiro momento pode não ser o momento00:00:00
devido ao horário de verão ou talvez outras anomalias.
O fuso horário é crucial porque, para qualquer momento, a data varia em todo o mundo por zona. Por exemplo, alguns momentos depois da meia-noite em Paris é um novo dia para os parisienses, mas ainda é “ontem” em Montreal para os canadenses.
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 [América / Montreal]
UTC
Para ver aquele momento pelas lentes do fuso horário UTC , extraia um Instant
objeto. Ambos, ZonedDateTime
e Instant
representarão o mesmo momento na linha do tempo, mas aparecerão como dois tempos diferentes .
An Instant
é a classe de bloco de construção básica em java.time, sempre em UTC por definição. Use essa classe com frequência, como você geralmente deve fazer sua lógica de negócios, armazenamento de dados e troca de dados em UTC.
Instant instant = zdtStartOfDay.toInstant();
instant.toString ()… 2008-01-01T05: 00: 00Z
Vemos 5h da manhã em vez de meia-noite. No formato padrão, Z
no final é a abreviação de Zulu
e significa “UTC”.
Sobre java.time
A estrutura java.time é integrada ao Java 8 e posterior. Essas classes suplantar os velhos problemáticos legados aulas de data e hora, como java.util.Date
, Calendar
, e SimpleDateFormat
.
O projeto Joda-Time , agora em modo de manutenção , aconselha a migração para o java.time classes .
Para saber mais, consulte o Tutorial Oracle . E pesquise no Stack Overflow para muitos exemplos e explicações. A especificação é JSR 310 .
Você pode trocar objetos java.time diretamente com seu banco de dados. Use um driver JDBC compatível com JDBC 4.2 ou posterior. Não há necessidade de cordas, não há necessidade de java.sql.*
classes.
Onde obter as classes java.time?
- Java SE 8 , Java SE 9 e posterior
- Construídas em.
- Parte da API Java padrão com uma implementação agrupada.
- Java 9 adiciona alguns recursos e correções menores.
- Java SE 6 e Java SE 7
- Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport .
- Android
- Versões posteriores de implementações de pacotes Android das classes java.time.
- Para anteriormente Android (<26), o ThreeTenABP projeto adapta ThreeTen-Backport (mencionados acima). Consulte Como usar o ThreeTenABP… .
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de provas para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .