Ваадин не е проблемът
Ако се опитвате да покажете String представяне на обект за дата-час, тогава Vaadin не е част от проблема. Vaadin предлага джаджа, DateField
, за да може потребителят да избере дата- времева стойност. Нямате нужда от тази джаджа за просто показване на низовото представяне. За показване използвайте TextField
, както сте описали във въпроса.
Така че проблемът е как да генерираме това представяне на низ.
Първо имайте предвид, че Java включва два класа, наречени "Дата":
Объркващо, те не са успоредни. Util е дата плюс час от деня в UTC. Този sql е предназначен да представлява само дата, но е зле проектиран; като хак той подкласира полезния, но променя времето от деня на 00:00:00.000
. Тези стари класове за дата-час в ранната Java са лоша бъркотия.
От база данни трябва да получавате последното, java.sql.Date за съхранена само за дата стойност. Ако сте съхранявали стойности за дата-час, тогава трябва да получавате java.sql.Timestamp
обекти от вашия JDBC драйвер.
java.time 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 ч. EST
person
Basil Bourque
schedule
31.10.2015