从java减去去年1月到12月的月份

时间:2014-02-11 22:57:45

标签: java datetime

我有一个问题从1月回到12月我尝试了各种各样的事情,但我得到了nullexception。我正在使用一个按钮并放置一个mouselistener所以每次我点击它,它会减少一个月。但是在1月之后它甚至不会减少到12月,即使我在检查月份之前改变了一年。这就是我所做的。

    Button btnNewButton = new Button(composite, SWT.NONE);
    btnNewButton.addMouseListener(new MouseAdapter() {
        @Override
        public void mouseUp(MouseEvent e) {
            moveCalendar("down");
        }
    });

然后这是我的moveCalendar ..

public void moveCalendar(String move)
{
    Calendar cal = GregorianCalendar.getInstance();
    resetBox();
    if(move.equals("down") )
    {
        dummyMonth--;
        if(dummyMonth < 0)
        {
            dummyMonth = 11;
            dummyYear--;
        }
    }
    else
    {
        dummyMonth++;
        if(dummyMonth > 11)
        {
            dummyMonth = 0;
            dummyYear++;
        }
    }

    cal.set(Calendar.YEAR,dummyYear);
    setYear(dummyYear);
    cal.set(Calendar.MONTH,dummyMonth);
    setMonth(dummyMonth);
    int dy = getFirstDay(cal.get(Calendar.MONTH),cal.get(Calendar.YEAR));
    int daysMonth = cal.getActualMaximum(Calendar.DAY_OF_MONTH);
    populateCalendar(dy-1,daysMonth,cal.get(Calendar.DAY_OF_MONTH),dummyMonth);
}

我得到了nullexception ..任何建议发生了什么?

4 个答案:

答案 0 :(得分:1)

尝试使用Joda-Time库。

它对日期和时间操作的支持比股票java类更好 - 以至于它是dates and times API中新Java 8的基础。

在Joda-Time中,您可以使用以下代码轻松移至上个月:

YearMonth date = new YearMonth("2014-01");
date = date.minusMonths(1); //will equal 2013-11

您的问题并未说明您是处理数年和数月,还是处理确切日期(年,月和日),但无论哪种方式,您都会使用minusMonths方法,只需使用不同的类(例如,确切日期使用LocalDate类)。

要正确地与UI控件集成,您可以在完成操作日期对象后,通过将每个控件设置为日期对象中的正确值来填充控件。

这种方法比处理Calendar更容易

答案 1 :(得分:1)

tl; dr

LocalDate
.of( 2020 , Month.JANUARY , 20 ) 
.minusMonths( 1 ) 

java.time

现代方法使用了几年前取代了可怕的CalendarDate类的 java.time 类。

对于没有日期和时区的仅日期值,请使用LocalDate

LocalDate localDate = LocalDate.of( 2020 , Month.JANUARY , 20 ) ;

要执行日期计算,请调用plus…minus…方法。

LocalDate monthAgo = localDate.minusMonths( 1 ) ;  // Get same day-of-month in the previous month. 

或者使用Period表示时间轴上未附加的时间跨度。

Period p = Period.ofMonths( 1 ) ;

LocalDate earlier = localDate.minus( p ) ;

关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore

答案 2 :(得分:0)

尝试使用Calendar.add()方法,例如:

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

请参阅http://www.tutorialspoint.com/java/util/calendar_add.htm

答案 3 :(得分:0)

按以下方式使用Java 8日期和时间API:

    LocalDateTime dt2= LocalDateTime.of(2019,10,20, 12,45);
    System.out.println(dt2); //2019-10-20T12:45

    System.out.println(dt2.minusMonths(11));//2018-11-20T12:45