关于时区的概念整理以及在iOS开发中的使用

   由于之前一直从事国内项目的开发,所以项目中并不会牵扯到国际化以及时间转化问题,最近开发了一个国际项目,其中遇到了许多关于app国际化和时区转换的问题。有关于国际化的问题,不在赘述,今天主要记录一下关于时区的一些笔记。

时区的概念:
时区是地球上的区域使用同一个时间定义。以前,人们通过观察太阳的位置(时角)决定时间,这就使得不同纬度地方的时间有所不同(地方时)。1863年,首次使用时区的概念。时区通过设立一个区域的标准时间部分地解决了这个问题。
时区的划分:
理论时区以被15整除的子午线(0度经线)为中心,向东西两侧延伸7.5度,即每15°划分一个时区,这是理论时区。理论时区的时间采用其中央经线(或标准经线)的地方时。所以每差一个时区,区时相差一个小时,相差多少个时区,就相差多少个小时。
世界理论时区的数量:
按照之前的时区划分阐述,世界上一共存在24个时区,那么这24个时区之间的时间关系是怎样的呢?由于地球自转方向是由西向东的,那么我们其实可以简单的理解身处于东边的人始终比西边的人早看到太阳,那么相差一个时区,东面的时区就会西面的时区早一个小时,但是这样怎么区分日期呢?好像东边时间总是比西边的时间早?为了避免日期的混淆,所以国际约定了International Date Line,即国际日期变更线。
国际日期变更线:
国际日期变更线为180度经线,也就是日界线,人为绕开了一些岛屿和陆地,基本从海洋穿过。为什么会划出国际日期变更线呢?
国际日期变更线的原理:
时区划分后,从本初子午线向东,每过一个时区,时钟需要拨快1h,那么到了180°经线的时候,时间就快了12h, 那么继续向东的情况下,始终是否需要继续拨快呢?答案是肯定的,但是为了避免日期的混淆,这时候从东向西越过180°经线的时候,日期需要加一天,如果180°经线的东边是24时,那么180度经线的西边就是下一天的0时。同理,如果180°经线的西边是0时,那么从西向东越过180°经线,时间就变成了前一天的24时。一个更具体的例子:如果180°经线的东边是2017年7月20日正午12时整,那么180°经线的西边就是2017年7月21日12时。,不要问我为什么这样划分,这是国际约定的时期人为界定方法,是为了解决时间的落差问题,可以自己去维基科普。
基本的日期,时区划分,以及时间转换原理已经做了大概的描述,如果想要进一步深究这个问题,可以复习一下初中的地理课本,或者直接去维基百科查询相关介绍。
下面介绍一下在iOS的具体开发中,常用的时区问题,时间转换问题(以Swift开发为例)
附上各国主要地区时区列表的google链接
废话不多说了,直接上代码:

import Foundation

class DateUtilities {
    
    
//GreenWitch Mean Time (GMT)
    static let timeZoneZulu: TimeZone = {
        // +0:00
        if let timeZone = TimeZone(secondsFromGMT:0) {
            return timeZone
        } else {
            //assertionFailure()
            return TimeZone.autoupdatingCurrent
        }
    }()
    
//TimeZoneLocal (Shanghai)
    static let timeZoneLocal: TimeZone = {
        // +8:00
        if let timeZone = TimeZone(abbreviation:"UTC+8") {
            return timeZone
        } else {
            //assertionFailure()
            return TimeZone.autoupdatingCurrent
        }
    }()
    
//Calender
    static let calendar: Calendar = {
        //Gregorian
        var result = Calendar(identifier: Calendar.Identifier.gregorian)
        result.timeZone = DateUtilities.timeZoneLocal
        return result
    }()
    
//DateFormatter
    //2017-07-25 14:19:54:056 +08:00
    static let dateFormatter1: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss:SSS ZZZZZ"
        dateFormatter.timeZone = DateUtilities.timeZoneLocal
        dateFormatter.locale = DateUtilities.localeDetermin
        return dateFormatter
    }()
    //2017-07-25 06:20:51 Z
    static let dateFormatter2: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZZZ"
        dateFormatter.timeZone = DateUtilities.timeZoneZulu
        return dateFormatter
    }()
    //2016-01-01
    static let dateFormatter3: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd"
        dateFormatter.timeZone = DateUtilities.timeZoneLocal
        return dateFormatter
    }()
    //Tuesday, Jul 25, 2017
    static let dateFormatter4: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "EEEE, MMM d, yyyy"
        dateFormatter.timeZone = DateUtilities.timeZoneLocal
        dateFormatter.locale = DateUtilities.localeDetermin
        return dateFormatter
    }()
    //2:34 PM
    static let dateFormatter5: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "h:mm a"
        dateFormatter.timeZone = DateUtilities.timeZoneLocal
        dateFormatter.locale = DateUtilities.localeDetermin
        return dateFormatter
    }()
    //change locale
    static let localeDetermin: Locale = {
        let locale = Locale.init(identifier: "zh-Hans")
        return locale
    }()
    
    //change time from timeStamp to foramt string
    static func transferTimeStampToformatString(timeStamp: String) -> String {
        let timeStamp = CFStringGetDoubleValue(timeStamp as CFString)
        let date = Date(timeIntervalSince1970:timeStamp)
        let dateString = DateUtilities.dateFormatter4.string(from: date)
        return dateString
    }
    
}

下面是一些测试的print:

//Get current time(Green Witch)
print(Date())
//Get current local time
let dateStringLocal = DateUtilities.dateFormatter1.string(from: Date())
print(dateStringLocal)
//Get current Zulu time
let dateStringZulu = DateUtilities.dateFormatter2.string(from: Date())
print(dateStringZulu)
let dateStringShort = DateUtilities.dateFormatter5.string(from: Date())
print(dateStringShort)

//timeStamp
let dateStringFromTimeStamp = DateUtilities.transferTimeStampToformatString(timeStamp: "\(1500967966)")
print(dateStringFromTimeStamp)

其实关于时区的划分和概念的部分,不需要去深究,通过代码,程序会帮助我们自动转化,如果有兴趣的的话,可以适当了解下这部分知识,肯定会加深你对全球时间的理解。以上的代码应该可以满足平常的国际化时间转化相关的,以及本地化相关的功能。

如果有任何不当之处,还请指出,谢谢!

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

推荐阅读更多精彩内容

  • 概念解释 时区(Timezone) 为什么会将地球分为不同时区呢?因为地球总是自西向东自转,东边总比西边先看到太阳...
    黑炭妈阅读 6,409评论 0 5
  • 腊八节闲聊 农历十二月初八,俗谓“腊八”。 腊八,原本是佛教节日。相传这一天为佛祖释迦牟尼的成道日。佛寺常于该日...
    红巧儿阅读 226评论 0 0
  • 你如果不盲目,看得见世界的博大,也看得见世界的精微。 拖延症: 今天心里庆幸呢晚上下班回来既洗了澡和衣服,还贴了面...
    可乐甜不甜阅读 244评论 0 1