No meu código, preciso encontrar todas as minhas coisas que aconteceram hoje. Então, preciso comparar com as datas de hoje às 00:00 (meia-noite desta manhã) e às 12:00 (meia-noite de hoje à noite).
Eu sei ...
Date today = new Date();
... me pega agora. E ...
Date beginning = new Date(0);
... me dá tempo zero em 1º de janeiro de 1970. Mas qual é a maneira mais fácil de obter tempo zero hoje e amanhã amanhã?
ATUALIZAR; Eu fiz isso, mas certamente há uma maneira mais fácil?
Calendar calStart = new GregorianCalendar();
calStart.setTime(new Date());
calStart.set(Calendar.HOUR_OF_DAY, 0);
calStart.set(Calendar.MINUTE, 0);
calStart.set(Calendar.SECOND, 0);
calStart.set(Calendar.MILLISECOND, 0);
Date midnightYesterday = calStart.getTime();
Calendar calEnd = new GregorianCalendar();
calEnd.setTime(new Date());
calEnd.set(Calendar.DAY_OF_YEAR, calEnd.get(Calendar.DAY_OF_YEAR)+1);
calEnd.set(Calendar.HOUR_OF_DAY, 0);
calEnd.set(Calendar.MINUTE, 0);
calEnd.set(Calendar.SECOND, 0);
calEnd.set(Calendar.MILLISECOND, 0);
Date midnightTonight = calEnd.getTime();
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Respostas:
java.util.Calendar
JDK 8 - java.time.LocalTime e java.time.LocalDate
Joda-Time
Se você estiver usando um JDK <8, recomendo o Joda Time , porque a API é muito boa:
Como a versão 2.3 do Joda Time
DateMidnight
está obsoleta , use este:Passe um fuso horário se não desejar o fuso horário padrão atual da JVM.
fonte
toDateMidnight
foi preterido. Veja esta resposta para obter detalhes: stackoverflow.com/a/19048833/363573ZonedDateTime
) como você fez na seção Joda-Time. OsLocal…
tipos não têm informações de fuso horário - esse é seu objetivo inteiro, não perdem / ignoram todos os detalhes de deslocamento e fuso horário. Especialmente quando a Pergunta fala sobre o uso desses valores para comparação (talvez consultas ao banco de dados?), É provável que um valor de data / hora com zoneamento seja mais útil.Para garantir a integridade, se você estiver usando o Java 8, também poderá usar o
truncatedTo
método daInstant
classe para obter meia-noite no UTC .Conforme escrito no Javadoc
Espero que ajude.
fonte
Date.from(date.toInstant().atZone(ZoneId.systemDefault()).truncatedTo(ChronoUnit.DAYS).toInstant())
truncatedTo
eatStartOfDay
.A maneira mais fácil de encontrar uma meia-noite:
Próximo dia:
fonte
Lembre-se,
Date
não é usado para representar datas (!). Para representar a data, você precisa de um calendário. Este:criará uma
Calendar
instância representando a data atual no seu fuso horário atual. Agora, o que você precisa é truncar todos os campos abaixo do dia (hora, minuto, segundo e milissegundo) configurando-o para0
. Agora você tem meia-noite hoje.Agora, para chegar à meia-noite do dia seguinte, você precisa adicionar um dia:
Observe que a adição de
86400
segundos ou 24 horas está incorreta devido ao horário de verão que pode ocorrer nesse meio tempo.ATUALIZAÇÃO: No entanto, minha maneira favorita de lidar com esse problema é usar a classe DateUtils do Commons Lang :
Ele usa
Calendar
nos bastidores ...fonte
esses métodos ajudarão você-
e
fonte
A partir do JodaTime 2.3, o item
toDateMidnight()
foi descontinuado.Da atualização de 2.2 para 2.3
Aqui está um código de exemplo sem
toDateMidnight()
método.Código
Saída ( pode ser diferente dependendo do fuso horário local )
fonte
DateTimeZone
instância para queDateTime
o construtor de salientar a importância de especificar um fuso horário em vez de, inadvertidamente, dependendo do padrão:DateTimeZone timeZone = DateTimeZone.forID( "Europe/Paris" );
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 ser23: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:
... pense assim ...
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 desviarLocalDate
e voltar para,ZonedDateTime
como você pode ver neste código de exemplo.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.
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
, eSimpleDateFormat
.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 de
java.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 .fonte
java.time
Se você estiver usando o Java 8 e posterior, pode tentar o pacote java.time ( Tutorial ):
fonte
Parece ser uma opção:
para adicionar um dia a ele,
ou
Eu tenho um palpite de que o último é o preferido em caso de algo estranho como o horário de verão, fazendo com que adicionar 24 horas não seja suficiente (consulte https://stackoverflow.com/a/4336131/32453 e suas outras respostas).
fonte
Fiz isso de maneira diferente do que todos os outros aqui. Eu sou novo em Java, então talvez minha solução seja ruim.
Ainda não tenho certeza de que isso funcione, mas, de qualquer forma, agradeceria qualquer comentário sobre esta solução.
Estou confuso com a afirmação acima de que você pode calcular amanhã ligando para:
Se você adicionar 1 ao dia do mês e este for o 31º dia, não receberá o 32º dia do mês?
Por que as horas / datas nem todas são baseadas no UTC em Java? Eu acho que fusos horários só devem ser necessários quando usados com E / S, mas internamente sempre devem ser usados no UTC. No entanto, as classes parecem incluir informações de fuso horário, que parecem não apenas um desperdício, mas também propensas a erros de codificação.
fonte
Apache Commons Lang
http://commons.apache.org/proper/commons-lang/javadocs/api-2.6/org/apache/commons/lang/time/DateUtils.html#isSameDay(java.util.Date , java.util.Date)
fonte
A maneira mais simples com o JodaTime
DateMidnight date = DateMidnight.now();
fonte
00:00:00.000
. Em vez disso, use o novowithTimeAtStartOfDay
método. Atualize para a versão atual 2.4 do Joda-Time e leia as notas de versão. Exemplo:DateTime today = DateTime.now( DateTimeZone.forID( "America/Montreal" ) ).withTimeAtStartOfDay();
Como um dia é
24 * 60 * 60 * 1000
ms, a meia-noite deste dia pode ser calculada como ...fonte
Praticamente como as respostas anteriores, mas ninguém mencionou o parâmetro AM_PM:
fonte
Calendar
classe problemática foi substituída anos atrás pelas classes java.time , especificamenteZonedDateTime
.fonte
Date
classe foi suplantada anos atrás porjava.time.Instant
. Evite usarDate
hoje em dia.Usando apache commons ..
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .Eu sei que este é um post muito antigo. Eu pensei em compartilhar meu conhecimento aqui!
Para a data de hoje à meia-noite com fuso horário exato, você pode usar os seguintes
Onde
(1000*60 * 330)
está sendo subtraído, isto é, realmente relacionado ao fuso horário, por exemplo, o fuso horário indiano, ou seja, o kolkata difere +5: 30hrs do real. Então, subtraindo isso com a conversão em milissegundos.Então mude o último número subtraído de acordo com você. Estou criando um produto, ou seja, apenas com base na Índia. Então, usei timestamp específico.
fonte
Mas cuidado que
java.sql.Date.toInstant()
sempre lançaUnsupportedOperationException
.Via LocalDate para java.util.Date e vice-versa, a conversão mais simples?
fonte
Do modo antigo..
fonte
Date
.Date
classe está sempre no UTC. Portanto, você está ignorando o problema do fuso horário desejado / esperado. Por exemplo, um novo dia amanhece em Calcutá, na Índia, muitas horas antes do UTC e horas depois do UTC em Montreal Quebec.