如何在Struts2中更改默认日期格式?

3
我正在开发一个多语言的Struts2应用程序,其中有很多操作涉及到Calendar属性。默认类型转换大多数情况下都能正常工作,但在某些地区,我希望更改使用的默认格式。
具体而言,我想让英语环境下的日期遵循yyyy-MM-dd格式。但是,这样做不起作用(奇怪的是yyyy-MM-dd HH:mm可以正常工作,但在这种情况下,我不想包含时间部分),因为Struts2期望英语环境下的日期外观不同。
因此,我希望更改转换的预期格式。我正在寻找一个明智的解决方案。我已经尝试过的选项:
  • A)自己编写StrutsTypeConverter。这应该可以解决问题,但我无法将package.properties文件中指定的格式注入其中。
  • B)更改getter/setter对,改用String - 可以正常工作,但这不是一个明智的解决方案。
如何修复解决方案A? 还是有其他的方法吗?当然,如果可以完全在配置中完成,那就是最好的。

好问题。请注意,您应该始终使用 yyyy-MM-dd,因为它是 RFC 3339 规定的格式。然后,在 HTML5 兼容的浏览器(例如 Chrome)上使用 <input type="date"/> 时,它将根据正确的区域设置(例如在意大利为 dd/MM/yyyy,在美国为 MM/dd/yyyy显示日期,但始终向服务器发送 yyyy-MM-dd。然后,在没有 HTML5 日期支持的浏览器(例如 Firefox)上,您将回退到 JavaScript 日历,它将发送它将显示的内容,您最终将向用户呈现丑陋的 yyyy-MM-dd - Andrea Ligios
顺便提一下,目前我们只使用两种语言环境。在匈牙利语环境中,我们使用 yyyy.MM.dd.,这在 Struts2 中是默认的。但在英语环境中,我们的客户习惯于使用 yyyy-MM-dd,这在 Struts2 中并不适用(yyyy/MM/dd 是 Struts2 的默认设置)。 - meskobalazs
自定义日期转换器是一个不错的选择。 - Aleksandr M
1
我已经开了一个JIRA来处理仅日期的RFC3339,让我们期待并保持关注。 - Andrea Ligios
@meskobalazs 好的,从下一个2.3.x版本开始,yyyy-MM-dd将被自动处理 :) - Andrea Ligios
1
@AndreaLigios 做得好! - meskobalazs
1个回答

2

好的,我找到了解决我手头问题的方法,不过我认为这个问题可以以更合理的方式解决。无论如何,我会发布我的自定义类型转换器:

public class DateConverter extends StrutsTypeConverter {

    private DateFormat dateFormat;

    {
        ActionContext ctx = ActionContext.getContext();
        ActionSupport action = (ActionSupport) ctx.getActionInvocation().getAction();
        String formatString = action.getText("dateformat.ui");
        dateFormat = new SimpleDateFormat(formatString);
    }

    public Object convertFromString(Map context, String[] values, Class toClass) {
        String input = values[0];
        try {
            Date date = dateFormat.parse(input);
            Calendar cal = Calendar.getInstance();
            cal.setTime(date);
            return cal;
        } catch (ParseException e) {
            return null;
        }
    }

    public String convertToString(Map context, Object object) {
        Calendar cal = (Calendar) object;
        return dateFormat.format(cal.getTime());
    }

}

我删除了代码中不必要的部分,但这是一个可行的解决方案。


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