Continuando do Stack Overflow, pergunte ao programa Java para obter a data atual sem registro de data e hora :
Qual é a maneira mais eficiente de obter um objeto Date sem o horário? Existe alguma outra maneira além dessas duas?
// Method 1
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
Date dateWithoutTime = sdf.parse(sdf.format(new Date()));
// Method 2
Calendar cal = Calendar.getInstance();
cal.set(Calendar.HOUR_OF_DAY, 0);
cal.set(Calendar.MINUTE, 0);
cal.set(Calendar.SECOND, 0);
cal.set(Calendar.MILLISECOND, 0);
dateWithoutTime = cal.getTime();
Atualização :
Eu sabia sobre Joda-Time ; Estou apenas tentando evitar uma biblioteca adicional para uma tarefa tão simples (eu acho). Mas, com base nas respostas até agora, o Joda-Time parece extremamente popular, então eu posso considerar isso.
Por eficiente , quero dizer que quero evitar a
String
criação temporária de objetos conforme usadamethod 1
, enquanto issomethod 2
parece um hack em vez de uma solução.
Respostas:
Você absolutamente tem que usar
java.util.Date
? Eu recomendaria completamente que você usasse o Joda Time ou ojava.time
pacote do Java 8. Em particular, enquanto Data e Calendário sempre representam um instante específico no tempo, sem nenhum conceito como "apenas uma data", o Tempo de Joda não ter um tipo que representa este (LocalDate
). Seu código será muito mais claro se você puder usar tipos que representam o que você realmente está tentando fazer.Existem muitos outros motivos para usar o Joda Time ou em
java.time
vez dosjava.util
tipos internos - eles geralmente são APIs muito melhores. Você sempre pode converter de / para ajava.util.Date
nos limites do seu próprio código, se necessário, por exemplo, para interação com o banco de dados.fonte
Date
objeto - essa resposta formata uma data em uma string, o que não é a mesma coisa. Fundamentalmente, perguntar em que dataDate
é uma pergunta sem sentido sem mais informações: o fuso horário e o sistema de calendário que você está usando.Aqui está o que eu usei para obter a data de hoje com o horário definido para
00:00:00
:fonte
Você pode usar o DateUtils.truncate da biblioteca Apache Commons.
Exemplo:
fonte
Sim existe.
java.time
O Java 8 e posterior vem com o novo pacote java.time embutido. Veja o tutorial . Grande parte da funcionalidade java.time é portada para Java 6 e 7 no ThreeTen-Backport e adaptada ainda mais ao Android no ThreeTenABP .
Semelhante ao Joda-Time , o java.time oferece uma
LocalDate
classe para representar um valor somente de data, sem hora do dia e sem fuso horário.Observe que o fuso horário é crítico para determinar uma data específica. No início da meia-noite em Paris, por exemplo, a data ainda é "ontem" em Montreal.
Por padrão, java.time usa o padrão ISO 8601 na geração de uma representação de string de um valor de data ou data / hora. (Outra semelhança com Joda-Time.) Então, basta ligar
toString()
para gerar texto como2015-05-21
.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 .
Onde obter as classes java.time?
O projeto ThreeTen-Extra estende o 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
TimeZone.setDefault
durante o tempo de execução e afetar imediatamente todos os outros códigos em execução nessa JVM. Moral da história: sempre especifique um fuso horário.A maneira mais direta:
fonte
long dateOnly = (currentTime / millisInDay) * millisInDay;
a mesma coisa que escreverlong dateOnly = currentTime;
?A resposta padrão para essas perguntas é usar o Joda Time . A API é melhor e, se você estiver usando os formatadores e analisadores, poderá evitar a falta não intuitiva de segurança de threads
SimpleDateFormat
.Usar o Joda significa que você pode simplesmente:
Update :: Usando o java 8, isso pode ser obtido usando
fonte
LocalDate
classe semelhante ao Joda-Time.DateTimeZone
para esse construtor LocalDate. A determinação da data atual depende do fuso horário, pois Paris inicia uma nova data antes de Montreal. Se você omitir o fuso horário, o fuso horário padrão da sua JVM será aplicado. Geralmente é melhor especificar do que confiar no padrão.Esta é uma maneira simples de fazer isso:
fonte
Não faz sentido falar sobre uma data sem um carimbo de data / hora no que diz respeito às rotinas de Data no tempo de execução java padrão, pois ele é essencialmente mapeado para um milissegundo específico e não para uma data. Esse milissegundo intrinsecamente possui uma hora do dia anexada, o que a torna vulnerável a problemas de fuso horário, como o horário de verão e outros ajustes do calendário. Veja Por que subtrair essas duas vezes (em 1927) está dando um resultado estranho? para um exemplo interessante.
Se você quiser trabalhar com datas em vez de milissegundos, precisará usar outra coisa. Para o Java 8, há um novo conjunto de métodos que fornece exatamente o que você solicita. Para Java 7 e versões anteriores, use http://www.joda.org/joda-time/
fonte
Definitivamente, não é a maneira mais correta, mas se você precisar de uma solução rápida para obter a data sem o horário e não desejar usar uma biblioteca de terceiros, isso deve fazer
Eu só precisava da data para fins visuais e não podia Joda, então fiz uma substring.
fonte
fonte
Bem, até onde eu sei, não há maneira mais fácil de conseguir isso se você usar apenas o JDK padrão.
Obviamente, você pode colocar essa lógica no método2 em uma função estática em uma classe auxiliar, como feito aqui no método toBeginningOfTheDay
Em seguida, você pode reduzir o segundo método para:
Ou, se você realmente precisa do dia atual nesse formato com tanta frequência, basta envolvê-lo em outro método auxiliar estático, tornando-o uma linha única.
fonte
Se tudo o que você deseja é ver a data como "AAAA-MM-DD" sem toda a confusão, por exemplo "Qui 21 de maio às 12:08:18 EDT 2015", basta usar
java.sql.Date
. Este exemplo obtém a data atual:Também
java.sql.Date
é uma subclasse dejava.util.Date
.fonte
Se você só precisa da data atual, sem hora, outra opção é:
fonte
00:00:00
normalmente essa hora (pode variar de fuso horário para anomalias como o horário de verão ). Portanto, como outras respostas observam, aLocalDate
classe é mais apropriada, do Joda-Time (supondo que você esteja fazendo referência ao Joda-Time - o que você deve observar explicitamente ao citar classes que não estão incluídas no Java).Use
LocalDate.now()
e converta emDate
como abaixo:fonte
TimeZone.setDefault
. Seu código está chamandoZoneId.systemDefault
duas vezes, o primeiro está implícitoLocalDate.now()
e o segundo é explícito comatStartOfDay
. Entre esses dois momentos em tempo de execução, a zona padrão atual pode mudar. Sugiro capturar a zona em uma variável e passar para os dois métodos.Se você precisar da parte da data apenas para fins de eco,
fonte
Que tal isso?
fonte
Confira Veyder-time . É uma alternativa simples e eficiente ao java.util e ao Joda-time. Possui uma API intuitiva e classes que representam datas sozinhas, sem registro de data e hora.
fonte
A maneira mais direta e direta que faz uso total do enorme TimeZone Database of Java e está correta:
fonte
Aqui está uma solução limpa, sem conversão para string e vice-versa, e também não recalcula o tempo várias vezes quando você redefine cada componente do tempo para zero. Também usa
%
(módulo) em vez de dividir seguido de multiplicar para evitar a operação dupla.Ele não requer dependências de terceiros e respeita o fuso horário do objeto Calender transferido. Essa função retorna o momento às 12h no fuso horário da data (calendário) em que você passou.
fonte
Prefira não usar bibliotecas de terceiros o máximo possível. Eu sei que essa maneira é mencionada antes, mas aqui está uma boa maneira limpa:
Bem, não usar GregorianCalendar é talvez uma opção!
fonte
Acabei de fazer isso no meu aplicativo:
API Android nível 1, sem biblioteca externa. Ele respeita a luz do dia e o fuso horário padrão. Sem manipulação de String, então acho que dessa maneira é mais eficiente da CPU que o seu, mas não fiz nenhum teste.
fonte
Você pode usar o tempo de joda.
e você liga com:
fonte