表单提交后的LocalDateTime格式

时间:2013-11-04 10:15:00

标签: spring jsp jodatime spring-validator

我使用以下jQuery函数来格式化我的datepicker

$(".datepicker").datepicker({
                    dateFormat : "MM yy"
                }).attr('readonly', true);

选择后,我可以看到文本字段已正确设置为November 2013。在提交表单之前,我使用Spring验证来验证日期

public class LocalMonthEditor extends PropertyEditorSupport {
    @Override
    public void setAsText(final String text) throws IllegalArgumentException {
        if (!StringUtils.hasText(text)) {
            // Treat empty String as null value.
            setValue(null);
        } else {
            LocalDateTime localDateTime = LocalDateTime.parse(text,
                    DateTimeFormat.forPattern("MMMM yyyy"));
            setValue(localDateTime);
        }
    }

    @Override
    public void setValue(final Object value) {
        super.setValue(value == null || value instanceof LocalDateTime ? value
                : new LocalDateTime(value));
    }

    @Override
    public LocalDateTime getValue() {
        return (LocalDateTime) super.getValue();
    }

    @Override
    public String getAsText() {
        return getValue() != null ? getValue().toString() : "";

    }
}

但是,在提交表单后,文本字段将更改为2013-11-01T00:00:00.000。如何将字段保持为November 2013

2 个答案:

答案 0 :(得分:1)

首先,如果您需要的数据只是一个月和一年,为什么要使用Joda-Time?这就像上车开车到车道尽头的邮箱:额外的努力和复杂性没有任何好处。

相反,我建议您选择:

  • 跟踪一对变量(月,年)
  • 使用一对成员(月,年)定义您自己的类,并跟踪实例。
  • 使用字符串似乎是你的意图:“你想象的是”2013年11月“,或者像”2013-11“这样的简单方案。

其次,因为您创建了LocalDatetime的实例,所以在某些时候似乎会调用toStringtoStringLocalDateTime的默认输出以您看到的标准ISO 8601格式输出:2013-11-01T00:00:00.000。 LocalDateTime具有日期值时间值(因此名称),即使时间值可能设置为零(表示一天的开始)。所以这是一个功能,而不是一个错误。

我不知道Spring Validatation,也不知道你班级结构的其余部分。我猜你正在存储一个LocalDateTime实例而不是你想要(或应该)存储一个String实例。您可能需要阅读"model" versus "view"的主题。我们通常以不同于向用户呈现数据的方式跟踪幕后数据。在这种情况下,您可能应该在视图中使用字符串(“2013年11月”)持有一对intsIntegers(一个月,一个一年)。

答案 1 :(得分:0)

您正在将本地时间对象直接设置为文本字段,这就是您获取完整日期字符串的原因。使用parse()方法转换日期对象并进行设置。不要为日期创建新对象直接设置您的值。