Java Calendar奇怪的行为

时间:2015-05-18 20:15:01

标签: java date calendar

我尝试使用java calendar,我试图在特定日期之后的7天内计算如下:

java.sql.Timestamp lastDate= Timestamp.valueOf("2015-12-28 00:00:00.0");

我有一个批处理作业,它运行并更新该日期每周发生一次。我这样做的方式如下:

Calendar calNextDate = Calendar.getInstance();
calNextDate.setTime(new java.util.Date(lastDate.getTime()));

calNextDate.add(Calendar.DAY_OF_MONTH, 7);

System.out.println(new Timestamp(calNextDate.getTime().getTime()));

输出:

2016-01-04 00:00:00.0

但是当我使用相同的功能计算2014年时,日期是:

2015-01-05 00:00:00.0

我已经在两个案件上增加了7天但是在2014年的情况下,1天是关闭的,为什么会这样?提前致谢。

1 个答案:

答案 0 :(得分:1)

问题不可重现

我没有看到问题。

以下是您所描述但未发布的代码的重新创建。

java.sql.Timestamp ts2013 = Timestamp.valueOf ( "2013-12-28 00:00:00.0" );
java.sql.Timestamp ts2014 = Timestamp.valueOf ( "2014-12-28 00:00:00.0" );
java.sql.Timestamp ts2015 = Timestamp.valueOf ( "2015-12-28 00:00:00.0" );

Calendar cal2013 = Calendar.getInstance ( );
cal2013.setTime ( new java.util.Date ( ts2013.getTime ( ) ) );
cal2013.add ( Calendar.DAY_OF_MONTH, 7 );
java.sql.Timestamp ts2013Plus = new Timestamp ( cal2013.getTime ( ).getTime ( ) );
System.out.println ( ts2013 + " + 7 = " + ts2013Plus );

Calendar cal2014 = Calendar.getInstance ( );
cal2014.setTime ( new java.util.Date ( ts2014.getTime ( ) ) );
cal2014.add ( Calendar.DAY_OF_MONTH, 7 );
java.sql.Timestamp ts2014Plus = new Timestamp ( cal2014.getTime ( ).getTime ( ) );
System.out.println ( ts2014 + " + 7 = " + ts2014Plus );

Calendar cal2015 = Calendar.getInstance ( );
cal2015.setTime ( new java.util.Date ( ts2015.getTime ( ) ) );
cal2015.add ( Calendar.DAY_OF_MONTH, 7 );
java.sql.Timestamp ts2015Plus = new Timestamp ( cal2015.getTime ( ).getTime ( ) );
System.out.println ( ts2015 + " + 7 = " + ts2015Plus );

运行时,此代码始终为第4个。

2013-12-28 00:00:00.0 + 7 = 2014-01-04 00:00:00.0
2014-12-28 00:00:00.0 + 7 = 2015-01-04 00:00:00.0
2015-12-28 00:00:00.0 + 7 = 2016-01-04 00:00:00.0

我的结论是你的问题出在其他地方。

java.time

我强烈建议在Java 8及更高版本中使用新的java.time包。然后,您可以完全避免java.util.Date/.Calendar。

的混乱

java.sql.Timestamp类已经使用新方法进行了增强,可以轻松地转换为java.time类型和从java.time类型转换。

最终将更新JDBC驱动程序以直接处理java.time数据类型。