Vaadin 瓦丁:如何更改日期格式?

Vaadin 瓦丁:如何更改日期格式?,vaadin,Vaadin,我从数据库中提取一个日期,将其重新指定为文本字段,然后将其转换为字符串(),但该日期显示为“2015年10月12日星期四0900”,此时我只需要MM/DD/YYYY格式。如何更改格式 Date myDatabaseDate = someDBGetMethod(); TextField myDateTF = new TextField() myDateTF.setCaption("My date is: "); myDateTF.setValue(myDatabase

我从数据库中提取一个日期,将其重新指定为文本字段,然后将其转换为字符串(),但该日期显示为“2015年10月12日星期四0900”,此时我只需要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);
  • 发生的事情:周四10月22日12:19:04 CDT 2015
  • 我想要的:2015年10月22日
提前谢谢你! 示例对我来说最有意义,因为我对vaadin非常陌生。

对象不包含任何如何将自己表示为字符串的信息。这是因为在不同的地方,社区以不同的方式记录日期。因此Java将日期操作与在屏幕上打印日期分开。 代码中缺少的是一个

但是,我强烈建议您使用Java8DatesAPI,因为Java7DatesAPI完全是一团糟。您可以在此处了解更多信息

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

所以问题是如何生成字符串表示

首先要知道Java包含两个名为“Date”的类:

令人困惑的是,它们并不平行。util one是一个日期加上UTC中的一天中的一个时间。SQLOne只表示日期,但设计得很糟糕;作为一种攻击,它将util one子类化,但将一天的时间更改为
00:00:00.000
。早期Java中的这些旧日期时间类非常混乱

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

java.time
LocalDate
由于
java.sql.Date
是与早期java捆绑在一起的旧的笨重的日期时间类之一,我们应该转换为在Java8和更高版本中内置的框架中发现的新类。看

对于仅日期值,java.time提供了类。名称中的“本地”指的是任何地方,而不是特定的地方。它代表了日期的模糊概念,但与时间线无关。例如,巴黎的约会开始时间比蒙特勒尔早。如果您关心时间轴上的确切时刻,那么应该使用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
,您可以调用包来格式化本地化的字符串,以便于用户阅读。指定用户期望的值

DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDate( FormatStyle.FULL ).withLocale( Locale.CANADA_FRENCH );
String output = localDate.format( formatter );
示例输出:

2015年11月1日迪曼奇

ZoneDateTime

让我们考虑一下,如果你得到了一个而不是<代码> java .sql。日期< /c> > /p> 我们可以将

java.sql.Timestamp
转换为
即时
,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 );
示例输出:

迪曼奇2015年11月1日东部时间2小时24分


你检查过房间了吗?它们是专门为日期操作而设计的。除了为此使用DateField之外,如果您只想显示它,那么它就像java中的任何地方一样,您需要一个DateFormat类。例如
DateTimeFormatter formatter = DateTimeFormatter.ofLocalizedDateTime ( FormatStyle.FULL ).withLocale ( Locale.CANADA_FRENCH );
String output = zdt.format ( formatter );