当前位置: 首页 > 知识库问答 >
问题:

尝试多个模式解析java.time

鲜于宏义
2023-03-14

我们有一个库,用户可以以多种格式传入日期。它们遵循ISO,但有时会缩写。

或者更好的是,是否有某种方法可以解析一个字符串,并且如果字符串对任何日期[时间]都有意义,它会尝试一切可能的方法并返回一个时态对象?

共有1个答案

伯君浩
2023-03-14

如果没有一个完整的规范,就很难给出一个精确的建议。通常用于可变格式的技术包括:

  1. 依次尝试多种已知格式。
  2. 格式模式中的可选部分。
  3. DateTimeFormatterBuilder.ParseDefaulting()查找分析字符串中可能不存在的部分。
  4. 如您所知,parsebest.

我假设y-M-d总是按照这个顺序出现(例如,从来不是M-d-y或d-M-y)。19-3-12与ISO 8601冲突,因为该标准要求(至少)4位年和2位月。一个2位数年份的挑战是猜测世纪:这是1919年还是2019年,或者可能是2119年?

    DateTimeFormatter formatter = new DateTimeFormatterBuilder()
            .appendPattern("[uuuu][uu]-M-d")
            .optionalStart()
            .appendLiteral('T')
            .append(DateTimeFormatter.ISO_LOCAL_TIME)
            .optionalEnd()
            .toFormatter();

    TemporalAccessor dt = formatter.parseBest("19-3-12", LocalDateTime::from, LocalDate::from);
    System.out.println(dt.getClass());
    System.out.println(dt);
class java.time.LocalDate
2019-03-12

我认为它应该与您描述的格式的变化一起工作。让我们试试另一个例子:

    dt = formatter.parseBest( "2019-03-12T13:12:45.1234", LocalDateTime::from, LocalDate::from);
    System.out.println(dt.getClass());
    System.out.println(dt);
class java.time.LocalDateTime
2019-03-12T13:12:45.123400

控制2位数年份的解释,可以使用DateTimeFormatterBuilder.AppendValuerEduced()的重载变体之一。我建议你考虑在它上面进行范围检查。

 类似资料:
  • 解释器模式 解释器模式虽然听上去有些费解,但是如果用示例说明一下就不难理解了。我们知道在C语言中,关于变量的定义是这样的:一个不以数字开始的由字母、数字和下划线构成的字符串。这种形式的表达式可以用状态自动机解决,当然也可以用解释器的方式解决。 typedef struct _Interpret { int type; void* (*process)(void* pDa

  • 面试高频题1: 题目:抖音的盈利模式 答案解析: 1. B2B 收入 抖音利用网红和品牌合作的伙伴关系盈利 2. 品牌滤镜 在抖音上,用户可以给短视频添加滤镜。一些品牌可能会为用户添加专属滤镜,让用户把品牌添加到他们的视频里面。然后,他们可能会请网红主播用这个滤镜拍摄短视频,其他用户看到之后就会跟着使用。一些品牌方可能会造势和滤镜搭配宣传。 在抖音上,用户可以创建音频并上传到平台供其他人使用。这个

  • 使用DateTimeFormatter仅解析LocalTime变量的“Time of Day”时出现问题。尝试了几种不同的格式,但没有看到我缺少了什么(我在想,既然我使用了DateTimeFormatter,我就需要一个date组件,但我只使用了LocalDate就没问题了,而且文档说它支持LocalTime)。 提前感谢任何帮助/链接,以确定我的错误导致异常。 使用此SSCCE复制: ...我得

  • 我试图上传一个图像到内存使用multer,然后处理它与夏普和保存到磁盘。当我尝试在我的中间件中做多个module.exports时。 错误是: TypeError FileUpload.Single不是函数 到目前为止的路线是: 当我刚刚有下面的路由之前,尝试添加图像处理,我没有得到一个错误;

  • 问题内容: 我正在尝试使用下面的确切结构来解析JSON文件。 我正在使用以下jQuery函数: 我做错什么了吗? 问题答案: 您没有访问正确的元素。不指向,它指向最外面的元素(是它的属性)。该数组包含在: 进一步说明: 如果仅访问属性一次,则无需创建局部变量(但当然,它可能更易读)。 虽然连续使用分号是没有错的,但这是不必要和令人困惑的(至少这使我感到困惑;)

  • 问题内容: 我正在使用以下时间戳格式: 以下方法可以正常工作: 而且,当我使用该格式字符串传递时间戳时,它返回,例如: 然后,我需要再次从该字符串映射到时间戳,本质上是相反的操作。我知道我可以使用和及其方法,但是如果可能的话,我宁愿坚持使用样式格式。 我写了这段代码(相当hacky),它适用于某些格式,但不适用于特定格式: 在第二部分,它失败了。 堆栈跟踪: 有没有一种更简单的方法可以在不利用我的