SimpleDateFormat错误地将UTC转换为时区

时间:2017-03-28 22:26:06

标签: java android

将以下ISO字符串2017-09-01T01:00:00.000Z转换为日期时出现问题。

我正在使用SimpleDateFormat,如下所示

SimpleDateFormat stringToDate = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
Date date = stringToDate.parse("2017-09-01T01:00:00.000Z");

日期对象输出的日期如下所示

Fri Sep 01 01:00:00 MDT 2017

当我得到

的输出时
Fri Sep 01 01:00:00 UTC 2017

OR

Fri Aug 31 19:00:00 MDT 2017

看起来它没有正确地进行时区转换,因为时间没有改变,但是时区是不应该更改两者或两者的时区。

3 个答案:

答案 0 :(得分:2)

  1. 'Z'周围的单引号表示它不被解释为UTC的时区说明符:它只是字符串中的文字Z,将被丢弃。

    由于您没有专门在SimpleDateFormat上设置时区,因此会在JVM的默认时区中解析日期。

  2. Date.toString()使用您的JVM默认时区。 Date中没有时区。如果要在特定时区打印,则需要使用SimpleDateFormat进行打印。

答案 1 :(得分:0)

您应该使用java.time类来处理现代Java中的日期。

日期不存储时区,而Date.toString()在渲染时使用系统默认时区。

答案 2 :(得分:0)

你也可以尝试这个函数调用来创建Calendar实例,它应该支持 yyyy-MM-dd'T'HH:mm:ss.SSSZ 格式。

Calendar cal = javax.xml.bind.DatatypeConverter.parseDateTime(ymd);

编辑:嗯,你说Android确定这个课程可能无法使用。