安卓国际化开发中的时区问题之——夏令时,冬令时

在说时区问题的时候,估计很多人都很不屑。因为获取时区的方法真的太简单了。尤其是很多面向百度编程的iter。

比如,获取时区的方法一句就能搞定:


       String timeZone =“GMT”+String.valueOf(TimeZone.getDefault().getRawOffset() / (3600 *1000));



当时很不屑这个问题的时候。我就知道你肯定会犯的几个你自己都可能不知道的错。就是关于夏时令和冬时令的问题。

那么再说这个问题之前,我们先说说国际上对于时区的规定

时区

1884年在华盛顿召开的国际经度会议(又称国际子午线会议)上,规定将全球划分为24个时区(东、西各12个时区)。

如下图所示:


全球同一时刻不同时区的本地时间不同例如中国时间:10:00 AM

对于美国西部时间:18:00 PM(冬令时)

 17:00 PM(夏令时)

1. GMT VS UTC

GMT 全称 Greenwich Mean Time,中文为格林威治标准时间。

UTC 全称 Universal Time Coordinated, 中文为协调世界时。

GMT和UTC都是代表0零时区的时间,两者相等。UTC是1972年之后引入的概念,是GMT的后继,现广泛应用于科技领域。

2. PST

全球分为24个时区之后,从UTC/GMT 开始往西依次表示为UTC/GMT - 1,-2……,往东表示为UGC/GMT+1,+2……。

除了UTC/GMT之外,还有一个很常见的时区:PST。

PST 全称 Pacific Standard Time,太平洋标准时间,等同于UTC/GMT -8,既西八区,被北美国家使用。

冬令时、夏令时

地球自转方向从西向东,所以东边更早看到新一天的太阳。各地区在时区概念的基础上,时间更接近于太阳时(最简单的理解就是太阳直射时,当地时间基本接近12点)。

昼夜长短会随着四季变换,出于减少能源消耗的目的,提出了冬令时、夏令时的概念。

在天亮早的夏季人为将时间提前一小时,可以使人早起早睡,减少照明量,以充分利用光照资源,从而节约照明用电。

冬令时通常代表使用当地的标准时间,夏令时实施期间时钟拨快一小时,相当于时区往前(东)进一个。

每年会对时间进行两次调整,如下图所示:



也就是说,地球上并不是每一天都是24小时的。也有一天23小时或25小时的存在。

夏令时起始和结束的两天,其中开始的一天23小时,结束的一天25小时。

具体好奇的可以进入这个传送门看看究竟。博主在这里就不再具体讲夏令时和冬令时的问题了。小饼干就把项目中遇到的坑跟大家分享一下:

我其中的一个项目主要服务欧美客户,春天,因为时区问题,被报了bug(美国市场部同事报的),我检查了代码,然后没发现有问题,但还是改了。然后同年冬天,再次因为这个问题被报了bug。我很郁闷,这个问题明明解决过,并且验证过的啊。为什么又出现了。然后我始终找不到我具体哪里出问题了。后来,我很奇怪美国时间为什么不对(因为办公室之前所在地之前相差18个小时,后来相差17个小时)。美国人不知道中国时区不分夏令时和冬令时(备注俄罗斯也不再区分夏令时和冬令时,但是目前国际上仍然有超过110个国家和地区区分夏令时和冬令时)。然后我就查阅了资料,明白了夏令时和冬令时的问题。

好了,故事就讲到这里,我们说说怎么解决这个问题吧。我也曾面向百度编程,查阅了这方面的资料,试过其他踩过坑的大佬写的方法,但是最后都不能达到随意切换时区和时令都测试通过的结果。(大家可以自行百度尝试其他方法和各种时区切换和时令切换测试)。

最后只能靠自己了。我回想为什么会出现导致时区的问题,并且一想,不管系统的时间怎么变,他都在相应时区内变化。一旦超过,就自动出现时区也不对了。所以这个问题就非常简单了。只需改一个地方就解决:

public static String getTimeZone() {

        String timezone ;

// 这里注释的是之前获取到的时区,但是不分夏令时和冬令时(格林威治时间划分的)

//        int _t = TimeZone.getDefault().getRawOffset() / (3600 * 1000);

//         改为如下,获取系统的时间并且计算出时区就可以了

        int _t = TimeZone.getDefault().getOffset(System.currentTimeMillis()) / (3600 * 1000);

timezone = String.valueOf(_t);

timezone = "GMT" + timezone;

        return timezone;

}

好了,这样就解决了同一个时区,因为夏天和冬天,不在同一个时区的问题。就解决了不管怎么切换时区,都能拿到改时间应该所在的时区的问题了。

更多问题讨论QQ:578161213。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 195,719评论 5 462
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 82,337评论 2 373
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 142,887评论 0 324
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,488评论 1 266
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,313评论 4 357
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,284评论 1 273
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,672评论 3 386
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,346评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,644评论 1 293
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,700评论 2 312
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,457评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,316评论 3 313
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,706评论 3 299
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,261评论 1 251
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,648评论 2 342
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,859评论 2 335

推荐阅读更多精彩内容

  • 总把身边所有的事情都按照自己的想法来看待,来决定,来处理,很多时候都会用自己的想法来为她考虑,以为这样是在乎她,爱...
    风清云淡0405阅读 564评论 0 2
  • “哟!你也是小孩,对吧?我看得出来,因为你也穿了一件条纹衫。” “这里没有镇长。如果发生什么事的话,一个骷髅就会报...
    Yeluu阅读 131评论 0 0
  • 回顾2016 2016 跑 - 今年重点 总里程2,726.55 km 总跑时260 hr 平均周里程52.4 k...
    行者杰克阅读 358评论 3 5