【问题标题】:java.sql.Date to joda time conversionjava.sql.Date 到 joda 时间的转换
【发布时间】:2012-01-13 04:06:50
【问题描述】:

oracle sql:

select trunc( sysdate, 'Month') month
from dual

java:

java.sql.Date sqlDate = resultSet.getDate("month");
log.info(sqlDate);
DateTime dateTime = new DateTime(sqlDate.getTime());
log.info(dateTime);
dateTime = dateTime.withMillisOfDay(0);
log.info(dateTime);

输出:

2012-01-01

2012-01-01T 01:00:00.000+07:00

2012-01-01T 00:00:00.000+07:00

额外的一小时在哪里?

【问题讨论】:

  • 我认为这个时区有问题,检查时区是否正确?

标签: java sql oracle jodatime


【解决方案1】:

使用LocalDate.fromDateFields(date) 将 SQL 日期解释为本地日期(忽略时区)。然后,您可以在必要时使用LocalDate 上的方法来获取DateTime(尽管如果您的对象确实是“只是一个日期”,那么LocalDate 是正确使用的对象。

【讨论】:

  • 请注意 - 我处理的是java.sql.Timestamp 而不是java.sql.Date,所以使用new DateTime(java.sql.Timestamp.valueOf(someSqlDate)); 就可以了。
【解决方案2】:

默认构造函数使用系统默认构造函数,这可能会导致有关 DST 的问题。我发现toDateMidnight 函数在尝试确保我实际上是在午夜时非常有用。

【讨论】:

  • 如果时间不增减怎么办?
  • 你能说得更具体点吗?我不确定你指的是什么。 toDateMidngith 返回一个LocalDate 对象,它只能表示日期,不能表示时间。那是问题吗?如果是这样,那么它可能不是您想要的。如果withMillisOfDay() 适合你,那就坚持下去。
  • 仅供参考,Joda-Time 团队不再推荐“午夜”相关的类和方法。他们将 withTimeAtStartOfDay 方法添加到 DateTime 类中。
【解决方案3】:

你应该试试这个代码。

LocalDate issueDate = new LocalDate(new Date());
System.out.println(new java.sql.Date(issueDate.toDate().getTime()))

【讨论】:

    猜你喜欢
    • 2013-04-17
    • 2013-04-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-26
    • 2011-05-01
    • 1970-01-01
    相关资源
    最近更新 更多