我想将"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上,但我还没有找到解决方案。
答案 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平台就可以了 认识其中一个。