Je veux obtenir l'année, le mois, le jour, etc. à partir de la date Java pour comparer avec la date du calendrier grégorien à Java. Est-ce possible?

231

J'ai un objet Date en Java stocké en tant que type Date de Java.

J'ai également une date de création du calendrier grégorien. La date du calendrier grégorien n'a pas de paramètres et est donc une instance de la date (et de l'heure?) D'aujourd'hui.

Avec la date java, je veux pouvoir obtenir l'année, le mois, le jour, l'heure, la minute et les secondes du type de date java et comparer la date gregoriancalendar.

J'ai vu qu'au moment où la date Java est stockée en tant que longue et les seules méthodes disponibles semblent simplement écrire le long comme une chaîne de date formatée. Existe-t-il un moyen d'accéder à l'année, le mois, le jour, etc.?

Je vis que les getYear(), getMonth()etc. Les méthodes de Dateclasse ont été désapprouvés. Je me demandais quelle était la meilleure pratique pour utiliser l'instance Java Date que j'ai avec la GregorianCalendardate.

Mon objectif final est de faire un calcul de date afin que je puisse vérifier que la date Java se trouve dans autant d'heures, de minutes, etc. de la date et de l'heure d'aujourd'hui.

Je suis toujours un débutant à Java et cela me laisse un peu perplexe.

daveb
la source
1
Hé tout ce que vous utilisez n'utilisez pas Date.getYear(). Il souffre de problèmes (que je ne sais pas). Date.getYear()une fois analysé ma date 30/06/2017 et il est revenu mon année en tant que 117. Voyez où il a atterri, deux mille ans en arrière. Mais lorsque j'imprime simplement l'objet Date, la sortie était correcte, mais pas Date.getYear();.
Seenivasan
FYI: Vous utilisez d'anciennes classes de date-heure gênantes qui sont maintenant héritées, supplantées par les classes modernes de java.time.
Basil Bourque du

Réponses:

545

Utilisez quelque chose comme:

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.

Attention, les mois commencent à 0, pas à 1.

Edit : depuis Java 8, il est préférable d'utiliser java.time.LocalDate plutôt que java.util.Calendar . Voir cette réponse pour savoir comment le faire.

Florent Guillaume
la source
4
Vous pouvez utiliser cal.add(Calendar.DAY_OF_MONTH, -48)pour faire l'arithmétique du jour sur les objets Calendar. Et vous pouvez comparer deux objets Calendar à l'aide de cal.compareTo(anotherCal).
Florent Guillaume
1
Brillant, bravo Florent! Cela signifie-t-il que le calendrier renverra l'année et le jour mis à jour, les secondes, les minutes et les secondes lorsque les méthodes d'obtention du calendrier sont utilisées? Dave
daveb
11
Notez que le mois commence par 0 et non 1 (c'est-à-dire janvier = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Steve Kuo
10
Pourquoi JAVA est si gênant?
Kimchi Man,
3
Parce que la date et le calendrier sont anciens et mal conçus. Java 8 a de bien meilleurs objets données / temps, voir oracle.com/technetwork/articles/java/…
Florent Guillaume
88

Avec Java 8 et versions ultérieures, vous pouvez convertir l' objet Date en un objet LocalDate , puis obtenir facilement l'année, le mois et le jour.

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

Notez que getMonthValue()renvoie une valeur int de 1 à 12.

Ortomala Lokni
la source
10
Nous sommes maintenant en 2016, je crois que l'utilisation LocalDatede Java 8 est la meilleure solution qui vous fait gagner du temps, une autre solution utilisant Calendaret Dateest pleine de problèmes.
AnnieFromTaiwan
2
Excellente réponse - il est préférable d'utiliser java.time et d'éviter les anciennes classes de date et d'heure gênantes. Notez également comment cette réponse aborde judicieusement la question du fuseau horaire. Pour un moment donné, la date varie dans le monde entier par fuseau horaire.
Basil Bourque
1
Malheureusement niveau API 26+ pour Android.
Wiktor Kalinowski
14

Vous pourriez faire quelque chose comme ça, cela expliquera comment fonctionne la Dateclasse.

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
la source
Salut JavaCity, Merci pour cela. c'est très utile. En ce moment, j'essaie de ne pas analyser une chaîne de date. Je devrai cependant faire cette analyse plus tard lorsque j'obtiendrai aux utilisateurs de mon application de définir l'année, le jour et le mois. J'allais construire une chaîne à analyser dans SimpleDateFormat. Ce qui précède est très utile pour voir cela en action. Ma date Java a été créée comme une date et une heure à partir de son instanciation il y a un jour. Je cherche maintenant à comparer avec la date gregoriancalendar qui a été instanciée aujourd'hui. Sincères remerciements
daveb
8
Veuillez corriger le code ... les minuscules mmindiquent les minutes, les majuscules le MMmois de l'année.
YoYo
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: La sortie pour date= Fri Jun 15 09:20:21 CEST 2018est:

DAY FRIDAY
MONTH JUNE
YEAR 2018
Az.MaYo
la source
Si vous aviez mis au moins la sortie, les gens pourraient décider si cela pourrait leur être utile ou non sans avoir à exécuter le code.
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
la source
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
la source
1
Les réponses à Stack Overflow devraient avoir des discussions et des explications, pas seulement des extraits de code. Et votre code pourrait certainement utiliser une explication.
Basil Bourque
1
Pour info, les anciennes classes de date-heure terriblement gênantes telles que java.util.Date, java.util.Calendaret java.text.SimpleDateFormatsont désormais héritées , supplantées par les classes java.time intégrées à Java 8 et versions ultérieures. Voir Tutoriel par 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 (la solution de calendrier) est dix fois plus rapide. Maintenant, vous avez aaaa MM jj 00 00 00, puis comparez en utilisant date.compare

Tiina
la source
2

Ça pourrait être plus facile

     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
la source
-2

Montez soigneusement à partir de 0 et non 1. Et utilisez également le calendrier pm comme am afin d'être très prudent lorsque vous utilisez les heures et les minutes.

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
la source
1
Mieux vaut utiliser le java.time moderne qui supplante ces anciennes classes héritées gênantes présentées ici. Voir la bonne réponse
Basil Bourque
Merci pour la réponse et la suggestion. C'est bien mieux.
harun ugur