2012-11-27 75 views
1

下面的代码打印出“vmtDataOrig.creationdate = 2012年11月3日”java.util.Date.toString()被打印出错误的格式

VmtData vmtDataOrig = VmtDataDao.getInstance().loadVmt(1); 
System.out.println("vmtDataOrig.creationdate=" + vmtDataOrig.getCreationDate().toString()); 

这里是在所述的creationDate字段的定义VmtData类:

private Date creationDate = null; 

这里是creationDate字段的休眠映射数据库表的列:

<property name="creationDate" column="CREATIONDATE" type="date"/> 

MySQL数据库表中的CREATIONDATE列的类型为“date”,对于检索到的记录,其值为“2012-11-03”。

java.util.Date.toString()方法的Javadoc表示它应该以“dow mon dd hh:mm:ss zzz yyyy”格式打印Date对象。任何人都知道它为什么以“yyyy-MM-dd”的形式打印出来?

+2

你确定这不是'java.sql.Date'吗? – SLaks

+0

VmtData.java具有“import java.util。*;”它不会从java.sql中导入任何内容 – pacoverflow

+0

@pacoverflow由于碰撞(两个单独的Date类导入),它无法导入java.sql.Date。这意味着方法中返回的Date可能会返回一个'java.sql.Date',但它会显式地在方法中输入,如'java.sql.Date date = blah;'。 – Vulcan

回答

3

即使字段是java.util.Date型的,Hibernate的可能仍然是填充其与java.sql.Date,其子类java.util.Date和覆盖toString() ...例如:

public class Test { 
    public static void main(String[] args) throws Exception { 
     java.util.Date date = new java.sql.Date(0); 
     System.out.println(date); // 1970-01-01 
    } 
} 

这很容易检查虽然:

System.out.println(vmtDataOrig.getCreationDate().getClass()); 
+0

谢谢,这正是发生了什么事情。 – pacoverflow

0

您的hibernate类型是date,因此使用了java.sql.Date(它是java.util.date的子类)。如果将hibernate类型更改为java.sql.Timestamp,它将使用其toString()实现。