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


231

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

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

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

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

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

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

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


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, спасибо за это. это очень полезно В данный момент я пытаюсь уклониться от разбора строки даты. Однако мне потребуется выполнить этот анализ позже, когда я получу от пользователей моего приложения указание года, дня и месяца. Я собирался построить строку для анализа в 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

Если бы вы поместили хотя бы вывод, люди могли бы решить, может ли это быть полезным для них или нет, без необходимости запуска кода.
— 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);
}

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, которое вытеснит эти проблемные старые классы, показанные здесь. См. Правильный ответ
— Василий Бурк

Спасибо за ответ и предложение. Это очень лучше
— Харун Угур
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.