我使用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");
}