如何使用带冒号和不带冒号的时区解析日期
How to parse a Date with TimeZone with and without colon
下面的日期解析代码适用于日期“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
了解有关现代日期时间 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
下面的日期解析代码适用于日期“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
了解有关现代日期时间 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