将SQL日期转换为Java.util.date

时间:2018-07-31 19:09:23

标签: java date format java.util.date

我的要求是将dueDate字段作为日期返回给呼叫服务。

后端代码返回mm/dd/yy中的日期。当我将这些字段映射到Java代码时,我的对象包含类型java.sql.Date的日期字段。

对象中定义的字段是(请注意是伪字段):

import java.sql.Date;

private Date dueDate;

/**
 * @return the dueDate
 */
public Date getDueDate() {
    return dueDate;
}

/**
 * @param DueDate the DueDate to set
 */
public void setDueDate(Date dueDate) {
    this.dueDate = dueDate;
}

@Override
public String toString() {
    StringBuilder builder = new StringBuilder();
    builder.append("DueDetails [dueAmount=").append(dueAmount).append(", dueDate=").append(dueDate)
            .append("]");       
    return builder.toString();
}

当我打印对象时,Date字段采用以下形式:

dueDate=Thu Oct 25 20:00:00 EDT 2018
dueDate=Thu Aug 02 20:00:00 EDT 2018

当我从后端查询时,它会向我显示正确的格式(mm / dd / yy),我应该将其返回给呼叫服务。

2 个答案:

答案 0 :(得分:3)

检查此

//converting java.util.Date to java.sql.Date in Java
java.sql.Date sqlDate = new java.sql.Date(now.getTime());
System.out.println("Converted value of java.sql.Date : " + sqlDate);

//converting java.sql.Date to java.util.Date back
java.util.Date utilDate = new java.util.Date(sqlDate.getTime());
System.out.println("Converted value of java.util.Date : " + utilDate);

通过此链接:http://www.java67.com/2012/12/how-to-convert-sql-date-to-util-date.html

然后,您可以使用SimpleDateFormat随意设置日期格式:

DateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
String strdate = simpleDateFormat.format(myJavaDate);
System.out.println(strdate);

答案 1 :(得分:2)

java.util.Datejava.sql.Date

您的输出似乎来自java.util.Date,而不是java.sql.Date

不幸的是,将两者混合很容易。除了Date名称以外,sql从技术上讲是另一个util的子类。当心:这是一个hack,也是一个糟糕的hack。文档警告我们假装二者在继承关系中不是不是。但是编译器不知道这一点。

下面是一些示例代码,显示了这两个类及其各自的toString方法的不同行为。

// Legacy classes
System.out.println( "java.sql.Date: " + new java.sql.Date( Instant.now().toEpochMilli() ) ) ;
System.out.println( "java.util.Date: " + new java.util.Date() ) ;

查看此code run live at IdeOne.com.

  

java.sql。日期:2018-07-31

     

java.util.Date:2018年7月31日星期二22:44:14 GMT

您可以看到java.sql.Date::toString方法使用SQL环境中使用的较短的YYYY-MM-DD格式。顺便说一下,该格式也恰好符合ISO 8601标准。

相比之下,您报告的输出与java.util.Date::toString的输出匹配。

java.time

这个问题没有解决。您正在使用 java.time 类在多年前取代的可怕的旧日期时间类。

  • java.sql.Date替换为java.time.LocalDate,这是仅日期的值,没有日期和时区。 (仅供参考,java.sql.Date假装没有时间或时区,但实际上却同时具有两者,作为java.util.Date的尴尬子类。)
  • java.util.Date替换为java.time.Instant。尽管Instant的分辨率更精细,只有纳秒而不是毫秒,但两者都代表UTC时刻。 (FYI,java.util.Date实际上有一个深层的时区,没有getter / setter方法就无法访问,但在equals等中使用。这些旧类中许多糟糕的设计决策之一。)

这里有一些代码,与上面的代码相对应。

// Modern classes
System.out.println( "LocalDate.now(): " + LocalDate.now() ;
System.out.println( "Instant.now(): " + Instant.now() ) ;
System.out.println( "ZonedDateTime.now( … ): " + ZonedDateTime.now( ZoneId.of( "Africa/Tunis" ) ) ) ;

查看此code run live at IdeOne.com.

  

LocalDate.now():2018-07-31

     

Instant.now():2018-07-31T22:57:27.763Z

     

ZonedDateTime.now(…):2018-07-31T23:57:27.904 + 01:00 [非洲/突尼斯]


关于 java.time

java.time框架已内置在Java 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.DateCalendarSimpleDateFormat

目前位于Joda-Timemaintenance mode项目建议迁移到java.time类。

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

您可以直接与数据库交换 java.time 对象。使用符合JDBC driver或更高版本的JDBC 4.2。不需要字符串,不需要java.sql.*类。

在哪里获取java.time类?

ThreeTen-Extra项目使用其他类扩展了java.time。该项目为将来可能在java.time中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如IntervalYearWeekYearQuartermore