-1

在 REST API 响应中,我得到的日期为'2016-07-02T00:00:00Z'

在代码中,我有一个如下所示的列

@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "UTC")
private Instant effectiveDate;

// getter & setter  
public Instant getEffectiveDate() {
    return effectiveDate;
}

public OfferTerm setEffectiveDate(Instant effectiveDate) {
    this.effectiveDate = effectiveDate;
    return this;
}

出现以下错误:

java.time.format.DateTimeParseException:无法解析文本“2016-07-02T00:00:00Z”,在索引 19 处找到未解析的文本

请在这里帮助我。

4

2 回答 2

0

您的日期时间字符串已Instant#parse采用默认使用的格式。下面给出了一个演示来说明相同的内容:

import java.time.Instant;

public class Main {
    public static void main(String[] args) {
        String strDateTime = "2016-07-02T00:00:00Z";
        Instant instant = Instant.parse(strDateTime);
        System.out.println(instant);
    }
}

输出:

2016-07-02T00:00:00Z

由于 anInstant代表 UTC 时间线上的一个瞬时点(即它独立于),因此无需timezone提及。timezone = "UTC"您的Z日期时间字符串中的 已经指定 UTC。此外,该模式"yyyy-MM-dd'T'HH:mm:ss"与您的日期时间字符串的模式不匹配。我希望您明白,使用timezoneand patternforInstant不仅是不必要的,而且也是您所面临错误的根本原因。

只需删除@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss", timezone = "UTC")即可解决问题。

于 2020-09-20T21:03:44.527 回答
0

在评论中详细说明 Andreas 的答案后,可能会提供以下摘要来从包含时区信息的字符串中解析 Instant:

  1. @JsonFormatZ如果输入字符串包含以下格式的时区信息,则可以省略±[hh]:[mm]
class Wrapper {
    private Instant effectiveDate;
    // getter/setter
}

// Parseable JSON strings
String[] jsons = {
    "{\"effectiveDate\":\"2016-07-02T00:00:00Z\"}",
    "{\"effectiveDate\":\"2016-07-05T00:00:00+00:00\"}",
    "{\"effectiveDate\":\"2016-07-06T00:00:00+02:00\"}",
    "{\"effectiveDate\":\"2016-07-07T00:00:00-02:00\"}",
}; 

结果:

2016-07-02T00:00:00Z      -> 2016-07-02T00:00:00Z
2016-07-15T00:00:00+00:00 -> 2016-07-15T00:00:00Z
2016-07-16T00:00:00+02:00 -> 2016-07-15T22:00:00Z
2016-07-17T00:00:00-02:00 -> 2016-07-17T02:00:00

注意:“快捷”时区喜欢±[hh][mm]±[hh]不能在这里解析。

  1. 如果时区后缀不可用(noZ或 timezone)和/或快捷方式时区信息可用,则需要应用以下格式:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss['Z'][XXX][X]", timezone="UTC")
private Instant effectiveDate;

使用它可以成功解析以下数据:

String[] jsons = {
    "{\"effectiveDate\":\"2016-07-02T00:00:00Z\"}",      // Z
    "{\"effectiveDate\":\"2016-07-09T00:00:00\"}",       // no timezone
    "{\"effectiveDate\":\"2016-07-10T00:00:00+01\"}",    // +hh
    "{\"effectiveDate\":\"2016-07-11T00:00:00-09\"}",    // -hh
    "{\"effectiveDate\":\"2016-07-12T00:00:00+0200\"}",  // +hhmm
    "{\"effectiveDate\":\"2016-07-13T00:00:00-0400\"}",  // -hhmm
    "{\"effectiveDate\":\"2016-07-15T00:00:00+00:00\"}", // +hh:mm
    "{\"effectiveDate\":\"2016-07-16T00:00:00+02:00\"}", // +hh:mm
    "{\"effectiveDate\":\"2016-07-17T00:00:00-02:00\"}"  // -hh:mm
};

解析结果:

2016-07-02T00:00:00Z      -> 2016-07-02T00:00:00Z
2016-07-09T00:00:00       -> 2016-07-09T00:00:00Z
2016-07-10T00:00:00+01    -> 2016-07-09T23:00:00Z
2016-07-11T00:00:00-09    -> 2016-07-11T09:00:00Z
2016-07-12T00:00:00+0200  -> 2016-07-11T22:00:00Z
2016-07-13T00:00:00-0400  -> 2016-07-13T04:00:00Z
2016-07-15T00:00:00+00:00 -> 2016-07-15T00:00:00Z
2016-07-16T00:00:00+02:00 -> 2016-07-15T22:00:00Z
2016-07-17T00:00:00-02:00 -> 2016-07-17T02:00:00Z
  1. (假设)如果输入字符串中存在其他时区后缀(例如GMTUTC带有可选空格),则以下格式将处理它:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss['Z'][[' ']['GMT']][[' ']['UTC'][XXX][X]", timezone="UTC")
private Instant effectiveDate;
于 2020-09-20T21:04:55.210 回答