0

我使用以下 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

4

2 回答 2

1

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

相反,我建议您选择:

  • 跟踪一对变量(月、年)
  • 使用一对成员(月、年)定义您自己的类,并跟踪一个实例。
  • 使用字符串似乎是您的意图:您似乎正在考虑“2013 年 11 月”,或者使用更简单的方案,例如“2013-11”。

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

我不知道Spring Validatation也不知道你的其他类结构。我猜你正在存储一个LocalDateTime实例,而不是你打算(或应该)存储一个String实例。您可能需要阅读“模型”与“视图”的主题。通常,我们在幕后跟踪数据的方式与向用户提供数据的方式不同。在这种情况下,您可能应该在模型中保存一对整数整数(一个代表月份,一个代表年份),并在您的视图中显示一个字符串(“2013 年 11 月”)。

于 2013-11-05T06:22:56.527 回答
0

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

于 2013-11-04T17:53:06.777 回答