gpt4 book ai didi

java - SimpleDateFormat 中的可选部分

转载 作者:IT老高 更新时间:2023-10-28 20:47:24 25 4
gpt4 key购买 nike

我正在读取可能带有或不带有时区调整的日期字符串:yyyyMMddHHmmsszyyyyMMddHHmmss。当字符串缺少区域时,我会将其视为 GMT。我没有看到在 SimpleDateFormat 中创建可选部分的任何方法,但也许我遗漏了一些东西。有没有办法用 SimpleDateFormat 来做到这一点,还是我应该写一个新的具体 DateFormat 来处理这个?

最佳答案

JSR-310 随 Java 8 一起交付,它为解析时间值提供了增强的支持,其中组件现在可能是可选的。您不仅可以将区域设为可选,还可以将时间组件设为可选,并为给定字符串返回正确的时间单位。

考虑以下测试用例。

public class DateFormatTest {

private final DateTimeFormatter formatter = DateTimeFormatter.ofPattern(
"yyyy-MM-dd[[ ]['T']HH:mm[:ss][XXX]]");

private TemporalAccessor parse(String v) {
return formatter.parseBest(v,
ZonedDateTime::from,
LocalDateTime::from,
LocalDate::from);
}

@Test public void testDateTime1() {
assertEquals(LocalDateTime.of(2014, 9, 23, 14, 20, 59),
parse("2014-09-23T14:20:59"));
}

@Test public void testDateTime2() {
assertEquals(LocalDateTime.of(2014, 9, 23, 14, 20),
parse("2014-09-23 14:20"));
}

@Test public void testDateOnly() {
assertEquals(LocalDate.of(2014, 9, 23), parse("2014-09-23"));
}

@Test public void testZonedDateTime() {
assertEquals(ZonedDateTime.of(2014, 9, 23, 14, 20, 59, 0,
ZoneOffset.ofHoursMinutes(10, 30)),
parse("2014-09-23T14:20:59+10:30"));
}

}

这里是 DateTimeFormatter "yyyy-MM-dd[[ ]['T']HH:mm[:ss][XXX]]" 的模式允许方括号内的选项也可以嵌套。模式也可以从 DateTimeFormatterBuilder 构建。 ,上面的模式在这里演示:

private final DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.parseCaseInsensitive()
.append(DateTimeFormatter.ISO_LOCAL_DATE)
.optionalStart()
.optionalStart()
.appendLiteral(' ')
.optionalEnd()
.optionalStart()
.appendLiteral('T')
.optionalEnd()
.appendOptional(DateTimeFormatter.ISO_TIME)
.toFormatter();

这将转换为如下所示的表达式:

yyyy-MM-dd[[' ']['T']HH:mm[':'ss[.SSS]]].

可选值可以嵌套,如果仍然打开,最后也会自动关闭。但是请注意,没有办法在可选部分上提供异或,因此上述格式实际上可以很好地解析以下值:

2018-03-08 T11:12

请注意,我们可以将现有的格式化程序作为我们当前格式的一部分重用。

关于java - SimpleDateFormat 中的可选部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5897288/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com