如果找不到该字段,parseDefaulting将设置该字段的值,即使对于不在该模式中的字段也是如此,因此您最终可能会遇到解析结果中存在年份和年份的情况.

对我来说,最简单的解决方案是在评论中建议的:检查输入是否包含带有正则表达式的年份(或看起来像一个数字的东西,例如4位数),或检查输入的长度,然后创建格式化程序相应的(没有默认值).例子:

if (input_without_year) {

LocalDate d = MonthDay

.parse("12/06", DateTimeFormatter.ofPattern("MM/dd"))

.atYear(1970);

} else {

// use formatter with year, without default values

}

但如果你想要一个通用的解决方案,我担心它会更复杂.另一种方法是解析输入并检查其中是否有任何年份字段.如果没有,那么我们将其更改为返回年份的默认值:

public static TemporalAccessor parse(String pattern, String input) {

DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, Locale.ROOT);

final TemporalAccessor parsed = fmt.parse(input);

// check year and year of era

boolean hasYear = parsed.isSupported(ChronoField.YEAR);

boolean hasYearEra = parsed.isSupported(ChronoField.YEAR_OF_ERA);

if (!hasYear && !hasYearEra) {

// parsed value doesn't have any year field

// return another TemporalAccessor with default value for year

// using year 1970 - change it to Year.now().getValue() for current year

return withYear(parsed, 1970); // see this method's code below

}

return parsed;

}

首先,我们解析并获取包含所有已解析字段的TemporalAccessor.然后我们检查它是否有年份或年份字段.如果它没有任何这些,我们创建另一个具有年份默认值的TemporalAccessor.

在上面的代码中,我使用1970,但您可以将其更改为您需要的任何内容. withYear方法有一些重要的细节需要注意:

>我假设输入总是有月和日.如果不是这种情况,您可以更改下面的代码以使用它们的默认值

>要检查字段是否存在,请使用isSupported方法

withYear方法如下:

public static TemporalAccessor withYear(TemporalAccessor t, long year) {

return new TemporalAccessor() {

@Override

public boolean isSupported(TemporalField field) {

// epoch day is used by LocalDate.from

if (field == ChronoField.YEAR_OF_ERA || field == ChronoField.EPOCH_DAY) {

return true;

} else {

return t.isSupported(field);

}

}

@Override

public long getLong(TemporalField field) {

if (field == ChronoField.YEAR_OF_ERA) {

return year;

// epoch day is used by LocalDate.from

} else if (field == ChronoField.EPOCH_DAY) {

// Assuming the input always have month and day

// If that's not the case, you can change the code to use default values as well,

// and use MonthDay.of(month, day)

return MonthDay.from(t).atYear((int) year).toEpochDay();

} else {

return t.getLong(field);

}

}

};

}

现在这个工作:

System.out.println(LocalDate.from(parse("MM/dd", "12/06"))); // 1970-12-06

System.out.println(LocalDate.from(parse("uuuu/MM/dd", "2018/12/06"))); // 2018-12-06

System.out.println(LocalDate.from(parse("yyyy/MM/dd", "2018/12/06"))); // 2018-12-06

但我仍然认为第一种解决方案更简单.

替代

假设您总是创建LocalDate,另一种方法是使用parseBest:

public static LocalDate parseLocalDate(String pattern, String input) {

DateTimeFormatter fmt = DateTimeFormatter.ofPattern(pattern, Locale.ROOT);

// try to create a LocalDate first

// if not possible, try to create a MonthDay

TemporalAccessor parsed = fmt.parseBest(input, LocalDate::from, MonthDay::from);

LocalDate dt = null;

// check which type was created by the parser

if (parsed instanceof LocalDate) {

dt = (LocalDate) parsed;

} else if (parsed instanceof MonthDay) {

// using year 1970 - change it to Year.now().getValue() for current year

dt = ((MonthDay) parsed).atYear(1970);

} // else etc... - do as many checkings you need to handle all possible cases

return dt;

}

然后我检查返回的类型并采取相应的行动.您可以展开它以检查所需的类型,也可以编写自己的TemporalQuery来处理特定情况.

有了这个,所有案例也有效:

System.out.println(parseLocalDate("MM/dd", "12/06")); // 1970-12-06

System.out.println(parseLocalDate("uuuu/MM/dd", "2018/12/06")); // 2018-12-06

System.out.println(parseLocalDate("yyyy/MM/dd", "2018/12/06")); // 2018-12-06

java 时间回退_java.time DateTimeFormatter使用灵活的回退值进行解析相关推荐

  1. java 时间判断_java怎样判断日期的先后?

    展开全部 Java判段两个日期的先后,方法如下: import java.util.Date; import java.text.ParseException; import java.text.Si ...

  2. java时间随机数_java开发代码工具类(时间戳/随机数/日期等)

    简介 java开发代码工具类,提高开发效率,持续更新~ 实践 package com.springboot.sixmonth.common.util; import java.math.BigInte ...

  3. java时间代码_java获取当前时间的四种方法代码实例

    这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:Date类 public class ...

  4. java 时间处理_JAVA处理日期时间常用方法

    Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了 ...

  5. java时间方法_JAVA处理日期时间常用方法

    转载JAVA处理日期时间常用方法: 1.java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日 ...

  6. 获取java时间 小时_Java 如何获取当前时间前一个小时的时间

    在网上找好多类似文章或者帖子,绝大部分都是不正确和不准确的,都是互相转来转去的.下面是我自己通过研究Java API得出正确获取当前时间前一小时的时间正确方法. public static void ...

  7. java时间代码_java处理日期时间代码

    public static String FORMATE_DATE_STR = "yyyy-MM-dd"; public static String FORMATE_TIME_ST ...

  8. java时间规范化_Java日期时间使用总结

    一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中 ...

  9. java 时间类_Java日期和时间类简介

    Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...

最新文章

  1. 【组队学习】【27期】青少年编程(Turtle)
  2. 关于VS项目平台的x86,x64,Any CPU以及Debug和Release
  3. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
  4. 飞桨PaddleOCR环境搭建
  5. Git中pull,commit和push的概念
  6. 智能卡门禁管理系统_综合门禁管理信息系统相关技术及未来准备
  7. spring框架_一篇文章带你理解Spring框架
  8. SDWebImage实现原理(怎么实现图片缓存器)
  9. 流程平台:子表控件(二) - 属性、事件、方法
  10. ●BZOJ 1855 [Scoi2010]股票交易
  11. shell获取命令返回结果前多少行(n行)
  12. Number类型及方法(js)
  13. 使用ZLIB对datasetProvider.data数据包进行压缩传输的测试
  14. Docker使用link建立容器之间的连接
  15. 组内连续三个或三个以上Repeated Measures ANOVA
  16. 数学狂想曲(十三)——勾股定理, Menelaus‘ Theorem
  17. linux系统管理员基础
  18. 学术应用使用node-http-proxy集成谷歌学术
  19. java初学求一个数的绝对值
  20. IMS/SIP - GCF IMS相关认证测试如何通过看case procedure来得知哪些field/IE必须带?

热门文章

  1. 高收益债券与杠杆收购:中国机会
  2. Linux下snmp常用的OID ---- SNMP硬件监控
  3. 半自动化运维之快速连接到指定环境(一)
  4. Redhat 设置cntlm代理步骤
  5. SaltStack之target
  6. CCNA笔记之第十四节:RIP协议(1)
  7. 在Windows XP中轻松发传真
  8. VIM - 01. 标准模式 - 下简单操作
  9. (一)STL体系结构基础介绍
  10. mac 卸载 node并重新安装