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

3
我想将类似于"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");
SimpleDateFormat 可以解析 String(我不关心这个类解析时区名称有多个的问题 - 对我来说,它解析的就很好)。但问题是我不知道如何将其从此转换为UTC。我该怎么做呢?无论我如何设置 f 的时区为UTC(使用上述两种方式中的任意一种),都没有帮助。我希望有人能帮我解决这个问题。我在这里阅读了很多关于这个主题的问题和答案,但还没有找到解决方案。

这并不回答你的问题,但是要小心那个格式字符串。小写的“hh”仅用于解析半天小时(0-12)。大多数人会想使用“yyyyMMddHHmmss”(大写的“HH”)。Joda的javadoc有一个方便的列表:http://joda-time.sourceforge.net/apidocs/org/joda/time/format/DateTimeFormat.html - Tom
1个回答

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


谢谢。我使用了你建议的第二个解决方案。 - ovdsrn
最后一点关于时区缩写的建议非常有用,这里有一个列表(http://www.timeanddate.com/library/abbreviations/timezones/)可以参考。此外,许多缩写并没有标准化。例如,在夏威夷可能会看到`HAST`或`HST`。最好完全避免使用它们。 - Matt Johnson-Pint

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接