我有一个问题从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 ..任何建议发生了什么?
答案 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)
LocalDate
.of( 2020 , Month.JANUARY , 20 )
.minusMonths( 1 )
现代方法使用了几年前取代了可怕的Calendar
和Date
类的 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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
要了解更多信息,请参见Oracle Tutorial。并在Stack Overflow中搜索许多示例和说明。规格为JSR 310。
目前位于Joda-Time的maintenance mode项目建议迁移到java.time类。
您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。
答案 2 :(得分:0)
尝试使用Calendar.add()方法,例如:
cal.add(Calendar.MONTH, -1);
答案 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