Estou tentando comparar uma data em formato de string com a data atual. É assim que eu fiz (não testei, mas deve funcionar), mas estou usando métodos obsoletos. Alguma boa sugestão de alternativa? Obrigado.
PS: Eu realmente odeio fazer coisas de Date em Java. Existem tantas maneiras de fazer a mesma coisa, que você realmente não tem certeza de qual é a correta, daí a minha pergunta aqui.
String valid_until = "1/1/1990";
Calendar cal = Calendar.getInstance();
SimpleDateFormat sdf = new SimpleDateFormat("dd/mm/yyyy");
Date strDate = sdf.parse(valid_until);
int year = strDate.getYear(); // this is deprecated
int month = strDate.getMonth() // this is deprecated
int day = strDate.getDay(); // this is deprecated
Calendar validDate = Calendar.getInstance();
validDate.set(year, month, day);
Calendar currentDate = Calendar.getInstance();
if (currentDate.after(validDate)) {
catalog_outdated = 1;
}
Calendar
,SimpleDateFormat
,Date
ou qualquer um dos outros longas desatualizados data e hora Java classes. Em vez dissojava.time
, use a moderna API Java de data e hora . Sim, você pode usá-lo no Android. Para Android mais antigo, consulte Como usar o ThreeTenABP no projeto Android .Respostas:
Seu código pode ser reduzido a
ou
fonte
Você pode usar compareTo ()
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado, suplantado pelos java.time classes. A maior parte da funcionalidade java.time é portada para Java 6 e Java 7 no projeto ThreeTen-Backport . Adaptado para Android anterior (<26) em ThreeTenABP . Consulte Como usar o ThreeTenABP… .Você pode criar diretamente a
Calendar
partir deDate
:fonte
Observe que o formato correto é ("dd / MM / aaaa") antes de o código funcionar. "mm" significa minutos!
fonte
fonte
java.util.Date
,java.util.Calendar
ejava.text.SimpleDateFormat
estão agora legado, suplantado pelos java.time classes. A maior parte da funcionalidade java.time é portada para Java 6 e Java 7 no projeto ThreeTen-Backport . Adaptado para Android anterior (<26) em ThreeTenABP . Consulte Como usar o ThreeTenABP… .retorna true .. e você também pode verificar antes e igual com a ajuda de date.before e date.equal ..
fonte
Compara a hora representada por este calendário com a representada pelo calendário fornecido.
Retorna 0 se os horários dos dois Calendários forem iguais, -1 se o horário deste Calendário for anterior ao outro, 1 se o horário deste Calendário for posterior ao outro.
fonte
converta a data em Calendário e faça seus cálculos lá. :)
Ou:
fonte
É hora da resposta moderna.
java.time e ThreeTenABP
Quando executei este código agora, o resultado foi:
Como nunca é a mesma data em todos os fusos horários, forneça um fuso horário explícito a
LocalDate.now
. Se você deseja que o catálogo expire ao mesmo tempo em todos os fusos horários, você pode fornecerZoneOffset.UTC
, desde que informe aos usuários que está usando UTC.Estou usando java.time, a API moderna de data e hora do Java. As classes de data e hora que você usou
Calendar
,SimpleDateFormat
eDate
, são todas mal projetadas e, felizmente, há muito desatualizadas. Além disso, apesar do nome, aDate
não representa uma data, mas um ponto no tempo. Uma consequência disso é: embora hoje seja 15 de fevereiro de 2019, umDate
objeto recém-criado já está após (não é igual a) umDate
objeto da análise15/02/2019
. Isso confunde alguns. Ao contrário disso, o modernoLocalDate
é uma data sem hora do dia (e sem fuso horário), então doisLocalDate
s representando a data de hoje sempre serão iguais.Pergunta: Posso usar java.time no Android?
Sim, java.time funciona bem em dispositivos Android mais antigos e mais recentes. Requer apenas pelo menos Java 6 .
org.threeten.bp
com subpacotes.Links
java.time
foi descrito pela primeira vez.java.time
para Java 6 e 7 (ThreeTen para JSR-310).fonte
Você poderia tentar isso
e você pode usar
today.getTime()
para recuperar o valor e comparar.fonte
Às vezes, precisamos fazer uma lista com datas, como
hoje com hora
ontem com ontem
outros dias com 23/06/2017
Para fazer isso, precisamos comparar a hora atual com nossos dados.
Além disso, você pode verificar este exemplo no GitHub e neste post .
fonte
Atualização: A biblioteca Joda-Time agora está em modo de manutenção e recomenda migrar para a estrutura java.time que a sucede. Veja a resposta de Ole VV .
Joda-Time
As classes java.util.Date e .Calendar são notoriamente problemáticas. Evite-os. Use o Joda-Time ou o novo pacote java.time no Java 8.
LocalDate
Se você quiser apenas data sem hora do dia, use a classe LocalDate.
Fuso horário
Obter a data atual depende do fuso horário. Um novo encontro rola em Paris antes de Montreal. Especifique o fuso horário desejado em vez de depender do padrão da JVM.
Exemplo em Joda-Time 2.3.
fonte
Você pode usar validDate.setTime (strDate) Dê uma olhada no javadoc em http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Calendar.html
fonte
fonte
Em Kotlin, você pode comparar facilmente datas com operadores de comparação. Porque Kotlin já suporta sobrecarga de operadores. Então, para comparar objetos de data:
e se estiver usando objetos de calendário, você pode comparar facilmente assim:
fonte