Vaadin: Как да променя формата на датата?

Изтеглям дата от база данни, преназначавам я като TextField и след това към нея toString(), но датата излиза „четвъртък 09:00, 12 октомври 2015 г.“, когато всичко, от което се нуждая, е формат ММ/ДД/ГГГГ. Как да променя формата?

  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)


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

Ако се опитвате да покажете 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

Обектът java.util.date не съдържа всякаква информация как да се представи като String. Това е така, защото на различни места общностите пишат датите по различни начини. Така че Java отделя операциите с дати от отпечатването им на екрана. Това, което ви липсва във вашия код, е DateFormat.

    Date myDatabaseDate = new Date(2014,10,10);
    DateFormat format = DateFormat.getDateInstance(DateFormat.SHORT, Locale.UK);
    TextField myDateTF = new TextField();
    myDateTF.setCaption("My date is: ");
    myDateTF.setValue(format.format(myDatabaseDate));
    myDateTF.setReadOnly(true);
    layout.addComponent(myDateTF);

Силно бих ви насърчил обаче да използвате Java 8 Dates API, тъй като Java 7 Dates API е пълна бъркотия. Можете да прочетете повече за това тук Какво не е наред с Java Date & Time API?

person kukis    schedule 31.10.2015