将Java日期转换为字符串,再将字符串转换回Date类型

4

在我的JSF托管bean中,我声明了startDate为java.utilDate类型,并且我也有getter和setter。从数据库获取的startDate是日期类型。

当我接收到值时,格式是默认类型,我需要格式化日期。

SimpleDateFormat df = new SimpleDateFormat(" dd MMM yyyy");
Date oneDate = new Date(startDate);
df.format(oneDate);

我面临的问题是df.format(oneDate)返回一个字符串。是否可以将df.format(oneDate)转换回日期,这样我就不需要更改我的startDate数据类型了。
非常感谢您的帮助。
谢谢。

2
只需使用parse()方法即可。然而,我无法看出它有什么用处。你最终可能会得到与开始时相同的Date对象。如果你打算在某个UI中以人类可读的方式格式化它,那就在呈现给人类的那一刻精确地进行格式化。 - BalusC
希望这可以帮助你:http://docs.oracle.com/javase/1.4.2/docs/api/java/text/SimpleDateFormat.html#parse(java.lang.String, java.text.ParsePosition) - user942821
为什么不扩展Date类并使用自己的toString方法呢? - James Black
1
@JamesBlack 那是一个非常糟糕的建议,我要说! - Marcelo
@BalusC 我同意您所说的,在 UI 中进行格式化更好。因此,我在我的 JSF 页面中添加了以下内容。<p:inputText value="#{vacationschedule.convertTime(vacationschedule.selectedRow.startDate)}" 并且 managedBean 中的 convertTime 方法是 public String convertTime(Date time){ Date date = new Date(); Format format = new SimpleDateFormat("yyyy MM dd"); return format.format(date); } <p:inputText 显示正确,但如果我想使用 <p:calendar,则会出现错误“SEVERE:java.lang.IllegalArgumentException:无法将给定的对象格式化为日期”。 - Jacob
4个回答

10

根据问题中的评论:

@BalusC 我同意你所说的,在UI中格式化更好。因此我在我的jsf页面中添加了以下内容。

<p:inputText value="#{vacationschedule.convertTime(vacationschedule.selectedRow.startDate)}">

在managedBean中,convertTime方法是什么意思?

public String convertTime(Date time){ 
    Date date = new Date(); 
    Format format = new SimpleDateFormat("yyyy MM dd"); 
    return format.format(date); 
} 

<p:inputText>正常显示,但如果想使用<p:calendar>,就会出现错误:

SEVERE: java.lang.IllegalArgumentException: Cannot format given Object as a Date

你正在错误的方向上寻找解决方法。人类可读格式化应该在视图(UI)一侧完成,而不是模型或控制器一侧。

要在JSF组件中以人类友好方式呈现一个Date对象,应该使用标准JSF组件集提供的<f:convertDateTime>标记:

<p:inputText value="#{vacationschedule.selectedRow.startDate}">
    <f:convertDateTime pattern="yyyy MM dd" />
</p:inputText>

这种方式可以始终保持属性只是Date。这样,您还可以保存编辑后的值(这在您最初的尝试中是不可能的!)。

至于PrimeFaces的<p:calendar>组件,它有一个pattern属性,专门用于此目的:

<p:calendar value="#{vacationschedule.selectedRow.startDate}" pattern="yyyy MM dd" />

下载并查阅PrimeFaces 用户指南,了解所有可用的属性。


非常感谢BalusC,这很有帮助。感谢您的出色回答。 - Jacob
但是我在<p:calendar>中显示日期时遇到了一个小问题,日期会显示为提前一天,即如果我选择的是2012年12月1日,它会显示为2012年12月2日。这是PrimeFaces的问题吗? - Jacob
1
不,这与时区有关。您的系统默认时区显然超出了GMT。Date默认为GMT。<p:calendar>默认为系统默认时区。使用timeZone属性来明确指定时区,例如timeZone="GMT"。另请参阅我在答案中链接的PrimeFaces用户指南文档。 - BalusC
BalusC,再次感谢。像你提到的那样,我在web.xml中添加了以下内容:<context-param> <param-name>javax.faces.DATETIMECONVERTER_DEFAULT_TIMEZONE_IS_SYSTEM_TIMEZONE</param-name> <param-value>true</param-value> </context-param>这解决了日期问题。非常感谢。 - Jacob
我有一个关于数据模式的问题。在我的jsf页面中,我有以下代码:<p:calendar value="#{bean.selectedRow.endDate}" pattern="dd-MMM-yyyy"。在UI中日期显示为“dd-MMM-yyyy”。但是当我在bean中接收值时,格式会更改为“Wed Feb 16 00:00:00 AST 2011”。如何确保即使在bean中也以与UI相同的格式获取日期?最佳实现方式是什么?谢谢 - Jacob
显示剩余2条评论

2

使用您创建的相同的SimpleDateFormat对象,

df.parse(yourDateString);

0

希望我的代码能对你有所帮助

public String dateToString(Date date, SimpleDateFormat formatter) {
    return formatter.format(date);
}

public Date stringToDate(String date, SimpleDateFormat formatter) {
    try {
        return formatter.parse(date);
    } catch (ParseException e) {
        //Catching exception
    }
    return null;
}

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接