Quero obter Ano, Mês, Dia, etc. da Data Java para comparar com a data do Calendário Gregoriano em Java. Isso é possível?

231

Eu tenho um objeto Date em Java armazenado como o tipo Date do Java.

Eu também tenho uma data de criação do calendário gregoriano. A data do calendário gregoriano não possui parâmetros e, portanto, é uma instância da data de hoje (e da hora?).

Com a data do java, desejo obter o ano, mês, dia, hora, minuto e segundos do tipo de data do java e comparar a data do calendário gregoriano.

Vi que no momento a data do Java é armazenada como longa e os únicos métodos disponíveis parecem apenas escrever a longa como uma string de data formatada. Existe uma maneira de acessar Ano, mês, dia, etc?

Vi que os getYear(), getMonth()métodos, etc. para Dateclasse foram reprovados. Eu queria saber qual é a melhor prática para usar a instância do Java Date que tenho com a GregorianCalendardata.

Meu objetivo final é fazer um cálculo de data para que eu possa verificar se a data do Java está dentro de tantas horas, minutos etc. da data e hora de hoje.

Eu ainda sou um novato em Java e estou ficando um pouco intrigado com isso.

daveb
fonte
1
Ei, o que quer que você use, não use Date.getYear(). Sofre de problemas (que eu não sei). Date.getYear()uma vez analisou minha data em 30/06/2017 e retornou meu ano como 117. Veja onde aterrou, dois mil anos atrás. Mas quando imprimo simplesmente o Objeto de Data, a Saída estava Bem Date.getYear();.
precisa
FYI: Você está usando classes antigas problemáticas de Data e hora que agora são herdadas, substituídas pelas modernas classes java.time.
Basil Bourque 25/10

Respostas:

545

Use algo como:

Date date; // your date
// Choose time zone in which you want to interpret your Date
Calendar cal = Calendar.getInstance(TimeZone.getTimeZone("Europe/Paris"));
cal.setTime(date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MONTH);
int day = cal.get(Calendar.DAY_OF_MONTH);
// etc.

Cuidado, meses começam em 0, não 1.

Edit : Desde o Java 8, é melhor usar java.time.LocalDate em vez de java.util.Calendar . Veja esta resposta para saber como fazê-lo.

