Outras respostas estão corretas, especialmente a resposta java.time de arganzheng . Como alguns mencionados, você deve evitar as antigas classes java.util.Date/.Calendar, pois elas são mal projetadas, confusas e problemáticas. Eles foram suplantados pelas classes java.time.
Deixe-me adicionar notas sobre a estratégia de lidar com a meia - noite e os períodos de tempo .
Meio aberto
No trabalho de data e hora, os períodos de tempo são frequentemente definidos usando a abordagem "semi-aberta". Nesta abordagem, o começo é inclusivo, enquanto o final é exclusivo . Isso resolve problemas e, se usado de forma consistente, facilita muito o raciocínio sobre o manuseio de data e hora.
Um problema resolvido é definir o final do dia. O último momento do dia 23:59:59.999
( milissegundos )? Talvez, na classe java.util.Date (do Java mais antigo; problemático - evite essa classe!) E na biblioteca de sucesso Joda-Time . Mas em outros softwares, como bancos de dados como o Postgres, o último momento será 23:59:59.999999
( microssegundos ). Porém, em outros softwares, como o framework java.time (incorporado no Java 8 e posterior, sucessor do Joda-Time) e em alguns bancos de dados, como o H2 Database , o último momento pode ser 23:59.59.999999999
( nanossegundos ). Em vez de dividir os cabelos, pense apenas no primeiro momento, não no último momento.
No Half-Open, um dia decorre do primeiro momento de um dia e vai até, mas não inclui, o primeiro momento do dia seguinte. Então, ao invés de pensar assim:
… A partir de hoje às 00:00 (meia-noite desta manhã) às 12:00 (meia-noite de hoje à noite).
... pense assim ...
desde o primeiro momento de hoje até o primeiro momento de amanhã, mas não incluindo:
(> = 00:00:00.0
hoje AND < 00:00:00.0
amanhã)
No trabalho de banco de dados, essa abordagem significa não usar o BETWEEN
operador no SQL.
Início do dia
Além disso, o primeiro momento do dia nem sempre é a hora do dia 00:00:00.0
. O horário de verão (DST) em alguns fusos horários e possivelmente em outras anomalias, pode significar que um horário diferente começa o dia.
Portanto, permita que as classes java.time façam o trabalho de determinar o início de um dia com uma chamada para LocalDate::atStartOfDay( ZoneId )
. Portanto, temos que desviar LocalDate
e voltar para, ZonedDateTime
como você pode ver neste código de exemplo.
ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime now = ZonedDateTime.now( zoneId );
ZonedDateTime todayStart = now.toLocalDate().atStartOfDay( zoneId );
ZonedDateTime tomorrowStart = todayStart.plusDays( 1 );
Observe a passagem do opcional ZoneId
. Se omitido, o fuso horário padrão atual da sua JVM será aplicado implicitamente. Melhor ser explícito.
O fuso horário é crucial para o trabalho de data e hora. A pergunta e algumas outras respostas são potencialmente defeituosas porque não lidam conscientemente com o fuso horário.
Converter
Se você deve usar um java.util.Date ou .Calendar, procure novos métodos de conversão adicionados a essas classes antigas.
java.util.Date utilDate = java.util.Date.from( todayStart.toInstant() );
java.util.GregorianCalendar gregCal = java.util.GregorianCalendar.from( todayStart );
Período de tempo
A propósito, se você estiver fazendo muito trabalho com períodos de tempo, dê uma olhada:
Duration
Period
Interval
A Interval
classe é encontrada no projeto ThreeTen-Extra , uma extensão da estrutura java.time. Este projeto é o campo de prova para possíveis adições futuras ao java.time.
Interval todayMontreal = Interval.of( todayStart.toInstant() , tomorrowStart.toInstant() );
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 as classes java.time .
Para saber mais, consulte o Tutorial do Oracle . E procure 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 strings, não há necessidade dejava.sql.*
classes.
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende java.time com classes adicionais. Este projeto é um campo de prova para possíveis adições futuras ao java.time. Você pode encontrar algumas classes úteis aqui, como Interval
, YearWeek
, YearQuarter
, e mais .