SimpleDateFormat.parse()将DTstring转换为本地时间。可以转换为源的时间吗?

时间:2014-03-06 10:10:05

标签: java android datetime android-date

我已按照此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和我的位置就是一个例子。它也可以是任何其他时区。

3 个答案:

答案 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

这应该没事。