Java parse()将DTstring转换为本地时间。可转换为源代码';什么时候了?

Java parse()将DTstring转换为本地时间。可转换为源代码';什么时候了?,java,android,datetime,android-date,Java,Android,Datetime,Android Date,我已经遵循了8601的日期时间转换 我会举出一个例子: 这就是我在安卓系统中运行的 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 显然,的输出是本

我已经遵循了8601的日期时间转换

我会举出一个例子:

这就是我在安卓系统中运行的

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
显然,的输出是本地感知的日期时间。自从我现在在这个时区以来,已经从
EST
(-05:00)转换到
EET
(+02:00)。然而,我不希望这种自动转换

有没有办法解析格式为
yyyy-MM-dd'T'HH:MM:ssZZZZZ
的日期时间字符串,并显示该时区的日期时间?最佳输出:

Thu Mar 06 11:30:00 EST 2014

EST
和我的位置就是一个例子。它也可以是任何其他时区。

尽管在解析日期时您不必担心,因为它被解析为正确的值,但它可以以您想要的任何格式或时区显示

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
使用sdfSource.setTimeZone()方法


这应该很好。

内部
Date
对象是UTC格式的,这就是它们解析的目的

您无法从
日期中检索原始时区,但可以尝试从原始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时间戳不能完全用
SimpleDataFormat
解析。有一些代码可以解决一些限制。

谢谢,但我想要一个
2014年3月6日星期四11:30:00东部标准时间
输出。是的,仍然打印
2014年3月6日星期四18:30:00东部标准时间
我会的。检查我的电脑,它会工作的。Laalto解释了它的工作原理。问题是date只有一个长值,可以转换为您想要的任何格式,因此您需要调用format函数来获得格式字符串谢谢,但我想要一个
Thu Mar 06 11:30:00 EST 2014
输出,正如我在vipul的回答中所说的。您谈论的限制是
Z
,不是吗?还有两件事:我使用
int-rawTimeZoneOffsetMillis=dateTime.getTimezoneOffset()*1000
作为最简单的方法,但我得到了一个弃用警告。更重要的是
TimeZone tz=new TimeZone()
给出错误:
无法实例化TimeZone类型
。此外,Java
日期
不能像ISO-8601标记那样表示微秒分辨率。忽略文档,
TimeZone
是抽象的,您应该使用
SimpleTimeZone
。不推荐使用的
Date.getTimezoneOffset()
返回当前时区的偏移量,而不是原始戳记中的偏移量。
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
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));