Я хочу получить год, месяц, день и т. Д. Из даты Java, чтобы сравнить с датой григорианского календаря в Java. Это возможно?

231

У меня есть объект Date в Java, хранящийся как тип даты Java.

У меня также есть дата создания григорианского календаря. Дата григорианского календаря не имеет параметров и, следовательно, является экземпляром сегодняшней даты (и времени?).

С помощью даты Java, я хочу иметь возможность получить год, месяц, день, час, минуту и ​​секунды из типа даты Java и сравнить дату gregoriancalendar.

Я видел, что в настоящий момент дата Java хранится как long, и единственные доступные методы, кажется, просто записывают long как отформатированную строку даты. Есть ли способ получить год, месяц, день и т. Д.?

Я видел , что getYear(), getMonth()и т.д. методы Dateкласса устарели. Мне было интересно, как лучше использовать экземпляр даты Java, который у меня есть, с GregorianCalendarдатой.

Моя конечная цель - сделать расчет даты, чтобы я мог проверить, что дата Java находится в пределах стольких часов, минут и т. Д. От сегодняшней даты и времени.

Я все еще новичок в Java, и меня это немного озадачивает.

daveb
источник
1
Эй, все, что вы используете, не используйте. Date.getYear()Он страдает от проблем (что я не знаю). Date.getYear()однажды проанализировал мою дату 30/06/2017, и мой год вернулся как 117. Посмотрите, где он приземлился, две тысячи лет назад. Но когда я печатаю просто объект Date, вывод был в порядке Date.getYear();. Но нет .
Seenivasan
К вашему сведению: вы используете проблемные старые классы Date-time, которые теперь унаследованы, заменены современными классами java.time.
Василий Бурк

Ответы:

545

Используйте что-то вроде:

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.

Осторожно, месяцы начинаются с 0, а не с 1.

Редактировать : Начиная с Java 8 лучше использовать java.time.LocalDate, а не java.util.Calendar . Посмотрите этот ответ, чтобы узнать, как это сделать.

Флоран Гийом
источник
4
Вы можете использовать cal.add(Calendar.DAY_OF_MONTH, -48)дневную арифметику для объектов календаря. И вы можете сравнить два объекта календаря, используя cal.compareTo(anotherCal).
Флоран Гийом
1
Молодец, ура Флоран! Означает ли вышесказанное, что Каландр будет возвращать обновленные год и день, секунды, минуты и секунды при использовании методов получения каландра? Дейв
Дэйвв
11
Обратите внимание, что месяц начинается с 0, а не с 1 (т. Е. Январь = 0). docs.oracle.com/javase/6/docs/api/java/util/Calendar.html#MONTH
Стив Куо,
10
Почему JAVA так неудобно?
Кимчи Мэн
3
Потому что Дата и Календарь старые и плохо оформленные. В Java 8 гораздо лучше объекты данных / времени, см. Oracle.com/technetwork/articles/java/…
Флорент Гийом,
88

В Java 8 и более поздних версиях вы можете преобразовать объект Date в объект LocalDate, а затем легко получить год, месяц и день.

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

Обратите внимание, что getMonthValue()возвращает значение int от 1 до 12.

Ортомала Локни
источник
10
Сейчас 2016 год, и я считаю, что использование LocalDateJava 8 - это лучшее решение, которое экономит ваше время, другое решение использует Calendarи Dateполон хлопот.
AnnieFromTaiwan
2
Отличный ответ - определенно лучше использовать java.time и избегать хлопотных старых классов даты и времени. Также обратите внимание, как этот Ответ мудро решает проблему часового пояса. В любой момент времени дата меняется по всему земному шару в зависимости от часового пояса.
Василий Бурк
1
К сожалению, уровень API 26+ для Android.
Виктор Калиновский
14

Вы можете сделать что-то вроде этого, это объяснит, как Dateработает класс.

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
источник
Привет JavaCity, спасибо за это. это очень полезно В данный момент я пытаюсь уклониться от разбора строки даты. Однако мне потребуется выполнить этот анализ позже, когда я получу от пользователей моего приложения указание года, дня и месяца. Я собирался построить строку для анализа в SimpleDateFormat. Выше очень полезно увидеть это в действии. Моя дата Java была создана как дата и время от ее создания день назад. Сейчас я хочу сравнить с датой gregoriancalendar, которая была создана сегодня. Искреннее спасибо
daveb
8
Пожалуйста, исправьте код ... строчные mm обозначает минуты, верхний регистр MMобозначает месяц года.
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());

РЕДАКТИРОВАТЬ: выход для date= Fri Jun 15 09:20:21 CEST 2018:

DAY FRIDAY
MONTH JUNE
YEAR 2018
Az.MaYo
источник
Если бы вы поместили хотя бы вывод, люди могли бы решить, может ли это быть полезным для них или нет, без необходимости запуска кода.
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
источник
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!";
 }
раби
источник
1
Ожидается, что ответы на переполнение стека будут иметь некоторое обсуждение и объяснение, а не только фрагменты кода. И ваш код может определенно использовать некоторые объяснения.
Василий Бурк
1
К вашему сведению, ужасно неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendarи java.text.SimpleDateFormatтеперь унаследованные , вытеснены классами java.time, встроенными в Java 8 и более поздние версии . Смотрите Учебник по Oracle .
Василий Бурк
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 (календарное решение) работает в десять раз быстрее. Теперь у вас есть гггг ММ дд 00 00 00, а затем сравните с помощью date.compare

Тийна
источник
2

Может быть проще

     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);
Абдур Рахман
источник
-2

Будьте осторожны, начните с 0, а не с 1. Также используйте календарь в формате pm как am, поэтому будьте внимательны при использовании часов и минут.

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

Харун Угур
источник
1
Лучше использовать современное java.time, которое вытеснит эти проблемные старые классы, показанные здесь. См. Правильный ответ
Василий Бурк
Спасибо за ответ и предложение. Это очень лучше
Харун Угур