为什么 SimpleDateFormat 需要时区设置来解析 UTC 时间
Why SimpleDateFormat needs timezone setting for parsing time in UTC
我将下一个日期时间表示为字符串:"2015-08-21T22:00:00Z"
,如果我尝试在不设置时区的情况下使用 SimpleDateFormat 解析它,我会收到奇怪的值:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
sdf.parse("2015-08-21T22:00:00Z") // Fri Aug 21 22:00:00 CEST 2015
它似乎忽略了 Z - UTC 指示符。
另一方面,当我设置 GMT 时区时,一切都按预期工作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))
sdf.parse("2015-08-21T22:00:00Z") // Sat Aug 22 00:00:00 CEST 2015
为什么会这样?为什么我需要为 SimpleDateFormat 设置时区,即使该字符串包含 UTC 指示符?
SimpleDateFormat
字符串中的单引号表示它们是字符串文字。您已正确转义 'T',但通过包装 Z,您已告知 Java 忽略该值。删除引号,或者像您一样手动设置时区。
问题是你没有告诉 SimpleDateFormat
字符串有一个 UTC 指示符(你用 'Z'
转义了它)。
根据SimpleDateFormat
Javadoc, ISO 8601 format是用X
模式得到的。因此,以下将提供正确的输出:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
sdf.parse("2015-08-21T22:00:00Z"); // Sat Aug 22 00:00:00 CEST 2015
我将下一个日期时间表示为字符串:"2015-08-21T22:00:00Z"
,如果我尝试在不设置时区的情况下使用 SimpleDateFormat 解析它,我会收到奇怪的值:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
sdf.parse("2015-08-21T22:00:00Z") // Fri Aug 21 22:00:00 CEST 2015
它似乎忽略了 Z - UTC 指示符。 另一方面,当我设置 GMT 时区时,一切都按预期工作:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss'Z'")
sdf.setTimeZone(TimeZone.getTimeZone("GMT"))
sdf.parse("2015-08-21T22:00:00Z") // Sat Aug 22 00:00:00 CEST 2015
为什么会这样?为什么我需要为 SimpleDateFormat 设置时区,即使该字符串包含 UTC 指示符?
SimpleDateFormat
字符串中的单引号表示它们是字符串文字。您已正确转义 'T',但通过包装 Z,您已告知 Java 忽略该值。删除引号,或者像您一样手动设置时区。
问题是你没有告诉 SimpleDateFormat
字符串有一个 UTC 指示符(你用 'Z'
转义了它)。
根据SimpleDateFormat
Javadoc, ISO 8601 format是用X
模式得到的。因此,以下将提供正确的输出:
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssX");
sdf.parse("2015-08-21T22:00:00Z"); // Sat Aug 22 00:00:00 CEST 2015