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 数据类型。
我正在尝试使用 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 数据类型。