为什么这个日期不以 GMT 显示?
Why this date is not showing in GMT?
我可以看到 GMT 时间有 '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
Z 在您的输入中不是文字常量,而是表示 UTC+00:00(别名 "GMT")。请从最后一个模式符号周围的模式中删除撇号。并使用 "X" 而不是 "Z" 作为符号,以便正确地将 "Z" 解释为偏移量 UTC+00:00 的 ISO-8601 标记。
SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
这里有两个问题。
首先是你使用了错误的格式来解析。您的格式告诉解析器只将 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
我可以看到 GMT 时间有 '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
Z 在您的输入中不是文字常量,而是表示 UTC+00:00(别名 "GMT")。请从最后一个模式符号周围的模式中删除撇号。并使用 "X" 而不是 "Z" 作为符号,以便正确地将 "Z" 解释为偏移量 UTC+00:00 的 ISO-8601 标记。
SimpleDateFormat outFormat = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSX");
这里有两个问题。
首先是你使用了错误的格式来解析。您的格式告诉解析器只将 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