Ваадин не проблема
Если вы пытаетесь отобразить строковое представление объекта даты и времени, то 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