Eu tenho um objeto Java Date contendo informações de data e hora. Quero escrever um método que corte as informações de tempo, trunca as horas-minutos-segundos, de modo que só me resta a data.
Exemplo de entrada:
2008-01-01 13:15:00
Saída esperada:
2008-01-01 00:00:00
Você tem uma dica? Tentei fazer algo assim:
(timestamp / (24 * 60 * 60 * 1000)) * (24 * 60 * 60 * 1000)
mas tive problemas com o fuso horário.
java.util.Calendar
agora são legadas , suplantadas pelas classes java.time . Veja o Tutorial da Oracle .Você já olhou para o método de truncamento DateUtils no Apache Commons Lang?
irá remover o elemento de tempo.
fonte
Você olhou para Joda ? É uma maneira muito mais fácil e intuitiva de trabalhar com datas e horas. Por exemplo, você pode converter trivialmente entre (digamos) LocalDateTime e LOCALDATE objetos.
por exemplo (para ilustrar a API)
Além disso, ele resolve alguns problemas de segurança de thread com formatadores de data / hora e é altamente recomendado para trabalhar com quaisquer problemas de data / hora em Java.
fonte
Apenas uma atualização rápida à luz das classes java.time agora integradas ao Java 8 e posterior.
LocalDateTime
tem umtruncatedTo
método que aborda efetivamente o que você está falando aqui:Isso expressará o tempo atual em minutos apenas:
Você pode usar um
ChronoUnit
(ou aTemporalUnit
) menor que DAYS para executar o truncamento (já que o truncamento é aplicado apenas à parte da hora de LocalDateTime, não à parte da data).fonte
fonte
Com Joda você pode facilmente obter a data esperada.
A partir da versão 2.7 (talvez desde alguma versão anterior maior do que 2.2), como um comentador observa,
toDateMidnight
foi preterido em favor ou nomeado apropriadamentewithTimeAtStartOfDay()
, tornando o convenientepossível.
Benefício adicionado de uma API muito mais agradável.
Com versões mais antigas, você pode fazer
fonte
withTimeAtStartOfDay
.toLocalDate
para obter um objeto que nem mesmo tem um componente de tempo.Fiz o truncamento com a nova API java8. Eu me deparei com uma coisa estranha, mas em geral está truncada ...
fonte
Use DateUtils do Apache, com truncar, assim:
fonte
Para carimbos de data / hora:
fonte
De java.util.Date JavaDocs:
e de java.sql.Date JavaDocs:
Portanto, a melhor abordagem é usar java.sql.Date se você não precisar da parte do tempo
e a saída é:
fonte
tl; dr
Para gerar uma String no formato desejado, passe a
DateTimeFormatter
.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
.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.Se você não se importa com a hora do dia nem com o fuso horário, converta para a
LocalDate
.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 umLocalDate
objeto para chamar seuatStartOfDay
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.
UTC
Para ver aquele momento pelas lentes do fuso horário UTC , extraia um
Instant
objeto. Ambos,ZonedDateTime
eInstant
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.Vemos 5h da manhã em vez de meia-noite. No formato padrão,
Z
no final é a abreviação deZulu
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
, eSimpleDateFormat
.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?
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 .fonte
Use o método da classe Calendar
set()
para definir os camposHOUR_OF_DAY, MINUTE, SECOND
eMILLISECOND
como zero.fonte
A pergunta é contraditória. Ele pede uma data sem hora do dia, mas exibe um exemplo com a hora de
00:00:00
.Joda-Time
ATUALIZAÇÃO: O projeto Joda-Time agora está em modo de manutenção , com a equipe aconselhando a migração para as classes java.time . Veja minha outra resposta para solução java.time.
Se, em vez disso, você quiser que a hora do dia seja definida como o primeiro momento do dia, use um
DateTime
objeto da biblioteca Joda-Time e chame seuwithTimeAtStartOfDay
método. Esteja ciente de que o primeiro momento pode não ser00:00:00
devido ao horário de verão ou talvez outras anomalias.fonte
Apenas
clear()
campos redundantes.No Java 8, a melhor opção é usar o
truncatedTo
método deLocalDateTime
, por exemplo:fonte
calendar.clear(Calendar.HOUR_OF_DAY);
não limpa o horário. A solução da @cletus funciona bem.Realmente me aborreceu que o novo construtor de calendário "aprimorado" não demorasse milissegundos como o "horrível" antigo Construtor de data. Eu então fiquei muito irritado e escrevi isto:
Não usei a palavra "coisas" na época, mas aí descobri a felicidade disso:
Mas ainda estou muito irritado com isso.
fonte
Corrigi o problema assim (na zona oito oriental (horário de Pequim)):
Em primeiro lugar, você deve ter claro o que é carimbo de data / hora. O registro de data e hora corresponde ao total de milissegundos de 01 de janeiro às 00:00:00 1970 do GMT (igual ao UTC) ou Qui, 01 de janeiro às 08:00:00 CST 1970 até agora.
Lembre-se: o registro de data e hora independe do fuso horário.
Portanto, você obtém o mesmo resultado com a seguinte instrução em fusos horários diferentes:
E
imprime informações de horário diferentes em fusos horários diferentes: Se você definir o fuso horário do seu PC como UTC, você obterá
Mas se você definir o fuso horário como (UTC +8: 00) Pequim, Chongqing, HongKong, Urumq, obterá:
Java obtém o carimbo de data / hora e exibe informações de data e hora de acordo com o fuso horário.
Para a introdução de como o Java exibe informações de data e hora em diferentes fusos horários, é fácil trancar as informações de tempo. Você deve obter o carimbo de hora e levar em consideração o fuso horário ao cortar as informações de hora. Em seguida, você pode criar um novo objeto Date com o carimbo de data / hora de corte (podemos chamá-lo de carimbo de data), o java compensará o fuso horário quando exibir informações de data.
Como na zona oito oriental (horário de Pequim), o horário de Pequim é 8 horas anterior ao GMT, então você deve subtrair mais 8 horas ao fazer a operação do módulo. Ou seja, você deve obter o horário GMT primeiro, então o Java adicionará 8 horas ao exibir o tempo com base na configuração de fuso horário do seu PC.
A questão do fuso horário é obscura e também me intriga por muito tempo. Agora eu deixo isso claro. A esperança ajuda.
04/01/2018 O método abaixo também funciona.
}
fonte
Você pode fazer isso para evitar problemas de fuso horário:
Embora o
Date
objeto Java seja o valor do carimbo de data / hora, mas durante o truncamento, ele será convertido para o fuso horário local, portanto, você obterá um valor surpreendente se esperar um valor do fuso horário UTC.fonte
Calendar
e asDate
classes tornaram-se legados anos atrás com as classes java.time implementando JSR 310 no Java 8 e posterior. Sugerir seu uso em 2018 não é um bom conselho.Pode ser uma resposta tardia, mas aqui está uma maneira de fazer isso em uma linha sem usar nenhuma biblioteca:
fonte
Com Joda-Time desde a versão 2.0 você pode usar
LocalDate.toDate()
.Simplesmente
fonte
a Java Date object
assim que useijava.util.Date
. Além disso, não explica como seu fuso horário é problemático com java.util.Date (quando? Onde?), Embora ele não possa evitar outro que não sejaDate
.Para todas as respostas usando o Calendário, você deve usá-lo assim
Mas eu prefiro isso:
fonte
java.sql.Date
classe finge representar um valor apenas de data, mas na verdade tem um horário ajustado para o fuso horário UTC. Portanto, não é realmente uma solução adequada para a questão.Esta é uma maneira simples de obter a data sem hora se você estiver usando o Java 8+: Use o tipo java.time.LocalDate em vez de Date.
A saída:
https://docs.oracle.com/javase/8/docs/api/java/time/LocalDate.html
fonte
LocalDate
é uma boa ideia para a maioria dos propósitos, mas não está claro como isso funcionará com a entrada da pergunta2008-01-01 13:15:00
,.