Struts2 日期转换
对于日期,Struts2使用SHORT
Locale
与当前请求关联的格式。
这意味着如果您使用的是印度语言环境,格式是dd/MM/yy
,因此您可以安全地输入13/01/1988
JSP 并成功地将其转换为java.util.Date
操作中的对象。
如果您使用的是美国语言环境,格式为MM/dd/yy
,则需要插入01/13/1988
,否则将无法正常工作。
ISO8601 和 RFC3339
为了处理这类问题,多年前国际标准组织制定了ISO 8601标准:
ISO 8601 数据元素和交换格式 - 信息交换 - 日期和时间的表示是涵盖日期和时间相关数据交换的国际标准。它由国际标准化组织 (ISO) 发布,于 1988 年首次发布。该标准的目的是提供一种明确且定义明确的日期和时间表示方法,以避免对日期的数字表示形式的误解和时间,特别是当数据在具有不同书写数字日期和时间惯例的国家之间传输时。
ISO 8601 日期格式是yyyy-MM-dd
,您正在使用的格式。
在 HTML5 生态系统(日期选择器等)中选择并采用了 ISO 8601 的特定配置文件,并在RFC 3339中进行了描述。
它的完整表示略有不同,但仅日期格式是相同的 ( yyyy-MM-dd
)。
Struts2-jQuery-plugin 的<sj:datepicker>
标签日期格式应该已经默认为yy-MM-dd
, IIRC。
把事情做好
以这种格式输入的日期的自动转换最近被引入并且在Struts 2.5 (beta) 中可用。它也应该在下一个版本(2.3.25+)中发布。
否则,您需要创建一个转换器,如下所示:
public class RFC3339Converter extends StrutsTypeConverter{
@Override
public String convertToString(Map context, Object o) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
return sdf.format(o);
}
@Override
public Object convertFromString(Map context, String[] values, Class toClass) {
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
try {
return (values[0].length()==0) ? null : (Date) sdf.parse(values[0]);
} catch (ParseException e) {
return values[0];
}
}
}
你可知道... ?
浏览器(可能)具有本机日期选择器,您可以将其与 JavaScript 日期选择器的优雅降级一起使用,如本答案中所述。