Java 日历异常行为

Java Calendar strange behavior

我正在尝试使用 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 天,这是为什么?提前致谢。

问题不可重现

我没有看到问题。

这是您描述但没有的代码的重新创建 post。

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 class 已通过新方法得到增强,可以轻松地与 java.time 类型相互转换。

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