gpt4 book ai didi

spring - 多种模式的绑定(bind)日期

转载 作者:行者123 更新时间:2023-12-03 02:28:50 25 4
gpt4 key购买 nike

我曾经使用 Spring 在绑定(bind)中支持 Java DateJoda Localdate 模式 DateTimeFormat pattern像这样的属性

@DateTimeFormat(pattern = "dd.MM.yyyy")
private LocalDate creationDate;

但我需要支持两种日期模式,例如:

如果用户输入 31/12/199931/12/99,那么它们都可以绑定(bind)到相同的值 31/12/1999。是否可以为 @DateTimeFormat 定义两种模式?

编辑:

我尝试将模式更改为

@DateTimeFormat(pattern = "dd.MM.yy")
private LocalDate creationDate;

我发现它可以处理这两种情况(例如,当用户输入 31/12/199931/12/99 时)两者都绑定(bind)到 1999 年 12 月 31 日。有意见吗?

最佳答案

在我看来,spring 注释 @DateTimeFormat 绑定(bind)到 LocalDate 类型的属性将导致 Spring 选择 JodaTime-Formatter,而不是标准格式化程序,否则 Spring 将无法成功将任何输入字符串解析为 LocalDate 类型的对象。 。此声明是根据Spring source code的分析完成的。 (参见方法 getParser(DateTimeFormat annotation, Class<?> fieldType) 的实现)。

如果是这样,那么问题仍然是为什么您的解决方法和解决方案“dd.MM.yy”能够解析两位数年份以及正常的四位数年份。答案可以在 Joda 源代码和文档中找到。

org.joda.time.format.DateTimeFormat

源代码摘录 (私有(private)方法 parsePatternTo(DateTimeFormatterBuilder builder, String pattern) 中对 JodaTime 的模式分析):

    case 'y': // year (number)
case 'Y': // year of era (number)
if (tokenLen == 2) {
boolean lenientParse = true;
// Peek ahead to next token.
if (i + 1 < length) {
indexRef[0]++;
if (isNumericToken(parseToken(pattern, indexRef))) {
// If next token is a number, cannot support
// lenient parse, because it will consume digits that it should not.
lenientParse = false;
}
indexRef[0]--;
}
// Use pivots which are compatible with SimpleDateFormat.
switch (c) {
case 'x':
builder.appendTwoDigitWeekyear(new DateTime().getWeekyear() - 30, lenientParse);
break;
case 'y':
case 'Y':
default:
builder.appendTwoDigitYear(new DateTime().getYear() - 30, lenientParse);
break;
}

因此我们认识到 JodaTime 将模式表达式“yy”转换为对构建器方法 appendTwoDigitYear() 的调用将参数 lenientParse 设置为 true 。同样有趣的是,所选的枢轴年偏离了通常的 Joda 设置(+/-50 年),即(-80/+20 年)。

Javadoc of mentioned builder-method据说:

“lenientParse - 当为 true 时,如果数字计数不是 2,则被视为绝对年份”

这充分解释了为什么“dd.mm.yy”可以像解析四位数年份一样解析两位数年份。

关于spring - 多种模式的绑定(bind)日期,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21726133/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com