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

Java 8 DateTimeFormatter解析不同重要性的可选小数秒

西门品
2023-03-14
问题内容

我的MCVE(作为TestNG单元测试):

public class MyDateTimeFormatterTest {

    private static final String BASE_PATTERN = "yyyy/MM/dd HH:mm:ss";
    private static final DateTimeFormatter FORMATTER =
            DateTimeFormatter.ofPattern(BASE_PATTERN + "[.SSSSSSSSS]");
    private static final LocalDateTime TEST_INPUT =
            LocalDateTime.of(2015, 5, 4, 12, 34, 56, 123456789);

    @DataProvider(name = "test-cases")
    public Iterator<Object[]> getTestCases() {
        return Arrays.asList(testFor("", ChronoUnit.SECONDS),
                testFor(".SSS", ChronoUnit.MILLIS),
                testFor(".SSSSSS", ChronoUnit.MICROS),
                testFor(".SSSSSSSSS", ChronoUnit.NANOS)).iterator();
    }

    @Test(dataProvider = "test-cases")
    public void testWithDefaultResolution(String input, LocalDateTime output) {
        assertThat(FORMATTER.parse(input, LocalDateTime::from), equalTo(output));
    }

    private Object[] testFor(String patternSuffix, TemporalUnit truncatedTo) {
        return new Object[] { DateTimeFormatter.ofPattern(BASE_PATTERN + patternSuffix)
                .format(TEST_INPUT), TEST_INPUT.truncatedTo(truncatedTo) };
    }
}

我想测试的日期时间解析String不同意义的可选的小数秒
使用DateTimeFormatter。Javadoc的相关部分内容如下:

分数 :以秒为单位输出毫微秒的字段。毫微秒的值具有9位数字,因此,图案字母的计数为1到9。如果小于9,则毫微秒的值将被截断,仅输出最高有效位。

基于我的有限理解,我曾经[...]将小数秒标记为可选,并且由于我对各种意义都感兴趣,因此我认为我应该坚持SSSSSSSSS

但是,单元测试无法解析
毫秒和微秒,即第二种和第三种情况。将更ResolverStyle改为LENIENT此处无济于事,因为它在解析阶段失败,而不是解析失败。

我可以知道应该考虑采用哪种方法来解决我的问题吗?我应该使用DateTimeFormatterBuilder可选地指定每个小数位数(9次),还是我的模式有“更智能”的方式?

编辑 我最终找到了自己的答案…仍然会在一天之内未解决该问题,并查看是否有其他方法。


问题答案:

太好了,再进行15分钟的故障排除会得出以下结果:

private static final DateTimeFormatter FORMATTER = 
    new DateTimeFormatterBuilder().appendPattern(BASE_PATTERN) // .parseLenient()
        .appendFraction(ChronoField.NANO_OF_SECOND, 0, 9, true).toFormatter();

编辑 parseLenient()是可选的。



 类似资料:
  • 我有一个简单的问题:我希望严格地以的格式解析Java字符串,以便是有效日期,而不是。假设这些是正常公历的广告日期。 我试图使用JDK8中新的包来解决这个问题,但事实证明它比希望的要复杂。我当前的代码是: 如何使用来解决我的简单用例?

  • 该页面主要反馈和分析项目运行过程中性能相关参数的具体使用情况。这些参数均是我们经过大量的项目优化所总结下来的经验参数。研发团队通过该项分析可以快速定位项目运行时的主要性能瓶颈。我们认为,对于重要参数所反映出的性能瓶颈进行有针对性的优化可以为项目带来大幅度的性能提升。目前,UWA所提供的重要性能参数主要有: Instantiate实例化操作 以上图表主要展示项目运行过程中 “Instantiate实

  • 鉴于以下类: 和以下设置: 当我尝试解析ServiceA和ServiceB时,它们都得到一个具有相同URL的HttpClient。 我如何更改DI中的注册,使每个服务都得到正确的HttpClient注入? TIA /Søren

  • 我正在尝试制作一个正则表达式字符串,从报告文件中提取数据。棘手的部分是我需要这个单一的正则表达式字符串来匹配多种报告文件内容格式。我希望正则表达式始终匹配,即使没有找到一些可选的组。 取以下报告文件内容(注意:#2 缺少“val2”部分): 文件#1:“-val1-test-val2-的结果-val3-做-” 预期结果: Val1组:测试 Val2组:结果 Val3组:完成 < li >预期结果:

  • 请考虑以下情况: 这将无法编译,并出现关于< code>A::A的不明确重载的错误。两个候选人都被认为是可行的,因为要求很简单: 其次,为了使 成为一个可行的函数,每个参数都应该存在一个隐式转换序列 (13.3.3.1),该序列将该参数转换为 的相应参数。 虽然有一个从<code>double</code>到<code>int</code>的隐式转换序列,但<code>A(int)</code>重