Invalid java.util.TimeZone自动转换为GMT



我使用java.util.TimeZone在json请求中获取时区,但是当提供无效的时区时,它会自动转换为GMT,如下面的代码所示。那么,如何避免自动转换,从而知道所提供的时区无效呢?

import java.util.*;
public class MyClass {

public static void main(String args[]) {
TimeZone tz = TimeZone.getTimeZone("invalid time zone");

System.out.println( tz.getID() ); //this prints GMT instead of "invalid time zone"

}
}

Java有3个完全独立的api用于'date stuff'。

  • java.util.Date(以及TimeZone,这是你在这里使用的,还有一堆东西挂在这里,比如继承它的java.sql.Timestamp)。

  • java.util.Calendar(和GregorianCalendar和其他一些)。

  • java.time包里什么都有。

为什么有3个api ?因为那台"日期"太蠢了,需要换掉。不幸的是,更换的更糟糕,所以也需要更换。幸运的是,第三次真的很有魅力,java.time非常棒。

解决方案:不要使用旧的过时的坏api。如果它以java.util开头,你不需要它。

您希望java.time.ZoneId代表一个实际的区域。这是类似Europe/Amsterdam的东西,而不是像CEST甚至是最没用的+01:00那样没用的东西。后两者都很脆弱,因为它们都不允许任何实际的数学。例如,基于偏移的时区不允许你"增加一小时"——根据约会地点的不同,"增加一小时"可能有不同的含义(夏令时是一个东西!)。CEST太宽泛了;地球上"使用CEST"的地方一直在变化。举个例子:欧盟通过了一项动议,要求所有欧盟国家都放弃夏时制。但并不是所有的欧盟国家都选择"坚守"同一个区域,所以这是即将到来的定义变化。

如果你有这些无用的区域之一,java.time.ZoneOffset可以代表它。

如果你提供gobbledygook,他们会出错。

您可以使用java.time.ZoneId.of,它将为无效区域抛出Exception

import java.time.ZoneId;
import java.time.DateTimeException;
// ...
try {
ZoneId zone = ZoneId.of("invalid time zone");
System.out.println(zone);
} catch(DateTimeException e){
System.out.println("Invalid time zone");
}