我从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,用于您的日期和时间工作。您的字符串包含第一和最后双引号。您可以通过两种方式处理它们:
- 如果有一种方法可以从必应搜索中获得字符串,而不需要引号,那么就这样做。然后
Instant.parse()
会解析你的字符串,你就完成了。 - 否则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
是正确的使用类。OffsetDateTime
和ZonedDateTime
也可以,但我认为它们太过了。您不希望使用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