将表示为包含时区名称('z')的字符串的时间转换为UTC时间

ovd*_*srn 3 java timezone datetime utc jodatime

我想将字符串转换为"20000603163334 GST"或转换"20000603163334 -0300"为UTC时间.问题是我的字符串中的时区可以是"一般时区",我的意思是它们可以是CET,GST等字符串.我不知道如何转换这些.

由于这些字符串时区我不能使用Joda Time DateTimeFormat.forPattern("yyyyMMddhhmmss z").withZone(DateTimeZone.UTC);,因为根据文档: "时区名称('z')无法解析".

所以,我有一个问题是,如果你知道在Joda Time中解决这个限制的方法吗?如果可能的话,我更愿意使用Joda Time而不是标准的Java API.

另一个我认为可以用时区名称解决这个问题的方法是使用Java SimpleDateFormat.所以我做了类似的事情:

SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss z");
//f.setTimeZone(TimeZone.getTimeZone("UTC"));
f.setCalendar(new GregorianCalendar(TimeZone.getTimeZone("UTC")));
Date time = f.parse("20000603163334 GST");
Run Code Online (Sandbox Code Playgroud)

SimpleDateFormat解析String(我不关心这里大约有具有相同名称的多个时区的问题-这是什么类解析它是为我好).

问题是我不知道如何将它从这里转换为UTC.我怎样才能做到这一点?

我将f's时区设置为UTC(从上面两种方式)的事实并没有帮助.我希望有人可以帮我解决这个问题,我在这里看了很多关于这个主题的问题和答案,在stackoverflow上,但我还没有找到解决方案.

Joe*_*Joe 6

我找到了两个问题的解决方案.第一种是将默认时区设置为UTC:

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));
Run Code Online (Sandbox Code Playgroud)

我不确定这会产生什么其他副作用.

我发现的第二个解决方案是使用不同的SimpleDateFormat进行输出.

SimpleDateFormat f = new SimpleDateFormat("yyyyMMddhhmmss z");
f.setTimeZone(TimeZone.getTimeZone("UTC"));
Date time = f.parse("20000603163334 GST");
System.out.println(time);
System.out.println("(yyyyMMddhhmmss z):  " + f.format(time));

SimpleDateFormat utc = new SimpleDateFormat("yyyyMMddhhmmss z");
utc.setTimeZone(TimeZone.getTimeZone("UTC"));

System.out.println("(yyyyMMddhhmmss z):  " + utc.format(time));
Run Code Online (Sandbox Code Playgroud)

使用两个SimpleDateFormat对象允许将输出放入UTC时间.以下是运行此代码的输出:

星期六03 03:33:34 EDT 2000

(yyyyMMddhhmmss z):20000603043334消费税

(yyyyMMddhhmmss z):20000603123334 UTC

这可能是Joda不支持3个字母区域ID的原因.这来自TimeZone(http://download.oracle.com/javase/6/docs/api/java/util/TimeZone.html)JavaDoc.就Joda而言,我没有看到解决方法,但我对这个库并不是很熟悉.

三字母时区ID为了与JDK 1.1.x兼容,还支持其他一些三字母时区ID(例如"PST","CTT","AST").但是,它们的使用已被弃用,因为相同的缩写通常用于多个时区(例如,"CST"可能是美国"中央标准时间"和"中国标准时间"),然后Java平台只能识别其中一个他们.