java.util.Date.toString() выводит неверный формат

Следующий код выводит «vmtDataOrig.creationdate=2012-11-03».

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

Вот определение поля createDate в классе VmtData:

private Date creationDate = null;

Вот сопоставление спящего режима поля createDate со столбцом таблицы базы данных:

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

Столбец CREATIONDATE в таблице базы данных MySQL имеет тип «дата» и для извлеченной записи имеет значение «2012-11-03».

В Javadoc для метода java.util.Date.toString() говорится, что предполагается печатать объект Date в форме «dow mon dd hh:mm:ss zzz yyyy». Кто-нибудь знает, почему он печатает его в форме «гггг-мм-дд»?


person pacoverflow    schedule 27.11.2012    source источник
comment
Вы уверены, что это не java.sql.Date?   -  person SLaks    schedule 28.11.2012
comment
VmtData.java имеет import java.util.*; Он ничего не импортирует из java.sql   -  person pacoverflow    schedule 28.11.2012
comment
@pacoverflow Невозможно импортировать java.sql.Date из-за коллизии (импортированы два отдельных класса Date). Это означает, что дата, возвращаемая в методе, может возвращать java.sql.Date, но она будет явно введена в методе, например java.sql.Date date = blah;.   -  person FThompson    schedule 28.11.2012
comment
Всегда будьте точны при импорте классов, а не используйте import java.util.*;. Таким образом, вы уверены, что не имеете в виду классы из других пакетов.   -  person devang    schedule 28.11.2012
comment
См. этот вопрос за действительно ужасный способ принудительного преобразования. Однако, если ваша база данных хранит только даты, вы не сможете получить действительные данные, например. часы, минуты, секунды.   -  person ig0774    schedule 28.11.2012


Ответы (2)


Несмотря на то, что поле имеет тип 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());
person Jon Skeet    schedule 27.11.2012
comment
Спасибо, именно так и было. - person pacoverflow; 28.11.2012

Ваш тип спящего режима - это дата, поэтому используется java.sql.Date (который является подклассом java.util.date). Если вы измените тип спящего режима на java.sql.Timestamp, он будет использовать его реализацию toString().

person Atif    schedule 27.11.2012