我从数据库中提取日期,将其重新分配为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);
提前谢谢! 例子对我来说最有意义,因为我对vaadin很新。
答案 0 :(得分:2)
如果尝试显示日期时间对象的字符串表示,则Vaadin不是问题的一部分。 Vaadin提供了一个小部件DateField
,供用户选择日期时间值。您不需要该小部件来简单地显示字符串表示。要显示,请使用问题中描述的TextField
。
所以问题是如何生成String表示。
首先请注意,Java包含两个名为“Date”的类:
令人困惑的是,他们并不平行。 util 一个是日期加上UTC的时间。 sql 一个用于表示仅限日期,但设计不佳;作为一个hack它是util的子类,但是将时间改为00:00:00.000
。早期Java中的这些旧的日期时间类是一个糟糕的混乱。
从数据库中,您应该接收后者java.sql.Date,以获取仅限日期的存储值。如果您要存储日期时间值,那么您应该从JDBC驱动程序中获取java.sql.Timestamp
个对象。
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?