Eu venho do mundo C #, então ainda não tenho muita experiência com Java. Foi-me dito pelo Eclipse que Date
foi preterido:
Person p = new Person();
p.setDateOfBirth(new Date(1985, 1, 1));
Por quê? E o que (especialmente nos casos como acima) deve ser usado?
java
date
deprecated
Svish
fonte
fonte
Respostas:
O
Date
construtor específico está obsoleto eCalendar
deve ser usado. A DataJavaDoc
for descreve quais construtores foram descontinuados e como substituí-los usando a .Calendar
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 .A
java.util.Date
classe não é realmente obsoleta, apenas esse construtor, juntamente com alguns outros construtores / métodos, está obsoleto. Foi preterido porque esse tipo de uso não funciona bem com a internacionalização. ACalendar
classe deve ser usada:Dê uma olhada na data Javadoc:
http://download.oracle.com/javase/6/docs/api/java/util/Date.html
fonte
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone(<timezone id>));
java.time.*
classes são a melhor opção ... se você estiver alterando seu código.tl; dr
…ou…
Detalhes
Os
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
as aulas foram correu muito rapidamente quando o Java primeiro lançado e evoluído. As aulas não foram bem projetadas ou implementadas. Melhorias foram tentadas, portanto, as reprovações que você encontrou. Infelizmente, as tentativas de melhoria falharam amplamente. Você deve evitar essas classes completamente. Eles são suplantados no Java 8 por novas classes.Problemas no seu código
Um java.util.Date possui uma parte de data e hora. Você ignorou a parte do tempo no seu código. Portanto, a classe Date pegará o início do dia conforme definido pelo fuso horário padrão da sua JVM e aplicará esse horário ao objeto Date. Portanto, os resultados do seu código variam dependendo de qual máquina ele é executado ou de qual fuso horário está definido. Provavelmente não é o que você quer.
Se você deseja apenas a data, sem a parte da hora, como para uma data de nascimento, talvez não queira usar um
Date
objeto. Convém armazenar apenas uma sequência da data, no formato ISO 8601 deYYYY-MM-DD
. Ou usar umLocalDate
objeto a partir de Joda-Time (veja abaixo).Joda-Time
Primeira coisa a aprender em Java: Evite as classes notoriamente problemáticas java.util.Date e java.util.Calendar incluídas no Java.
Conforme observado corretamente na resposta do usuário3277382 , use o Joda-Time ou o novo pacote java.time. * No Java 8.
Exemplo de código no Joda-Time 2.3
Despejar no console…
Quando correr ...
java.time
Nesse caso, o código para java.time é quase idêntico ao do Joda-Time .
Obtemos um fuso horário (
ZoneId
) e construímos um objeto de data e hora atribuído a esse fuso horário (ZonedDateTime
). Em seguida, usando o padrão Objetos imutáveis , criamos novas datas e horários com base no mesmo instante do objeto antigo (contagem de nanossegundos desde a época ), mas atribuímos outro fuso horário. Por fim, obtemos umLocalDate
que não possui hora do dia nem fuso horário, embora observe que o fuso horário se aplica ao determinar essa data (um novo dia começa mais cedo em Oslo do que em Nova York, por exemplo).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 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
Uma razão pela qual o construtor foi descontinuado é que o significado do parâmetro year não é o que você esperaria. O javadoc diz:
Observe que o campo ano é o número de anos desde
1900
então, portanto, seu código de amostra provavelmente não fará o que você espera. E esse é o ponto.Em geral, a
Date
API suporta apenas o calendário ocidental moderno, possui componentes especificados idiossincraticamente e se comporta de forma inconsistente se você definir campos.As APIs
Calendar
eGregorianCalendar
são melhores queDate
, e as APIs de tempo de Joda de terceiros geralmente eram consideradas as melhores. No Java 8, eles introduziram osjava.time
pacotes, e agora são a alternativa recomendada.fonte
Me deparei com essa pergunta como uma duplicata de uma pergunta mais recente, que perguntava qual era a maneira não obsoleta de obter um
Date
ano, mês e dia específicos.As respostas aqui até agora dizem usar a
Calendar
classe, e isso foi verdade até o lançamento do Java 8. Mas a partir do Java 8, a maneira padrão de fazer isso é:E então, se você realmente precisa de um
java.util.Date
, pode usar as sugestões nesta pergunta .Para obter mais informações, consulte a API ou os tutoriais para Java 8.
fonte
Observe que
Calendar.getTime()
não é determinístico no sentido de que a parte da hora do dia é padronizada com a hora atual.Para reproduzir, tente executar o seguinte código algumas vezes:
Saída por exemplo:
A execução exata do mesmo código, alguns minutos depois, produz:
Portanto, enquanto
set()
força os campos correspondentes a corrigir valores, ele perde tempo do sistema para os outros campos. (Testado acima com o Sun jdk6 e jdk7)fonte
Date
em si não é preterido. São apenas muitos dos seus métodos. Veja aqui para detalhes .Use em
java.util.Calendar
vez disso.fonte
Atualmente, a maioria dos desenvolvedores Java usa o pacote de terceiros Joda-Time . É amplamente considerado como uma implementação muito melhor.
O Java 8, no entanto, terá um novo pacote java.time. * . Consulte este artigo, Apresentando a nova API de data e hora para o JDK 8 .
fonte
Como o construtor Date está obsoleto, você pode tentar este código.
fonte
Date
eCalendar
em 2019 são maus conselhos.Semelhante ao que binnyb sugeriu, você pode considerar o uso do método mais recente Calendário> GregorianCalendar. Veja estes documentos mais recentes:
http://download.oracle.com/javase/6/docs/api/java/util/GregorianCalendar.html
fonte
Você pode criar um método como
new Date(year,month,date)
no seu código usando aCalendar
classeFuncionará exatamente como o construtor obsoleto de
Date
fonte
Instant
eZonedDateTime
.O construtor Date espera anos no formato de anos desde 1900, meses com base em zero, dias com base em um e define horas / minutos / segundos / milissegundos para zero.
Portanto, usando a substituição do Calendário (anos com base em zero, meses com base em zero, dias com base em um) para o construtor Data obsoleto, precisamos de algo como:
Ou usando o Java 1.8 (que tem ano e zero e meses e dias com base em um):
Aqui estão as versões iguais de Data, Calendário e Java 1.8:
fonte
(a maneira pré-Java-8)
fonte