Vaadin:如何更改日期格式?

时间:2015-10-29 18:43:37

标签: vaadin

我从数据库中提取日期,将其重新分配为TextField,然后更改为toString()它,但是当我需要的是MM / DD / YYYY格式时,日期出现“2015年10月12日星期四”。如何更改格式?

  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);
  • 发生了什么:2015年10月22日12:19:04 CDT 2015
  • 我想要的:2015年10月22日

提前谢谢! 例子对我来说最有意义,因为我对vaadin很新。

2 个答案:

答案 0 :(得分:2)

Vaadin不是问题

如果尝试显示日期时间对象的字符串表示,则Vaadin不是问题的一部分。 Vaadin提供了一个小部件DateField,供用户选择日期时间值。您不需要该小部件来简单地显示字符串表示。要显示,请使用问题中描述的TextField

所以问题是如何生成String表示。

首先请注意,Java包含两个名为“Date”的类:

令人困惑的是,他们并不平行。 util 一个是日期加上UTC的时间。 sql 一个用于表示仅限日期,但设计不佳;作为一个hack它是util的子类,但是将时间改为00:00:00.000。早期Java中的这些旧的日期时间类是一个糟糕的混乱。

从数据库中,您应该接收后者java.sql.Date,以获取仅限日期的存储值。如果您要存储日期时间值,那么您应该从JDBC驱动程序中获取java.sql.Timestamp个对象。

java.time LocalDate

由于java.sql.Date是与早期Java捆绑在一起的旧的笨重的日期时间类之一,我们应该转换为在Java 8及更高版本中内置的java.time框架中找到的新类。请参阅Tutorial

对于仅限日期的值,java.time提供LocalDate类。名称中的“本地”是指任何位置而不是特定位置。它代表了日期的模糊概念,但与时间表无关。例如,巴黎的日期早于蒙特利尔。如果您关心时间轴上的确切时刻,那么您将使用java.sql.Timestamp而不是java.sql.Date。

从java.sql.Date转换为java.time.LocalDate是一个简单的单行,因为a conversion method是为您提供的。

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 );

示例输出:

  

dimanche 1 novembre 2015

ZonedDateTime

让我们考虑一下你是否得到java.sql.Timestamp而不是java.sql.Date

我们可以在UTC时间轴上的一个时刻从java.sql.Timestamp转换为Instant

Instant instant = myTimestamp.toInstant();

接下来,指定时区。

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

我们使用java.time.format包来创建String表示。请注意链接的调用,第二个调用特定的Locale。如果未指定,则隐式应用JVM的当前默认Locale。最好是明确的。

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

示例输出:

  

dimanche 1 novembre 2015 2 h 24 EST

答案 1 :(得分:1)

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是一个混乱。您可以在此处详细了解What's wrong with Java Date & Time API?