Table of Contents
一切缘起于学习Spark的日期时间函数。其中的to_utc_timestamp和from_utc_timestamp函数会涉及到TimeZone的参数。在Spark的源码中追溯,会发现TimeZone的参数会传到源文件:spark/sql/catalyst/src/main/scala/org/apache/spark/sql/catalyst/util/DateTimeUtils.scala,从而看到Spark实际上用了很多的Java有关时间的库。
...
import java.sql.{Date, Timestamp}
import java.time._
import java.time.Year.isLeap
import java.time.temporal.IsoFields
import java.util.{Locale, TimeZone}
import java.util.concurrent.TimeUnit._
...
于是需要学习这个库:java.util.TimeZone。参考其说明文档:https://docs.oracle.com/javase/8/docs/api/java/util/TimeZone.html。我们使用ID的字符串,通过函数getTimeZone得到相应的TimeZone:
TimeZone tz = TimeZone.getTimeZone(String ID);
而这里的String ID可以有两种形式
- 一种是有效的ID,例如"America/Los_Angeles",能看出其意义。而这些字符串可以通过函数getAvailableIDs得到;
- 一种则是自定义的ID(CustomID),就是以GMT开头的一定格式的时区表示。比较简单,参考上面的网页。在实际生成TimeZone的时候,自定义的ID会先转成正规化的自定义ID(NormalizedCustomID)。
现在来看getAvailableIDs得到的有效ID。注意到有效的ID字符串中会包含“/”字符,于是考虑以“/”划分的单词的个数来考察这些ID。而这个库与Spakr没有什么关系,我们可以在Scala的REPL<