为什么这个日期没有在GMT中显示?

时间:2015-05-21 08:48:44

标签: java jodatime simpledateformat

我可以看到格林尼治标准时间正在进行中' Z'常数作为GMT时间的指标。但是,当我解析GMT字符串时,它仍然是打印本地时间。

代码:

SimpleDateFormat outFormat = new 
SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
String timeGMT = "2015-05-21T08:42:27.334Z";
try {
    System.out.println("Time GMT>>>>>>"+outFormat.parse(timeGMT));
} catch (ParseException e) {
    e.printStackTrace();
}

输出:

Thu May 21 08:42:27 IST 2015

预期:

Thu May 21 08:42:27 GMT 2015

2 个答案:

答案 0 :(得分:3)

这里有两个问题。

首先是您使用错误的格式进行解析。您的格式告诉解析器只需将Z视为没有重要性的文字字符

这意味着它会将其解析为本地日期,因为它不会将Z视为时区标记。如果您希望Z被解释为时区,则您的格式应该包含X而不是'Z'

    String timeGMT = "2015-05-21T08:42:27.334Z";

    DateFormat f1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'");
    DateFormat f2 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");

    Date d1 = f1.parse(timeGMT);
    Date d2 = f2.parse(timeGMT);

    System.out.println(d1);
    System.out.println(d2);

我目前在GMT + 3中,这是我从中获得的输出:

Thu May 21 08:42:27 IDT 2015
Thu May 21 11:42:27 IDT 2015

如您所见,d2提前3小时,这意味着它将原始时间解释为GMT。

您的另一个问题是您以默认格式打印生成的日期。默认格式在您的本地时区,因此它将在本地区域中打印它,就像我的一样。

要更改此设置,您还必须格式化输出

    DateFormat f3 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss z");
    f3.setTimeZone(TimeZone.getTimeZone("GMT"));

    System.out.println(f3.format(d2));

对于前面的示例,这会产生以下结果:

2015-05-21 08:42:27 GMT

答案 1 :(得分:0)

输入中的Z不是文字常量,而是指UTC + 00:00(别名“GMT”)。请从最后一个图案符号周围的图案中删除瑕疵。并使用“X”代替“Z”作为符号,以便将“Z”正确解释为ISO-8601标记,用于偏移UTC + 00:00。

SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");