【问题标题】:What is the correct way to go from LocalDate to java.sql.Date从 LocalDate 到 java.sql.Date 的正确方法是什么
【发布时间】:2017-11-01 20:44:09
【问题描述】:

我有一个LocalDate,我正在尝试将其转换为java.sql.Date,以将其存储在数据库的日期字段中。我的问题是,当我将其转换为java.sql.Date 时,由于我在 EST 中运行的机器,它落后了一天。我将Joda.DateTime 设置为UTC,并通过使用millis 构造函数创建java.sql.Date。我将调试手表的输出包括在内,这样您就可以看到不同的值是什么:

item.getDate().toDateTimeAtStartOfDay() = {org.joda.time.DateTime@6079}"2013-09-25T00:00:00.000Z"
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380067200000
new java.sql.Date(item.getDate().toDateTimeAtStartOfDay().getMillis()) = {java.sql.Date@6082}"2013-09-24"
item.getDate().getLocalMillis() = 1380067200000
new java.sql.Date(item.getDate().getLocalMillis()) = {java.sql.Date@6083}"2013-09-24"
new java.util.Date(item.getDate().getLocalMillis()) = {java.util.Date@6103}"Tue Sep 24 20:00:00 EDT 2013"

java.util.Date 创建我假设这是因为我正在测试的机器在 EST 中,并且 LocalDate 在 UTC 中,但我不确定解决这个问题的正确方法是什么。我意识到我可以获取本地时区并将其添加到毫秒,但这似乎是一个 hacky 修复。有没有我只是想念的正确方法来做到这一点?


更新 java.util.Date 的毫秒

new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000
item.getDate().toDateTimeAtStartOfDay().getMillis() = 1380153600000
item.getDate() = {org.joda.time.LocalDate@5812}"2013-09-26"
new java.sql.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000
new java.util.Date(item.getDate().getLocalMillis()) = {java.util.Date@5842}"Wed Sep 25 20:00:00 EDT 2013"
new java.util.Date(item.getDate().getLocalMillis()).getTime() = 1380153600000

【问题讨论】:

  • sql 和 util Date 对象的毫秒值是多少?

标签: java jodatime


【解决方案1】:

正确的转换是:

    public static final DateTimeZone jodaTzUTC = DateTimeZone.forID("UTC");

    // from  java.sql.Date  to LocalDate:
    public static LocalDate dateToLocalDate(java.sql.Date d) {
        if(d==null) return null;
        return new LocalDate(d.getTime(), jodaTzUTC);
    }

    // from  LocalDate to java.sql.Date:
    public static java.sql.Date localdateToDate(LocalDate ld) {
        if(ld==null) return null;
        return new java.sql.Date(
             ld.toDateTimeAtStartOfDay(jodaTzUTC).getMillis());
    }

我在我的 DAO 辅助逻辑中使用它。在 JDBC 中你应该这样做

 public static final Calendar calendarUTC = Calendar.getInstance(
       TimeZone.getTimeZone("UTC"));

 d = rs.getDate(i, calendarUTC);

二传手也是如此。

【讨论】:

    【解决方案2】:

    让你知道乔达的当地日期

    LocalDate loc = //...  
    

    您可以通过以下方式将其转换为具有区域独立性的java.sql.Date

    Date date = new Date(loc .getYear() - 1900, loc .getMonthOfYear() - 1, loc .getDayOfMonth());
    

    Date date = Date.valueOf(l.toString());
    

    【讨论】:

    • 此构造函数已弃用
    【解决方案3】:

    您应该创建和使用 java.sql.Timestamp,而不是 java.sql.Date。 按照规范,java.sql.Date 没有时间元素。

    将 LocalDate 转换为时间戳:

    Timestamp timestamp = new Timestamp(localDate.toDateMidnight().getMillis());
    

    将 LocalDateTime 转换为时间戳:

    Timestamp timestamp = new Timestamp(localDateTime.toDateTime().getMillis());
    

    【讨论】:

    • 我不需要时间戳我需要一个日期,我在数据库中存储一个日期。
    • LocalDate 也没有时间元素,就像 java.sql.Date
    【解决方案4】:

    如果您通过搜索如何转换 Java 8 LocalDate 发现了这个问题,您可以这样做:

    public static Date valueOf(LocalDate date)

    从 LocalDate 对象中获取 Date 的实例,具有相同的 作为给定的 LocalDate 的年、月和日值。这 提供的 LocalDate 被解释为本地时间的本地日期 区。参数:date - 要转换的 LocalDateReturns:a Date objectThrows:NullPointerException - 如果日期为 nullSince:1.8

    示例:

    Date sqlDate = Date.valueOf(localDateObject);
    

    【讨论】:

    • 这会将 Joda LocalDate 与 Java 8 LocalDate 混淆。问题是关于 Joda LocalDate。
    猜你喜欢
    • 2015-04-23
    • 1970-01-01
    • 2011-02-27
    • 2022-01-10
    • 1970-01-01
    • 2020-05-02
    • 1970-01-01
    • 2012-12-28
    • 2018-02-04
    相关资源
    最近更新 更多