[英]Convert SQL date to Java.util.date
我的要求是将dueDate
字段作为日期返回给呼叫服务。
后端代码以mm/dd/yy
返回日期。 当我将这些字段映射到Java代码时,我的对象包含类型为java.sql.Date
的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),我应该返回到调用服务。
检查这个
//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);
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() ) ;
java.sql.Date:2018-07-31
java.util.Date:2018年7月31日星期二22:44:14
您可以看到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
替换。 两者都代表UTC的时刻,尽管Instant
的分辨率更佳,为纳秒而不是毫秒。 (仅供参考, 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" ) ) ) ;
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及更高版本中。 这些类取代了麻烦的旧的旧式日期时间类,例如java.util.Date
, Calendar
和SimpleDateFormat
。
现在处于维护模式的Joda-Time项目建议迁移到java.time类。
要了解更多信息,请参见Oracle教程 。 并在Stack Overflow中搜索许多示例和说明。 规格为JSR 310 。
您可以直接与数据库交换java.time对象。 使用与JDBC 4.2或更高版本兼容的JDBC驱动程序 。 不需要字符串,不需要java.sql.*
类。
在哪里获取java.time类?
ThreeTen-Extra项目使用其他类扩展了java.time。 该项目为将来可能在java.time中添加内容提供了一个试验场。 您可以在这里找到一些有用的类,比如Interval
, YearWeek
, YearQuarter
,和更多 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.