我已按照此SO answer进行8601的日期时间转换。
我将引用一个例子straight from w3:
1994-11-05T08:15:30-05:00 corresponds to November 5, 1994, 8:15:30 am, US Eastern Standard Time.
1994-11-05T13:15:30Z corresponds to the same instant.
这就是我在android中运行的东西
SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ");
dateTime = sdfSource.parse("2014-03-06T11:30:00-05:00");
System.out.println(dateTime); //Thu Mar 06 18:30:00 EET 2014
显然.parse()的输出是本地识别日期时间。从EST
( - 05:00)到EET
(+02:00)的转换,因为现在我在这个时区。但是我不希望这种自动转换。
有没有办法以yyyy-MM-dd'T'HH:mm:ssZZZZZ
格式解析日期时间字符串并显示 THAT时区的日期时间?优先输出:
Thu Mar 06 11:30:00 EST 2014
EST
和我的位置就是一个例子。它也可以是任何其他时区。
答案 0 :(得分:1)
内部Date
个对象是UTC格式,这就是它们被解析的内容。
您无法从Date
检索原始时区,但您可以尝试从原始ISO-8601标记中检索它,并在格式化时使用它。
当您将其转换为toString()
的字符串时,它会使用您的本地设置来格式化日期。如果需要特定表示,请使用格式化程序格式化输出,例如
int rawTimeZoneOffsetMillis = ...; // retrieve from ISO-8601 stamp and convert to milliseconds
TimeZone tz = new SimpleTimeZone(rawTimeZoneOffsetMillis, "name");
DateFormat outputFormat = DateFormat.getDateTimeInstance();
outputFormat.setTimeZone(tz);
System.out.println(df.format(dateTime));
ISO-8601时间戳不能与SimpleDateFormat
完全解析。 This answer有一些代码可以解决一些限制。
答案 1 :(得分:0)
虽然您在分析日期时不应该担心,因为它被解析为正确的值可以以您想要的任何格式或时区显示。
SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ");
sdfSource.setTimeZone( TimeZone.getTimeZone( "EST" ) );
dateTime = sdfSource.parse("2014-03-06T11:30:00-05:00");
System.out.println(sdfSource.format(dateTime)); //Thu Mar 06 18:30:00 EET 2014
答案 2 :(得分:0)
使用sdfSource.setTimeZone()方法
SimpleDateFormat sdfSource = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZZZ");
sdfSource.setTimeZone(TimeZone.getTimeZone("EST")); //give the timezone you want
dateTime = sdfSource.parse("2014-03-06T11:30:00-05:00");
System.out.println(dateTime); //Thu Mar 06 18:30:00 EET 2014
这应该没事。