Florent Guillaume
fonte
4
Você pode usar cal.add(Calendar.DAY_OF_MONTH, -48)aritmética diurna em objetos do Calendário. E você pode comparar dois objetos de calendário usando cal.compareTo(anotherCal).
Florent Guillaume
1
Brilhante, felicidades Florent! Isso significa que o Calendário retornará atualizado ano e dia, segundos, minutos e segundos quando os métodos de obtenção do calendário são usados? Dave
daveb 28/02
11
Observe que o mês começa com 0 e não 1 (ou seja, janeiro = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo
10
Por que JAVA é tão inconveniente?
Kimchi Man
3
Porque Data e calendário são antigos e mal projetados. Java 8 tem muito melhores dados / objetos tempo, ver oracle.com/technetwork/articles/java/...
Florent Guillaume
88

Com o Java 8 e posterior, você pode converter o objeto Date em um objeto LocalDate e obter facilmente o ano, mês e dia.

Date date = new Date();
LocalDate localDate = date.toInstant().atZone(ZoneId.systemDefault()).toLocalDate();
int year  = localDate.getYear();
int month = localDate.getMonthValue();
int day   = localDate.getDayOfMonth();

Observe que getMonthValue()retorna um valor int de 1 a 12.

Ortomala Lokni
fonte
10
Agora, em 2016, acredito que usar o LocalDateJava 8 é a melhor solução que economiza seu tempo, outra solução que utiliza Calendare Dateestá cheia de problemas.
AnnieFromTaiwan
2
Ótima resposta - definitivamente é melhor usar o java.time e evitar as classes antigas de data e hora problemáticas. Observe também como esta resposta aborda sabiamente o problema do fuso horário. Por um determinado momento, a data varia em todo o mundo por fuso horário.
Basil Bourque
1
Infelizmente, nível API 26+ para android.
Wiktor Kalinowski
14

Você pode fazer algo assim, isso explicará como a Dateclasse funciona.

String currentDateString = "02/27/2012 17:00:00";
SimpleDateFormat sd = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");
Date currentDate = sd.parse(currentDateString);

String yourDateString = "02/28/2012 15:00:00";
SimpleDateFormat yourDateFormat = new SimpleDateFormat("MM/dd/yyyy HH:mm:ss");

Date yourDate = yourDateFormat.parse(yourDateString);

if (yourDate.after(currentDate)) {
    System.out.println("After");
} else if(yourDate.equals(currentDate)) {
    System.out.println("Same");
} else {
    System.out.println("Before");
}
javaCity
fonte
Oi JavaCity, Obrigado por isso. isso é muito útil No momento, estou tentando evitar a análise de uma string de data. No entanto, precisarei fazer essa análise mais tarde, quando conseguir que os usuários do meu aplicativo definam ano, dia e mês. Eu estava indo para construir uma seqüência de caracteres para analisar SimpleDateFormat. O acima é muito útil para ver isso em ação. Minha data Java foi criada como uma data e hora a partir da instanciação de um dia atrás. Agora, estou procurando comparar com a data do calendário gregoriano que foi instanciada hoje. Obrigado sincero
daveb
8
Corrija o código ... letras minúsculas mmindicam minutos, letras maiúsculas MMsignifica mês do ano.
YoYo 17/05
12
    Date date = new Date();

    SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEEE");

    System.out.println("DAY "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("MMMM");
    System.out.println("MONTH "+simpleDateFormat.format(date).toUpperCase());

    simpleDateFormat = new SimpleDateFormat("YYYY");
    System.out.println("YEAR "+simpleDateFormat.format(date).toUpperCase());

EDIT: A saída para date= Fri Jun 15 09:20:21 CEST 2018é:

DAY FRIDAY
MONTH JUNE
YEAR 2018
Az.MaYo
fonte
Se você tivesse colocado pelo menos a saída, as pessoas poderiam decidir se isso seria útil ou não, sem a necessidade de executar o código.
SantiBailors
6
private boolean isSameDay(Date date1, Date date2) {
    Calendar calendar1 = Calendar.getInstance();
    calendar1.setTime(date1);
    Calendar calendar2 = Calendar.getInstance();
    calendar2.setTime(date2);
    boolean sameYear = calendar1.get(Calendar.YEAR) == calendar2.get(Calendar.YEAR);
    boolean sameMonth = calendar1.get(Calendar.MONTH) == calendar2.get(Calendar.MONTH);
    boolean sameDay = calendar1.get(Calendar.DAY_OF_MONTH) == calendar2.get(Calendar.DAY_OF_MONTH);
    return (sameDay && sameMonth && sameYear);
}
evya
fonte
3
    Date queueDate = new SimpleDateFormat("yyyy-MM-dd").parse(inputDtStr);
    Calendar queueDateCal = Calendar.getInstance();
    queueDateCal.setTime(queueDate);
    if(queueDateCal.get(Calendar.DAY_OF_YEAR)==Calendar.getInstance().get(Calendar.DAY_OF_YEAR))
{
    "same day of the year!";
 }
rabi
fonte
1
Espera-se que as respostas no Stack Overflow tenham alguma discussão e explicação, não apenas trechos de código. E seu código definitivamente poderia usar alguma explicação.
Basil Bourque
1
FYI, o terrivelmente problemáticas aulas em tempo data antigas, tais como java.util.Date, java.util.Calendare java.text.SimpleDateFormatestão agora legado , suplantado pelos java.time classes internas em Java 8 e posterior. Consulte o Tutorial da Oracle .
Basil Bourque
2
@Test
public void testDate() throws ParseException {
    long start = System.currentTimeMillis();
    long round = 100000l;
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay(new Date());
    }
    long mid = System.currentTimeMillis();
    for (int i = 0; i < round; i++) {
        StringUtil.getYearMonthDay2(new Date());
    }
    long end = System.currentTimeMillis();
    System.out.println(mid - start);
    System.out.println(end - mid);
}

public static Date getYearMonthDay(Date date) throws ParseException {
    SimpleDateFormat f = new SimpleDateFormat("yyyyyMMdd");
    String dateStr = f.format(date);
    return f.parse(dateStr);
}

public static Date getYearMonthDay2(Date date) throws ParseException {
    Calendar c = Calendar.getInstance();
    c.setTime(date);
    c.set(Calendar.SECOND, 0);
    c.set(Calendar.MINUTE, 0);
    c.set(Calendar.HOUR_OF_DAY, 0);
    return c.getTime();
}
public static int compare(Date today, Date future, Date past) {
    Date today1 = StringUtil.getYearMonthDay2(today);
    Date future1 = StringUtil.getYearMonthDay2(future);
    Date past1 = StringUtil.getYearMonthDay2(past);
    return today.compare // or today.after or today.before
}

getYearMonthDay2 (a solução do calendário) é dez vezes mais rápido. Agora você tem o MM dd 00 00 00 e, em seguida, compare usando date.compare

Tiina
fonte
2

Pode ser mais fácil

     Date date1 = new Date("31-May-2017");
OR
    java.sql.Date date1 = new java.sql.Date((new Date()).getTime());

    SimpleDateFormat formatNowDay = new SimpleDateFormat("dd");
    SimpleDateFormat formatNowMonth = new SimpleDateFormat("MM");
    SimpleDateFormat formatNowYear = new SimpleDateFormat("YYYY");

    String currentDay = formatNowDay.format(date1);
    String currentMonth = formatNowMonth.format(date1);
    String currentYear = formatNowYear.format(date1);
Abdur Rahman
fonte
-2

Monte cuidadosamente o início de 0 a 1. E também o Calendário use pm como am, de modo que seja muito cuidadoso ao usar Horas e minutos.

Date your_date;
Calendar cal = Calendar.getInstance(); 
cal.setTime(your_date);
int year = cal.get(Calendar.YEAR);
int month = cal.get(Calendar.MINUTE);

harun ugur
fonte
1
Melhor usar o java.time moderno que suplanta essas classes antigas problemáticas mostradas aqui. Veja a resposta correta
Basil Bourque
Obrigado pela resposta e sugestão. É muito melhor
Harun ugur