【问题标题】:java.util.Date to java.sql.Date conversion gives wrong monthjava.util.Date 到 java.sql.Date 的转换给出了错误的月份
【发布时间】:2011-12-08 18:41:38
【问题描述】:

考虑以下 sn-p:

Calendar futureDate = Calendar.getInstance();
int year = 2011;
int month = 11;
int day = 14;
futureDate.set(year,month, day);
System.out.println(futureDate.toString());
java.sql.Date sqlDate  = new java.sql.Date( futureDate.getTime().getTime());

futureDate.toString() 的打印输出是:

.....YEAR=2011,MONTH=11,WEEK_OF_YEAR=43,WEEK_OF_MONTH=4,DAY_OF_MONTH=14,DAY_OF_YEAR=289,DAY_OF_WEEK=1,DAY_OF_WEEK_IN_MONTH=3,AM_PM=0,HOUR=11,HOUR_OF_DAY= 11,MINUTE=32,SECOND=51,MILLISECOND=117,ZONE_OFFSET=-18000000,DST_OFFSET=3600000]

这表明 Calendare 对象拥有正确的日期。但是,在转换为 sql 日期并存储在数据库中(通过 JDBC 的 MySQL)后,MySQL 表显示该日期的“2011-12-14”而不是“2011-11-14”。 我会怀疑语言环境和时区,但这些会导致一天中的时间不一致,而不是日期的月份部分。

我做错了什么的任何线索?

【问题讨论】:

    标签: java date jdbc


    【解决方案1】:

    Calendar#set(int, int, int) 将月份参数解释为从零开始,因此futureDate.set(2011, 11, 14) 将日历的月份设置为 12 月。

    【讨论】:

    • 请使用预期的常量,例如futureDate.set(2011,Calendar.DECEMBER,14)
    • 谢谢。一定是这样的。我不能使用 Calendar.NOVEMBER,因为该值来自输入字段,但现在我要调整基于零的月份值。
    【解决方案2】:

    tl;博士

    LocalDate.of( 2011 , 11 , 14 )  // November 14th, 2011
    

    详情

    Matt Ball 的答案是正确的。但是现在有一个改进很多的方法。

    java.time

    Calendar、java.util.Date 和 java.sql.Date 等麻烦的旧日期时间类现在已被 java.time 类所取代。

    与旧类不同,java.time 类具有合理的编号,例如月份编号为 1-12 为 1 月至 12 月,1-7 为星期一到周日。

    LocalDate 类表示没有时间和时区的仅日期值。

    LocalDate ld = LocalDate.of( 2011 , 11 , 14 ) ;
    

    或者使用方便的Month枚举。

    LocalDate ld = LocalDate.of( 2011 , Month.NOVEMBER , 14 ) ;
    

    使用支持 JDBC 4.2 及更高版本的 JDBC 驱动程序,您可以将 java.time 对象直接传递给数据库。

    myPreparedStatement.setObject( … , ld ) ;
    

    获取时,使用getObject。

    LocalDate ld = myResultSet.getObject( … , LocalDate.class ) ;
    

    关于java.time

    java.time 框架内置于 Java 8 及更高版本中。这些类取代了麻烦的旧 legacy 日期时间类,例如 java.util.Date、Calendar 和 SimpleDateFormat。

    Joda-Time 项目现在位于maintenance mode,建议迁移到java.time 类。

    要了解更多信息,请参阅Oracle Tutorial。并在 Stack Overflow 上搜索许多示例和解释。规格为JSR 310。

    从哪里获得 java.time 类?

    ThreeTen-Extra 项目通过附加类扩展了 java.time。该项目是未来可能添加到 java.time 的试验场。您可以在这里找到一些有用的类,例如Interval、YearWeek、YearQuarter 和more。

    【讨论】:

      猜你喜欢
      • 2012-08-21
      • 1970-01-01
      • 2011-08-29
      • 2016-02-14
      • 1970-01-01
      • 1970-01-01
      • 2015-04-03
      • 1970-01-01
      • 2018-03-29
      相关资源
      最近更新 更多