我的要求是将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),我应该将其返回给呼叫服务。
答案 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.Date
与java.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.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 8及更高版本中。这些类取代了麻烦的旧legacy日期时间类,例如java.util.Date
,Calendar
和SimpleDateFormat
。
目前位于Joda-Time的maintenance 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中添加内容提供了一个试验场。您可能会在这里找到一些有用的类,例如Interval
,YearWeek
,YearQuarter
和more。