44

如何在 Java 中找出上个月及其年份?

例如,如果今天是 2012 年 10 月 10 日,则结果应该是Month = 9and Year = 2012。如果今天是 2013 年 1 月 10 日,结果应该是Month = 12and Year = 2012

4

10 回答 10

72

您的解决方案在这里,但您需要使用减法而不是加法

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

然后你可以调用getterCalendar获取正确的字段

int month = c.get(Calendar.MONTH) + 1; // beware of month indexing from zero
int year  = c.get(Calendar.YEAR);
于 2012-10-10T07:55:26.237 回答
27

java.time

使用java.timeJava 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
于 2015-11-24T13:07:53.160 回答
10

使用Joda 时间库。用它处理日期、时间、日历和语言环境非常容易,它将在版本 8 中集成到 java 中。

DateTime#minusMonths方法将帮助您获得上个月。

DateTime month = new DateTime().minusMonths (1); 
于 2012-10-10T08:02:12.210 回答
10

您可以使用 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

于 2012-10-10T08:03:23.923 回答
7

最简单且最不容易出错的方法是……使用 Calendar 的 roll() 方法。像这样:

    c.roll(Calendar.MONTH, false);

roll 方法需要一个布尔值,这基本上意味着将月份向上滚动(true)或向下滚动(false)?

于 2012-10-10T08:00:00.290 回答
3
private static String getPreviousMonthDate(Date date){
    final SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.set(Calendar.DAY_OF_MONTH, 1);  
    cal.add(Calendar.DATE, -1);

    Date preMonthDate = cal.getTime();  
    return format.format(preMonthDate);
}


private static String getPreToPreMonthDate(Date date){
    final SimpleDateFormat format = new SimpleDateFormat("dd-MM-yyyy");

    Calendar cal = Calendar.getInstance();  
    cal.setTime(date);  
    cal.add(Calendar.MONTH, -1);  
    cal.set(Calendar.DAY_OF_MONTH,1);  
    cal.add(Calendar.DATE, -1);  

    Date preToPreMonthDate = cal.getTime();  
    return format.format(preToPreMonthDate);
}
于 2016-12-22T05:40:32.767 回答
3

YearMonth班级

您可以使用java.time.YearMonth该类及其minusMonths方法。

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

调用toString为您提供标准ISO 8601格式的输出:yyyy-mm

您可以访问零件、年份和月份。您可以选择使用Month枚举对象,或者仅使用int1-12 的值作为月份。

int year = lastMonth.getYear() ;
int month = lastMonth.getMonthValue() ;
Month monthEnum = lastMonth.getMonth() ;
于 2021-05-12T19:18:18.053 回答
2

您需要注意月份是从零开始的,因此当您执行 getMonth 时,您需要添加 1。在下面的示例中,我们必须将 Januaray 的 1 添加为 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);
于 2012-10-10T08:05:48.057 回答
0

您可以使用 LocalDate 类。

例如:

  1. 要获取上个月的日期:

    LocalDate.now().minusMonths(1);

  2. 获取上个月的开始日期

    LocalDate.now().minusMonths(1).with(TemporalAdjusters.firstDayOfMonth());

同样的年份:

  1. 要获取去年的日期:

    LocalDate.now().minusYears(1);

  2. 要获得去年的开始日期:

    LocalDate.now().minusYears(1).with(TemporalAdjusters.lastDayOfYear());

于 2022-01-04T10:12:05.083 回答
-2

这是代码片段。我认为它有效。

      Calendar cal = Calendar.getInstance();
      SimpleDateFormat simpleMonth=new SimpleDateFormat("MMMM YYYY");
      cal.add(Calendar.MONTH, -1);
      System.out.println(simpleMonth.format(prevcal.getTime()));
于 2018-07-03T08:05:42.307 回答