您好,我对 java.sql.Date 的结果有疑问。这是我的代码,从当前日期开始增加 1 周
Date kini = new Date();
java.sql.Date jadwalPengobatan = new java.sql.Date(kini.getTime()+7*24*60*60*1000);
如果当前日期是 2016-02-27,那么我的 MySQL 中的结果是 2016-03-05。 但是,如果我想使用此行代码从当前日期添加 1 个月(对于我的情况,它总是 31 天)
java.sql.Date jadwalPengobatan = new java.sql.Date(kini.getTime()+31*24*60*60*1000);
它应该是 2016-03-28 但在我的 MySQL 中结果是 2016-02-05。谁能帮我看看这个结果有什么问题??
最佳答案
java.time
其他答案使用过时的旧日期时间类。在被证明令人困惑、麻烦和有缺陷之后,它们已被 Java 8 及更高版本中的 java.time 框架所取代。
不要在您的业务逻辑中使用 java.sql 类。它们是那些旧的日期时间类的困惑扩展,并且是一种设计糟糕的 hack。仅将它们用于将数据传入/传出数据库。立即转换为 java.time 类型。
要转换,请使用添加到旧类的新方法。
在java.sql.Date
的情况下,它假装持有一个没有时间和时区的仅限日期的值。 java.time 类包含一个真正的仅限日期值 LocalDate
。要将 java.sql.Date
转换为 java.time.LocalDate
,请调用 java.sql.Date::toLocalDate
.
LocalDate ld = mySqlDate.toLocalDate();
添加一个真正的月份是内置的。
LocalDate monthLater = ld.plusMonths( 1 );
转换回 java.sql 存储在数据库中。
java.sql.Date sqlDate = java.sql.Date.valueOf( monthLater );
希望有一天我们会看到 JDBC 驱动程序更新为直接支持 java.time 类型。然后 java.sql 类型将作为过去的旧遗迹消失。但在那之前,我们需要执行这些 java.sql ↔ java.time 转换。
更新:JDBC 4.2 及更高版本提供直接使用 PreparedStatement::setObject
传递 java.time 类型,并使用 ResultSet::getObject
获取。因此无需转换为 java.sql 类型。
关于java - 使用 java.sql.Date 从当前日期添加 1 个月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668643/