从LocalDate到java的正确方法是什么.sql.Date

2022-09-04 22:08:20

我有一个,我正在尝试转换为一个,以将其存储在数据库的“日期”字段中。我的问题是,当我将其转换为a时,由于我在EST中运行的机器,它落后了一天。我设置为UTC,并使用millis构造函数创建via。我包括调试监视的输出,因此您可以看到不同的值是什么:LocalDatejava.sql.Datejava.sql.DateJoda.DateTimejava.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"

从创建开始,我就假设这是因为我正在测试的机器在EST中,而LocalDate在UTC中,但我不确定解决这个问题的正确方法是什么。我意识到我可以获取本地时区并将其添加到millis中,但这似乎是一个黑客修复。有没有一种正确的方法来做到这一点,我只是错过了?java.util.Date


使用 millis 更新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

答案 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

让我们有joda的本地日期

LocalDate loc = //...  

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

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

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

推荐