如何正确解析日期 java.text.ParseException: 不可解析日期: " " 2021-09-02T13:16:00.0000000Z " " ?



我从bing搜索中得到这个日期,并且很难解析它到日期,我需要时间也一样。

""2021-09-02T13:16:00.0000000Z""

我正在做这个:

public static Date parseDate(String publishedDate) {

String dateStr = publishedDate.replaceFirst("T", "");
SimpleDateFormat formatter = null;
if (publishedDate.length() > 10) {
formatter = new SimpleDateFormat("yyyy-MM-ddhh:mm:ss");         
} else {
formatter = new SimpleDateFormat("yyyy-MM-dd");
}

Date date = null;
try {
date = formatter.parse(publishedDate);
} catch (ParseException e) {
e.printStackTrace();
}
return date;
}

得到以下错误:

java.text.ParseException: Unparseable date: ""2021-09-02T13:16:00.0000000Z""
at java.base/java.text.DateFormat.parse(DateFormat.java:396)

也解析引号;使用java.time.Instant

像其他许多人一样,我建议您使用java。time,现代Java日期和时间API,用于您的日期和时间工作。

您的字符串包含第一和最后双引号。您可以通过两种方式处理它们:

  1. 如果有一种方法可以从必应搜索中获得字符串,而不需要引号,那么就这样做。然后Instant.parse()会解析你的字符串,你就完成了。
  2. 否则java。time也可以解析引号。

使用以下格式化器解析引号:

private static final DateTimeFormatter BING_INSTANT_PARSER
= new DateTimeFormatterBuilder().appendLiteral('"')
.append(DateTimeFormatter.ISO_INSTANT)
.appendLiteral('"')
.toFormatter();

然后解析如下:

String stringFromBing = ""2021-09-02T13:16:00.0000000Z"";

Instant instant = BING_INSTANT_PARSER.parse(stringFromBing, Instant::from);

System.out.println("String to parse: " + stringFromBing);
System.out.println("Result:           " + instant);

输出:

String to parse: "2021-09-02T13:16:00.0000000Z"
Result:           2021-09-02T13:16:00Z

java。时间类要用什么?

假设你的字符串总是以Z结尾,表示UTC,Instant是正确的使用类。OffsetDateTimeZonedDateTime也可以,但我认为它们太过了。您不希望使用LocalDateTime,因为这样会丢掉字符串是UTC格式的基本信息。

链接Oracle tutorial: Date Time using java.time.

您正在处理的是时间戳,有Duration和INSTANT类来处理它。这一页解释了这一切https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html

正如@Basil Bourque所建议的,我们不需要DateTimeFormatter,因为Instant.parse()默认使用UTC。此外,我们可以使用OffsetDateTime代替ZonedDateTime(更详细),

String date = "2021-09-02T13:16:00.0000000Z";
Instant timeStamp = Instant.parse(date);
// To get Time or Date," with Instant you must provide time-zone too"
ZonedDateTime dateTimeZone = ZonedDateTime.ofInstant(timeStamp, ZoneOffset.UTC);
System.out.println(dateTimeZone);
System.out.println(dateTimeZone.toLocalDate());// can also be tolocalTime

相关内容

  • 没有找到相关文章