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

时间:2011-02-26 14:16:34

标签: java datetime timezone utc jodatime

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

由于这些字符串时区,我无法使用Joda Time的DateTimeFormat.forPattern("yyyyMMddhhmmss z").withZone(DateTimeZone.UTC);,因为根据文档:"Time zone names ('z') cannot be parsed"

所以,我有一个问题,如果你知道在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");

SimpleDateFormat解析String(我在这里并不关心有多个时区同名的问题 - 这个类解析它对我有好处)。

问题是我不知道如何将它从这里转换为UTC。我怎么能这样做?

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

1 个答案:

答案 0 :(得分:6)

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

TimeZone.setDefault(TimeZone.getTimeZone("UTC"));

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

我发现的第二个解决方案是使用不同的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));

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

  

Sat Jun 03 08:33:34 EDT 2000

     

(yyyyMMddhhmmss z):20000603043334 GST

     

(yyyyMMddhhmmss z):20000603123334 UTC

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

  

三个字母的时区ID For   一些与JDK 1.1.x的兼容性   其他三个字母的时区ID(如   如“PST”,“CTT”,“AST”)也是   支持的。但是,它们的用途是   因为相同而弃用了   缩写经常用于   多个时区(例如,   “CST”可能是美国的“中央标准”   时间“和”中国标准时间“),和   那么Java平台就可以了   认识其中一个。