如何使用带和不带冒号的 TimeZone 解析日期

问题描述

以下日期解析代码适用于日期“2015-03-25T09:24:10.000+0530”:-

String time = "2015-03-25T09:24:10.000+0530";
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSZ");

LocalDateTime localDateTime = LocalDateTime.parse(time,timeFormatter);
System.out.println("localDateTime:"+localDateTime); 

此外,以下代码适用于日期“2015-03-25T09:24:10.000+05:30”

String time = "2015-03-25T09:24:10.000+05:30";
DateTimeFormatter timeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

LocalDateTime localDateTime = LocalDateTime.parse(time,timeFormatter);
System.out.println("localDateTime:"+localDateTime); 

但我试图找到一个匹配“2015-03-25T09:24:10.000+0530”或“2015-03-25T09:24:10.000+05:30”的模式。如果不做检查输入日期是否有冒号之类的事情,这可能吗?

根据文档,我觉得在 datePattern 结尾添加“X”会有所帮助,但事实并非如此。 https://docs.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

有什么建议吗?

解决方法

将可选模式保留在方括号内。

import java.time.OffsetDateTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import java.util.stream.Stream;

public class Main {
    public static void main(String[] args) {
        DateTimeFormatter dtf = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS[XXX][X]",Locale.ENGLISH);
        Stream.of(
                    "2015-03-25T09:24:10.000+0530","2015-03-25T09:24:10.000+05:30"
                ).forEach(s -> System.out.println(OffsetDateTime.parse(s,dtf)));  
    }
}

输出:

2015-03-25T09:24:10+05:30
2015-03-25T09:24:10+05:30

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

,

有趣的问题。您可以使用 parseBest

  String[] test =  {"2015-03-25T09:24:10.000+0530","2015-03-25T09:24:10.000+05:30" };
  for (String s : test) {
     DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSS[Z][XXX]");
     TemporalAccessor result = formatter.parseBest(s,ZonedDateTime::from,ZonedDateTime::from);
     System.out.println(result);
  }

这个输出

2015-03-25T09:24:10+05:30
2015-03-25T09:24:10+05:30