java - 使用 java.sql.Date 从当前日期添加 1 个月

标签 java mysql date

您好,我对 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.sqljava.time 转换。

更新:JDBC 4.2 及更高版本提供直接使用 PreparedStatement::setObject 传递 java.time 类型,并使用 ResultSet::getObject 获取。因此无需转换为 java.sql 类型。

关于java - 使用 java.sql.Date 从当前日期添加 1 个月,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35668643/

相关文章:

Python 日期填空,pandas 数据框

PHP 选择日期等于日期时间的位置

java - HTTP 状态 403 - 在请求参数 '9ee6949c-c5dc-4d4b-9d55-46b75abc2994' 或 header '_csrf' 上发现无效的 CSRF token 'X-CSRF-TOKEN'

php - MySQL/PHP 中的递归处理

mysql - 为什么我的 Perl 脚本在同一台计算机上的 Windows 8.1 上运行缓慢,而在 8.0 上运行良好?

mysql - Doctrine 2 发出了不需要的查询,或者也许我错了,但这是必要的?

java - 无法比较两个日期 java,使用 SimpleDateFormat "dd/MM/YYYY hh:mm:ss a"将字符串转换为日期时转换无效

java第二个sql语句不工作

java - 如何初始化具有特定类型的列表数组?

java - 如何关闭嵌入式 Undertow 应用程序?