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

java 8中的通用日期和时间解析

董法
2023-03-14

我最近试图使用java 8 time API制作一个通用的日期和时间解析方法,主要用于使用Date与旧代码接口

我想做这样的事情:

public static Date parse(String dateStr, String pattern) {
    return Date.from(Instant.parse(dateStr, DateTimeFormatter.ofPattern(pattern)));
}

问题是,对于时间API,要使用的类取决于模式DateTimeFormatter。parse永远不会失败,但会返回一个临时accessor,它很难处理并转换为可用的类。

和LocalDateTime。如果模式没有“dd/MM/yyyy”这样的时间信息,解析将失败。如果模式与预期的类不匹配,其他类(如Instant、ZonedDateTime等)都将无法解析。

理想情况下,我希望有一种方法可以宽松地解析并返回一个Instant,其中包含缺少字段的默认值,但我找不到这样做的方法。

任何想法?

共有1个答案

杨征
2023-03-14

您可以使用DateTimeFormatterBuilder::parseDefaulting来设置默认值。

var now = ZonedDateTime.now();
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
    .appendPattern(pattern)
    .parseDefaulting(ChronoField.OFFSET_SECONDS, now.getOffset().getTotalSeconds())
    .parseDefaulting(ChronoField.YEAR, now.getYear())
    .parseDefaulting(ChronoField.MONTH_OF_YEAR, now.getMonthValue())
    .parseDefaulting(ChronoField.DAY_OF_MONTH, now.getDayOfMonth())
    .parseDefaulting(ChronoField.HOUR_OF_DAY, now.getHour())
    .parseDefaulting(ChronoField.MINUTE_OF_HOUR, now.getMinute())
    .parseDefaulting(ChronoField.SECOND_OF_MINUTE, now.getSecond())
    .toFormatter(Locale.ROOT);
Instant dt = Instant.from(formatter.parse(str));

请注意,首先使用appendPattern追加模式,然后使用parseDefaulting设置所有默认值,这一点很重要。

还请注意,我使用了当前时间戳来填充默认值。因此,例如,如果您省略了年份,则需要当前年份(在撰写本文时为2022年)。当然,默认值取决于您的具体用例。

例子:

撰写本文时,时间是2022-06-09T17:18:36 02:00。

System.out.println(parse("9-6", "d-M"));
System.out.println(parse("2023", "uuuu"));
System.out.println(parse("10:13", "H:m"));
System.out.println(parse("25 Dec, 16:22", "d MMM, H:mm"));

决定

2022-06-09T15:18:36Z
2023-06-09T15:18:36Z
2022-06-09T08:13:36Z
2022-12-25T14:22:36Z
 类似资料:
  • 也许有人能给我举个例子?我在问自己,新的日期和时间API的改进来自哪里。

  • 我需要一些解释为什么这个代码不编译: 错误: 类型Duration中的(TemporalAmount)方法不适用于参数(ChronoUnit) 正如本文所述: public static Duration from(TemporalAmount amount)从时间量中获取持续时间的实例。这将根据指定的金额获得持续时间。TemporalAmount表示一个时间量,可以是基于日期的,也可以是基于时间

  • 我有一个文件,可以有日期修改值与日期或日期时间的格式。我曾将该值解析为: 现在,字符串也可以是

  • 何时何地哪个更可取? 我不知道他们之间到底有什么区别。 来自LocalDateTime的文档 ...时间表示为纳秒精度。例如,值“2007 年 10 月 2 日 13:45.30.123456789”可以存储在 LocalDateTime 中。 我假设LocalDateTime也可以接受纳秒。所以我想,我可以用LocalDateTime替换我的代码,它们被声明为TimeStamp。如果我错了,请纠

  • 让我一起学习一个新的内建对象:日期(Date)。该对象存储日期和时间,并提供了日期/时间的管理方法。 例如,我们可以使用它来存储创建/修改时间,或者用来测量时间,再或者仅用来打印当前时间。 创建 创建一个新的 Date 对象,只需要调用 new Date(),在调用时可以带有下面这些参数之一: new Date() 不带参数 —— 创建一个表示当前日期和时间的 Date 对象: let now =

  • 日期和时间 日期、时间、时间戳的值支持ISO 8601格式,格式还包含了时区: CALL TIMESTAMP '2008-01-01 12:00:00+01:00'; 如果未设置时区,将使用系统中当前的时区。日期和时间信息存储在 H2 数据库文件,不包含时区信息。如果数据库打开使用另一个系统时区,日期和时间将是相同的。这意味着如果你存储的值“2000-01-01 12:00:00”在一个时区,然