Как получить последний месяц/год в java?

Как узнать последний месяц и его год в Java?

например Если сегодня 10 октября 2012 г., результат должен быть Month = 9 и Year = 2012. Если сегодня 10 января 2013 г., результат должен быть Month = 12 и Year = 2012.


person ashishjmeshram    schedule 10.10.2012    source источник
comment
Посмотрите документацию API java.util.Calendar. Или упростите себе жизнь с помощью Joda Time.   -  person Jesper    schedule 10.10.2012
comment
При использовании java.util.Calendar будьте осторожны с идентификаторами месяцев. Январь - ноль, а не единица.   -  person Tinman    schedule 10.10.2012
comment
См. этот пример: java-examples. ком/   -  person Nirav Ranpara    schedule 10.10.2012
comment
Джеспер и Тинман, я рекомендую вам не использовать Calendar. Этот класс плохо спроектирован и давно устарел. Вместо этого используйте YearMonth или LocalDate из java.time, современного API даты и времени Java. .   -  person Ole V.V.    schedule 02.03.2019


Ответы (9)


Ваше решение здесь, но вместо добавления вам нужно использовать вычитание

c.add(Calendar.MONTH, -1);

Затем вы можете вызвать getter на Calendar для получения правильных полей

int month = c.get(Calendar.MONTH) + 1; // beware of month indexing from zero
int year  = c.get(Calendar.YEAR);
person Gaim    schedule 10.10.2012

Java.время

Использование java.time framework, встроенного в Java 8:

import java.time.LocalDate;

LocalDate now = LocalDate.now(); // 2015-11-24
LocalDate earlier = now.minusMonths(1); // 2015-10-24

earlier.getMonth(); // java.time.Month = OCTOBER
earlier.getMonth.getValue(); // 10
earlier.getYear(); // 2015
person Przemek    schedule 24.11.2015

Используйте библиотеку времени Joda. С ним очень легко обрабатывать дату, время, календарь и локаль, и он будет интегрирован в java в версии 8.

Метод DateTime#minusMonths поможет вам получить предыдущий месяц.

DateTime month = new DateTime().minusMonths (1); 
person Subhrajyoti Majumder    schedule 10.10.2012
comment
Обновление: проект Joda-Time сейчас находится в режиме обслуживания. Его создатель Стивен Коулбурн возглавил его преемника — классы java.time, определенные в JSR 310. - person Basil Bourque; 13.05.2021

вы можете использовать класс Calendar для этого:

SimpleDateFormat format = new SimpleDateFormat("yyyy.MM.dd HH:mm");
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, -1);
System.out.println(format.format(cal.getTime()));

Это печатает: 2012.09.10 11:01 для фактической даты 2012.10.10 11:01

person MaVRoSCy    schedule 10.10.2012
comment
Обновление: эти ужасные классы устарели. Много лет назад их заменили современные классы java.time, определенные в JSR 310, встроенные в Java 8 и более поздние версии и доступные для Java 6 и 7 в проекте ThreeTen-Backport. - person Basil Bourque; 13.05.2021

Самый простой и наименее подверженный ошибкам подход... Используйте метод roll() календаря. Как это:

    c.roll(Calendar.MONTH, false);

метод roll принимает логическое значение, что в основном означает свертывание месяца вверх (true) или вниз (false)?

person 唐龍豹    schedule 10.10.2012
comment
Это не катит год. Год не изменится, если вы используете это. - person Gergy008; 05.02.2016
comment
Проголосовали против, так как это неверно, как сказал Gergy008. В 99% случаев (и особенно в том, что спросил ОП) этот ответ неверен. - person Honza Kalfus; 27.11.2017

Вы должны знать, что месяц основан на нуле, поэтому, когда вы выполняете getMonth, вам нужно будет добавить 1. В приведенном ниже примере мы должны добавить 1 к Januaray как 1, а не 0

    Calendar c = Calendar.getInstance();
    c.set(2011, 2, 1);
    c.add(Calendar.MONTH, -1);
    int month = c.get(Calendar.MONTH) + 1;
    assertEquals(1, month);
person RNJ    schedule 10.10.2012

YearMonth класс

Вы можете использовать java.time.YearMonth и его minusMonths.

YearMonth lastMonth = YearMonth.now().minusMonths(1);

Вызов toString дает вам вывод в стандартном формате ISO 8601: yyyy-mm

Вы можете получить доступ к частям, году и месяцу. Вы можете использовать Month перечисляемый объект или просто int значение 1-12 для месяца.

int year = lastMonth.getYear() ;
int month = lastMonth.getMonthValue() ;
Month monthEnum = lastMonth.getMonth() ;
person Prashant Shubham    schedule 12.05.2021

Вот фрагмент кода. Думаю, он работает.

      Calendar cal = Calendar.getInstance();
      SimpleDateFormat simpleMonth=new SimpleDateFormat("MMMM YYYY");
      cal.add(Calendar.MONTH, -1);
      System.out.println(simpleMonth.format(prevcal.getTime()));
person Anzz    schedule 03.07.2018

person    schedule
comment
Пожалуйста, избегайте ответов, содержащих только код. Попробуйте объяснить, как ваш код решает проблему ОП. - person ad absurdum; 22.12.2016
comment
О, извините, я постараюсь изо всех сил ... и в следующий раз я дам правильное объяснение, Дэвид, спасибо за хорошие предложения ... - person prasad kamble; 27.12.2016