java 时间回退_java.time DateTimeFormatter使用灵活的回退值进行解析
如果找不到该字段,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使用灵活的回退值进行解析相关推荐
- java 时间判断_java怎样判断日期的先后?
展开全部 Java判段两个日期的先后,方法如下: import java.util.Date; import java.text.ParseException; import java.text.Si ...
- java时间随机数_java开发代码工具类(时间戳/随机数/日期等)
简介 java开发代码工具类,提高开发效率,持续更新~ 实践 package com.springboot.sixmonth.common.util; import java.math.BigInte ...
- java时间代码_java获取当前时间的四种方法代码实例
这篇文章主要介绍了java获取当前时间的四种方法代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 第一种:Date类 public class ...
- java 时间处理_JAVA处理日期时间常用方法
Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日历字段之间的转换提供了一些方法,并为操作日历字段(例如获得下星期的日期)提供了 ...
- java时间方法_JAVA处理日期时间常用方法
转载JAVA处理日期时间常用方法: 1.java.util.Calendar Calendar 类是一个抽象类,它为特定瞬间与一组诸如 YEAR.MONTH.DAY_OF_MONTH.HOUR 等 日 ...
- 获取java时间 小时_Java 如何获取当前时间前一个小时的时间
在网上找好多类似文章或者帖子,绝大部分都是不正确和不准确的,都是互相转来转去的.下面是我自己通过研究Java API得出正确获取当前时间前一小时的时间正确方法. public static void ...
- java时间代码_java处理日期时间代码
public static String FORMATE_DATE_STR = "yyyy-MM-dd"; public static String FORMATE_TIME_ST ...
- java时间规范化_Java日期时间使用总结
一.Java中的日期概述 日期在Java中是一块非常复杂的内容,对于一个日期在不同的语言国别环境中,日期的国际化,日期和时间之间的转换,日期的加减运算,日期的展示格式都是非常复杂的问题. 在Java中 ...
- java 时间类_Java日期和时间类简介
Java 的日期和时间类位于 java.util 包中.利用日期时间类提供的方法,可以获取当前的日期和时间,创建日期和时间参数,计算和比较时间. Date 类 Date 类是 Java 中的日期时间类 ...
最新文章
- 【组队学习】【27期】青少年编程(Turtle)
- 关于VS项目平台的x86,x64,Any CPU以及Debug和Release
- python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景
- 飞桨PaddleOCR环境搭建
- Git中pull,commit和push的概念
- 智能卡门禁管理系统_综合门禁管理信息系统相关技术及未来准备
- spring框架_一篇文章带你理解Spring框架
- SDWebImage实现原理(怎么实现图片缓存器)
- 流程平台:子表控件(二) - 属性、事件、方法
- ●BZOJ 1855 [Scoi2010]股票交易
- shell获取命令返回结果前多少行(n行)
- Number类型及方法(js)
- 使用ZLIB对datasetProvider.data数据包进行压缩传输的测试
- Docker使用link建立容器之间的连接
- 组内连续三个或三个以上Repeated Measures ANOVA
- 数学狂想曲(十三)——勾股定理, Menelaus‘ Theorem
- linux系统管理员基础
- 学术应用使用node-http-proxy集成谷歌学术
- java初学求一个数的绝对值
- IMS/SIP - GCF IMS相关认证测试如何通过看case procedure来得知哪些field/IE必须带?