您好我的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。任何人都可以帮我解决这个问题的错误吗?
答案 0 :(得分:2)
其他答案使用过时的旧日期时间类。在证明令人困惑,麻烦和有缺陷之后,它们已被Java 8及更高版本中的java.time框架所取代。
不要在业务逻辑中使用 java.sql 类。它们是旧日期时间类的混乱扩展,是一个设计糟糕的黑客。仅用于将数据传入/传出数据库。立即转换为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类型。
答案 1 :(得分:1)
使用日历:
Calendar cal = Calendar.getInstance();
cal.add(Calendar.MONTH, 1);
Date result = cal.getTime();
答案 2 :(得分:0)
您的问题的一个解决方案是使用DATE_ADD()
函数更改MySQL中的日期:
DATE_ADD(yourDate, INTERVAL 1 MONTH)
答案 3 :(得分:0)
您的解决方案的问题在于您没有在long
中进行计算。
您必须将31*24*60*60*1000
替换为31l*24l*60l*60l*1000l
。
以下是更正后的代码段:
public static void main (String[] args)
{
Date kini = new Date();
java.sql.Date jadwalPengobatan = new java.sql.Date(kini.getTime() + 31l*24l*60l*60l*1000l);
System.out.println(jadwalPengobatan);
}
请注意,这只会在您将31
天添加到当前日期时进行计算。如果您希望添加一个月30
,28
或29
天,那么也许您应该使用Calendar
。
今天的日期:
2016-02-27
输出:
2016-03-29
答案 4 :(得分:0)
SimpleDateFormat date= new SimpleDateFormat("dd/MM/yyyy");
Calendar calendar = Calendar.getInstance();
calendar.setTime(new Date());
calendar.add(Calendar.MONTH, 1);
String output= date.format(calendar.getTime());
java.sql.Date jadwalPengobatan = new java.sql.Date(output);
答案 5 :(得分:0)