在评论中详细说明 Andreas 的答案后,可能会提供以下摘要来从包含时区信息的字符串中解析 Instant:
@JsonFormat
Z
如果输入字符串包含以下格式的时区信息,则可以省略±[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]
不能在这里解析。
- 如果时区后缀不可用(no
Z
或 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
- (假设)如果输入字符串中存在其他时区后缀(例如
GMT
或UTC
带有可选空格),则以下格式将处理它:
@JsonFormat(pattern = "yyyy-MM-dd'T'HH:mm:ss['Z'][[' ']['GMT']][[' ']['UTC'][XXX][X]", timezone="UTC")
private Instant effectiveDate;