具有通配符字段的Java 8 ISO 8601间隔语法

时间:2016-04-06 15:55:14

标签: java datetime java-time

我需要解析类似于ISO 8601语法的时间间隔表达式,只允许字段使用通配符;并将开始和结束存储到两个LocalDateTime对象中。然后我的OffsetDateTime会将API与第三个"****-**-**T00:00:00Z/****-**-**T11:55:00Z""2016-04-06T00:00:00Z/2016-04-06T11:55:00Z"进行比较,以检查它是否位于区间内或区域之外。

例如:解析public List<Item> newItems(List<Item> items, List<Item> otherItems) { List<Item> newItems = new ArrayList<>(items); for (Item i: items) { for (Item j: otherItems) { if (i.equals(j)){ newItems.remove(i) break; } } return newItems; } 时,开始和结束时刻的日期应该是启动程序执行的那一天(忽略运行到第二天的问题)。我该如何解析这样的表达式?

编辑:要说清楚,如果我今天运行它,它应该等同于解析{{1}}。

1 个答案:

答案 0 :(得分:0)

我认为没有办法to use wildcards when parsing a string with java.time。一个不太好看的黑客就是将*替换为1:不应该产生任何不可解析的日期。然后,您可以忽略日期内容。

例如:

String input = "****-**-01T00:00:00Z/****-04-**T11:55:00Z";
String[] dates = input.replace("*", "1").split("/");
ZonedDateTime zdt1 = ZonedDateTime.parse(dates[0]);
ZonedDateTime zdt2 = ZonedDateTime.parse(dates[1]);

LocalDate day = LocalDate.now(); //or whatever date you like

LocalDateTime start = zdt1.toLocalTime().atDate(day);
LocalDateTime end = zdt2.toLocalTime().atDate(day);

System.out.println(start + " / " + end);