Vaadin: Как изменить формат даты?

Я извлекаю дату из базы данных, переназначаю ее как TextField, а затем toString(), но дата выходит «Чт 0900 OCT 12 2015», когда все, что мне нужно, это формат MM/DD/YYYY. Как изменить формат?

  Date myDatabaseDate = someDBGetMethod();

    TextField myDateTF = new TextField()
    myDateTF.setCaption("My date is: ");
    myDateTF.setValue(myDatabaseDate).toString());
    myDateTF.setReadOnly(true);

FormLayout fLayout = new FormLayout();
addComponent(fLayout);
fLayout.addComponent(myDateTF);
  • Что происходит: Чт, 22 октября, 12:19:04 CDT 2015
  • Что я хочу: 22.10.2015

Заранее спасибо! Примеры имеют для меня наибольший смысл, так как я новичок в vaadin.


person Null    schedule 29.10.2015    source источник
comment
Вы проверили примеры книг Vaadin по полям даты? Они специально разработаны для манипулирования датами.   -  person Morfic    schedule 29.10.2015
comment
Помимо использования для этого DateField, если вы хотите только отобразить его, то, как и везде в java, для этого вам нужен класс DateFormat. Например, stackoverflow.com/questions/16424667/java-formatting-date   -  person André Schild    schedule 30.10.2015


Ответы (2)


Ваадин не проблема

Если вы пытаетесь отобразить строковое представление объекта даты и времени, то Vaadin не является частью проблемы. Vaadin предлагает виджет DateField, позволяющий пользователю выбрать дату. временная ценность. Вам не нужен этот виджет для простого отображения строкового представления. Для отображения используйте TextField, как описано в Вопросе.

Итак, проблема заключается в том, как сгенерировать это строковое представление.

Во-первых, имейте в виду, что Java включает в себя два класса с именем «Дата»:

Как ни странно, они не параллельны. util — это дата плюс время суток в формате UTC. Версия sql предназначена только для представления даты, но плохо спроектирована; как хак, он подклассифицирует утилиту, но изменяет время суток на 00:00:00.000. Эти старые классы даты и времени в ранней версии Java представляют собой неприятный беспорядок.

Из базы данных вы должны получать последнее, java.sql.Date для сохраненного значения только для даты. Если вы сохраняли значения даты и времени, вы должны получить java.sql.Timestamp объекты из драйвера JDBC.

Java.время LocalDate

Поскольку java.sql.Date — это один из старых неуклюжих классов даты и времени, связанных с ранней версией Java, мы должны преобразовать его в новые классы, найденные в java.time, встроенный в Java 8 и более поздние версии. См. учебник.

Для значения только даты java.time предлагает LocalDate класс. «Местный» в названии относится к любому населенному пункту, а не к конкретному населенному пункту. Он представляет собой смутное представление о дате, но не привязан к временной шкале. Например, свидание в Париже начинается раньше, чем в Монреале. Если вам нужны точные моменты на временной шкале, вы должны использовать java.sql.Timestamp, а не java.sql.Date.

Преобразование из java.sql.Date в java.time.LocalDate — это простая однострочная операция, как метод преобразования предоставляется вам.

LocalDate localDate = myJavaSqlDate.toLocalDate();

Идти другим путем так же просто, сохраняя данные в базе данных.

java.sql.Date myJavaSqlDate = java.sql.Date.valueOf( localDate );

Имея на руках LocalDate, вы можете вызвать java.time.format для форматирования строки, локализованной для удобного чтения пользователем. Укажите Locale, ожидаемый пользователем.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH );
String output = localDate.format( formatter );

Пример вывода:

Диманш 1 ноября 2015 г.

ZonedDateTime

Давайте рассмотрим, получили ли вы скорее java.sql.Timestamp чем java.sql.Date.

Мы можем преобразовать java.sql.Timestamp в Instant, момент на временной шкале в формате UTC.

Instant instant = myTimestamp.toInstant();

Далее назначьте часовой пояс.

ZoneId zoneId = ZoneId.of( "America/Montreal" );
ZonedDateTime zdt = ZonedDateTime.ofInstant( instant , zoneId);

Мы используем пакет java.time.format для создания строкового представления. Обратите внимание на связанные вызовы, второй из которых устанавливает конкретную локаль. Если не указано, неявно применяется текущая локаль вашей JVM по умолчанию. Лучше быть явным.

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.CANADA_FRENCH );
String output = zdt.format ( formatter );

Пример вывода:

Диманш, 1 ноября 2015 г., 2 часа 24 минуты по восточному поясному времени.

person Basil Bourque    schedule 31.10.2015