【问题标题】:add 1 month from current date using java.sql.Date使用 java.sql.Date 从当前日期添加 1 个月
【发布时间】:2016-02-27 10:35:22
【问题描述】:

您好,我对 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 年 3 月 28 日,但在我的 MySQL 中结果是 2016 年 2 月 5 日。任何人都可以帮助我这个结果有什么问题?

【问题讨论】:

标签: java mysql date


【解决方案1】:

java.time

其他答案使用过时的旧日期时间类。在被证明令人困惑、麻烦和有缺陷之后,它们已被 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.sqljava.time 转换。

更新:JDBC 4.2 及更高版本提供使用PreparedStatement::setObject 直接传递java.time 类型,并使用ResultSet::getObject 获取。所以不需要转换成 java.sql 类型。

【讨论】:

    【解决方案2】:

    使用日历:

    Calendar cal = Calendar.getInstance();
    cal.add(Calendar.MONTH, 1);
    Date result = cal.getTime();
    

    【讨论】:

    • 感谢@Sardor..它将成为未来的参考
    【解决方案3】:

    您的解决方案的问题是您没有在long 中进行计算。

    您必须将31*24*60*60*1000 替换为31l*24l*60l*60l*1000l

    这里是修正后的代码sn-p:

    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 天数添加到当前日期的计算。如果您想添加一个月,可以是 302829 天,那么也许您应该使用 Calendar

    今天的日期:

    2016-02-27
    

    输出:

    2016-03-29
    

    【讨论】:

    • 二月份呢?闰年呢?
    • 我知道,但在这里他只想添加31days,他提到的问题与计算有关。我错过了什么吗?
    • 他从未提到过 31 天。我认为在 Java 中使用 Calendar 或使用 DATE_ADD() 是唯一的选择。
    • 使用我的代码,如果年份改变有什么问题吗?是的,你的解决方案现在对我有用..谢谢
    • @Dylan 不,这不是问题。唯一的问题是它总是将31 天添加到任何给定的日期。
    【解决方案4】:

    您的问题的一个解决方案是使用 DATE_ADD() 函数更改 MySQL 中的日期:

    DATE_ADD(yourDate, INTERVAL 1 MONTH)
    

    【讨论】:

      【解决方案5】:
        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);
      

      【讨论】:

      • 感谢您的回答..它将成为我未来的参考:)
      【解决方案6】:

      您可以使用Calendar

      Date kini = new Date(); 
      Calendar cal = Calendar.getInstance();
      cal.setTime(kini);
      cal.add(Calendar.DATE, 7); // add 10 days, e.g. 1 week
      cal.add(Calendar.DATE, 31); // add 31 days, e.g. ~1 month
      java.sql.Date jadwalPengobatan = new java.sql.Date(cal.getTime());
      

      另见this discussion

      【讨论】:

      • 感谢@Froodooo,它将成为未来的参考
      猜你喜欢
      • 1970-01-01
      • 2020-06-07
      • 1970-01-01
      • 2022-01-24
      • 2016-01-31
      • 1970-01-01
      • 1970-01-01
      • 2011-09-01
      • 2012-05-22
      相关资源
      最近更新 更多