当前位置: 首页 > 面试题库 >

具有父级且没有分隔符的DateTimeFormatter模式不起作用

相云
2023-03-14
问题内容

由生成的解析器DateTimeFormatter.ofPattern表现出以下有趣的行为,这阻止了我编写模式来解析字符串,例如20150100

System.out.println(DateTimeFormatter.ofPattern("yyyyMM").parse("201501", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'aa'").parse("201501aa", YearMonth::from)); // works
System.out.println(DateTimeFormatter.ofPattern("yyyyMM'00'").parse("20150100", YearMonth::from));
// java.time.format.DateTimeParseException: Text '20150100' could not be parsed at index 0

我调试了代码,似乎问题是由年份字段解析超出了字符串的末尾引起的(三个y的最大宽度始终为19)。但是,我不明白如果没有最后的'00'文字,它如何对模式起作用。

有什么办法可以不必使用格式化程序生成器来解决此问题?

编辑:

由于下面的Jarrod确认这是越野车,因此我进行了更多的谷歌搜索,最后找到了错误报告:

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8031085

http://bugs.java.com/bugdatabase/view_bug.do?bug_id=8032491

两者都只在Java 9中修复了......


问题答案:

中有一个错误DateTimePrinterParser

我逐步调试了整个过程,显然您不能将数字用作文字。如果从头到尾调试所有方法,则类似的测试代码也可以证明这一点DateTimeFormatterBuilder.parse()

显然,如果Value(YearOfEra,4,19,EXCEEDS_PAD)解析器 不是*
数字,则解析器将消耗00它们停在的位置,因为解析器正在寻找数字到数字的长度。该嵌入的是错误的。


*4``19``DateTimeFormatter``DateTimeParseContext

如果您像使用非数字字符文字一样使用xx它,那么数字文字则不会。

这两个均失败:

final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'00'");
System.out.println(sdf.parse("20150100"));

线程“主”中的异常java.text.ParseException:无法解析的日期:java.text.DateFormat.parse(DateFormat.java:366)处的“
20150100”

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMM'00'");
System.out.println(dateTimeFormatter.parse("20150100", YearMonth::from));

线程“主”中的异常java.time.format.DateTimeParseException:无法在java.time.format.DateTimeFormatter的java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:1949)的索引0处解析文本“
20150100” .parse(DateTimeFormatter.java:1851)

这些都成功:

final SimpleDateFormat sdf = new SimpleDateFormat("yyyyMM'xx'");
System.out.println(sdf.parse("201501xx"));

美国东部时间2015年1月1日星期四00:00:00

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyyMM'xx'");
System.out.println(dateTimeFormatter.parse("201501xx", YearMonth::from));

2015-01



 类似资料:
  • 我在使用Java8的LocalDate和DateTimeFormatterBuilder解析这些日期时遇到了困难。 下面是我尝试解析日期的方法: 执行将引发以下异常:

  • 我正在尝试SpringBoot QuickStart(http://projects.spring.io/spring-boot/#quick-start)中的简单示例。使用spring-boot-starter-parent作为父级运行良好。我可以运行样本没有任何问题。但我绝对需要用我自己的父母POM。因此,我阅读了以下文档:http://docs.spring.io/spring-boot/d

  • 问题内容: 我有一个视图,其中父div上具有ng-if,而某些子元素上具有ng-show。嵌套在带有ng-if的元素下时,ng- show似乎无法正常工作。这是Angular错误还是我做错了什么? 见这个矮子。 HTML: JavaScript: 谢谢, 安迪 问题答案: 与指令不同,它 创建了一个新的作用域* 。 * 因此,当您在内部编写内容时,您是在子范围而非主范围上设置属性。 要解决此问题,

  • 问题内容: 我正在尝试让我的Spring MVC应用程序与Spring @Secured批注和AspectJ自动代理一起很好地使用,但是它似乎并没有代理或识别我的@Secured批注。我有一个像这样的控制器: 春季安全性XML如下所示: 码: 上面的内容是由无XML的Spring @Configuration组件加载的,如下所示: 依次使用Servlet 3.0 WebApplicationIni

  • 我正在使用3个标签构建一个像WhatsApp一样的应用程序,每个标签都有一个< code >片段。在我的第一个< code >片段中,我有一个< code > recycle view 。 赢取一套SectionsPager适配器,开始宽度Recy,如下图所示: 它给了我这个错误: E/AndroidRuntime:致命异常:主进程:com.deraah.mohamed。deraahpro,PID

  • 问题内容: 我需要在SQL Server 2012中将一列中的字符串拆分为一个字符,并将每个字符串拆分成它自己的列。 例如:如果我有一个栏,我需要把它拆分成,,,,,与每个这些转化为自己列。 要拆分的列的长度可能会有所不同,因此我需要使其尽可能地动态。 问题答案: 您可以这样做: 输出: 这是动态版本: