iOS中對(duì)時(shí)間的理解

經(jīng)常出現(xiàn)的8小時(shí)

在代碼中寫(xiě)到關(guān)于時(shí)間的問(wèn)題時(shí)經(jīng)常遇到一個(gè)惹人煩的8小時(shí)問(wèn)題再愈,這個(gè)就是因?yàn)槲覀兪窃跂|八區(qū) ,而有時(shí)候后端返給我們的時(shí)間是零時(shí)區(qū)的時(shí)間,東八區(qū)比零時(shí)區(qū)要早8小時(shí),比如現(xiàn)在東八區(qū)是中午十二點(diǎn),零時(shí)區(qū)就是凌晨四點(diǎn)流炕,那么我們就需要把零時(shí)區(qū)的時(shí)間轉(zhuǎn)化為東八區(qū)的時(shí)間。
首先看一個(gè)例子仅胞,獲取當(dāng)前時(shí)間字符串:

//通過(guò)[NSDate date]返回的一定是零時(shí)區(qū)的時(shí)間
NSDate *date = [NSDate date];

NSLog(@"date時(shí)間 = %@", date);
//如果沒(méi)有規(guī)定formatter的時(shí)區(qū)每辟,那么formatter默認(rèn)的就是當(dāng)前時(shí)區(qū),比如現(xiàn)在在北京就是東八區(qū)干旧,在東京就是東九區(qū)
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
//最結(jié)尾的Z表示的是時(shí)區(qū)渠欺,零時(shí)區(qū)表示+0000,東八區(qū)表示+0800
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
使用formatter轉(zhuǎn)換后的date字符串變成了當(dāng)前時(shí)區(qū)的時(shí)間
NSString *dateStr = [formatter stringFromDate:date];

NSLog(@"字符串時(shí)間 = %@", dateStr);

輸出:

2018-05-31 14:43:07.011223+0800 TimeDemo[4674:167771] date時(shí)間 = 2018-05-31 06:43:07 +0000
2018-05-31 14:43:07.011777+0800 TimeDemo[4674:167771] 字符串時(shí)間 = 2018-05-31 14:43:07 +080

很重要的一點(diǎn)就是椎眯,[NSDate date]返回的是零時(shí)區(qū)的時(shí)間挠将!返回的是零時(shí)區(qū)的時(shí)間胳岂!返回的是零時(shí)區(qū)的時(shí)間!

打印結(jié)果前面的時(shí)間是北京時(shí)間舔稀,為2018-05-31 14:43:07.011223乳丰,而通過(guò)[NSDate date]得到的時(shí)間是2018-05-31 06:43:07 +0000,后面的+0000就表示了這個(gè)時(shí)間是零時(shí)區(qū)的時(shí)間内贮,這個(gè)時(shí)間對(duì)應(yīng)的東八區(qū)的時(shí)間就是2018-05-31 14:43:07.011223 +0800了产园。這兩個(gè)時(shí)間是同一個(gè)時(shí)間,只不過(guò)時(shí)區(qū)不一樣夜郁。

formatter在不特意設(shè)置時(shí)區(qū)的情況下什燕,默認(rèn)時(shí)區(qū)是當(dāng)前地區(qū)的時(shí)區(qū),比如我們?nèi)绻谥袊?guó)竞端,當(dāng)前時(shí)區(qū)就是東八區(qū)秋冰,我們?nèi)绻咽謾C(jī)拿到東京,當(dāng)前時(shí)區(qū)就是東九區(qū)婶熬。經(jīng)過(guò)formatter轉(zhuǎn)化為時(shí)間字符串后時(shí)間就變成了當(dāng)前時(shí)區(qū)也就是東八區(qū)的時(shí)間2018-05-31 14:43:07 +080,也就沒(méi)有了8小時(shí)的誤差埃撵。

轉(zhuǎn)字符串時(shí)間的時(shí)區(qū)設(shè)置

上面例子中NSDate時(shí)間轉(zhuǎn)字符串時(shí)間時(shí)赵颅,NSDateFormatter并沒(méi)有設(shè)置時(shí)區(qū),而是使用當(dāng)前地區(qū)的時(shí)區(qū)暂刘,這和設(shè)置系統(tǒng)系統(tǒng)時(shí)區(qū)formatter.timeZone = [NSTimeZone systemTimeZone]的效果是一樣的饺谬。我們也可以規(guī)定一定使用某一個(gè)時(shí)區(qū):

NSDate *date = [NSDate date];
    
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
 [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
    
   formatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Shanghai"];//東八區(qū)時(shí)間
    
NSString *dateStr = [formatter stringFromDate:date];
    
NSLog(@"字符串時(shí)間 = %@", dateStr);

這樣不管我們的手機(jī)是在哪里,打印出來(lái)的時(shí)間都是東八區(qū)的時(shí)間谣拣。
還有如下的時(shí)區(qū)指定:

formatter.timeZone = [NSTimeZone timeZoneWithName:@"Asia/Tokyo"];//東九區(qū)時(shí)間

formatter.timeZone = [NSTimeZone timeZoneWithName:@"GMT"];//零區(qū)時(shí)間
formatter.timeZone = [NSTimeZone timeZoneWithName:@"UTC"];//零區(qū)時(shí)間募寨,和GMT一樣

字符串時(shí)間轉(zhuǎn)NSDate

字符串時(shí)間轉(zhuǎn)NSDate也會(huì)有時(shí)間問(wèn)題,看下面的例子:

    NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
    
    [formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSDate *newDate = [formatter dateFromString:@"2016-12-07 14:06:24 +0800"];
    
    NSLog(@"newDate = %@", newDate);

打印結(jié)果:

2018-05-31 15:22:11.878915+0800 TimeDemo[5236:189492] newDate = 2016-12-07 06:06:24 +0000

我們看到這樣轉(zhuǎn)化后就出現(xiàn)了問(wèn)題轉(zhuǎn)后之后得到的時(shí)間的時(shí)區(qū)又變成了零時(shí)區(qū)森缠。問(wèn)題就出在拔鹰,凡是返回結(jié)果為NSDate類型的,得到的時(shí)間都是零時(shí)區(qū)贵涵,都是零時(shí)區(qū)列肢!都是零時(shí)區(qū)!
如果上面給出的字符串時(shí)間是@"2016-12-07 14:06:24 +0000"宾茂,也就是這個(gè)時(shí)間字符串的時(shí)區(qū)是零時(shí)區(qū)瓷马,那么得到的結(jié)果就不會(huì)有變化拣度。
NSDateFormatter的格式為@"yyyy-MM-dd HH:mm:ss Z"厉斟,這里面的Z表示的就是時(shí)區(qū),我們?cè)趥鬟f時(shí)間字符串的時(shí)候也要按照這個(gè)規(guī)則在時(shí)間后面加上+0800或者+0000這樣表示時(shí)區(qū)的员淫。
當(dāng)不指定字符串的時(shí)區(qū)時(shí)端盆,即NSDateFormatter的格式為@"yyyy-MM-dd HH:mm:ss"怀骤,這樣傳遞進(jìn)來(lái)的字符串的時(shí)區(qū)默認(rèn)為當(dāng)前時(shí)區(qū)费封,轉(zhuǎn)化為NSDate是零時(shí)區(qū)時(shí)間。

當(dāng)前時(shí)間轉(zhuǎn)時(shí)間戳

時(shí)間戳是指1970年1月1日0時(shí)0分0秒到當(dāng)前時(shí)間的秒數(shù)晒喷。注意這里的當(dāng)前時(shí)間是指零時(shí)區(qū)的NSDate時(shí)間孝偎。

NSDate *date = [NSDate date];

NSTimeInterval timeIn = [date timeIntervalSince1970];

NSLog(@"時(shí)間戳 = %.0f", timeIn);

打印結(jié)果:

2018-05-31 15:49:48.165702+0800 TimeDemo[5635:205558] 時(shí)間戳 = 1527752988

NSDate轉(zhuǎn)當(dāng)前時(shí)區(qū)的NSDate時(shí)間

NSDate *date = [NSDate date];

NSTimeZone *zone = [NSTimeZone systemTimeZone];
//獲得當(dāng)前時(shí)區(qū)和零時(shí)區(qū)的秒數(shù)偏移量
NSInteger interval = [zone secondsFromGMTForDate:date];

NSDate *localDate = [date  dateByAddingTimeInterval:interval];

NSLog(@"localDate = %@",localDate);

時(shí)間戳和時(shí)間字符串的相互轉(zhuǎn)換

時(shí)間戳轉(zhuǎn)時(shí)間字符串

- (NSString *)convertToTimeStringWithTimeInterval:(NSTimeInterval)timeInterval{
    
    NSDate *date = [NSDate dateWithTimeIntervalSince1970:timeInterval];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSString *dateStsring = [dateFormatter stringFromDate:date];
    return dateStsring;
}

時(shí)間字符串轉(zhuǎn)時(shí)間戳

- (NSTimeInterval)convertToTimeIntervalWithTimeString:(NSString *)timeString{
    
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
    
    NSDate *date = [dateFormatter dateFromString:timeString];
    NSTimeInterval timeInterval = [date timeIntervalSince1970];
    return timeInterval;
}
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市凉敲,隨后出現(xiàn)的幾起案子衣盾,更是在濱河造成了極大的恐慌,老刑警劉巖爷抓,帶你破解...
    沈念sama閱讀 216,470評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件势决,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡蓝撇,警方通過(guò)查閱死者的電腦和手機(jī)果复,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,393評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)渤昌,“玉大人虽抄,你說(shuō)我怎么就攤上這事《栏蹋” “怎么了迈窟?”我有些...
    開(kāi)封第一講書(shū)人閱讀 162,577評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)忌栅。 經(jīng)常有香客問(wèn)我车酣,道長(zhǎng),這世上最難降的妖魔是什么索绪? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 58,176評(píng)論 1 292
  • 正文 為了忘掉前任湖员,我火速辦了婚禮,結(jié)果婚禮上瑞驱,老公的妹妹穿的比我還像新娘娘摔。我一直安慰自己,他們只是感情好唤反,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,189評(píng)論 6 388
  • 文/花漫 我一把揭開(kāi)白布晰筛。 她就那樣靜靜地躺著,像睡著了一般拴袭。 火紅的嫁衣襯著肌膚如雪读第。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 51,155評(píng)論 1 299
  • 那天拥刻,我揣著相機(jī)與錄音怜瞒,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛吴汪,可吹牛的內(nèi)容都是我干的惠窄。 我是一名探鬼主播,決...
    沈念sama閱讀 40,041評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼漾橙,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼杆融!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起霜运,我...
    開(kāi)封第一講書(shū)人閱讀 38,903評(píng)論 0 274
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤脾歇,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后淘捡,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體藕各,經(jīng)...
    沈念sama閱讀 45,319評(píng)論 1 310
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,539評(píng)論 2 332
  • 正文 我和宋清朗相戀三年焦除,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了激况。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,703評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡膘魄,死狀恐怖乌逐,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情创葡,我是刑警寧澤浙踢,帶...
    沈念sama閱讀 35,417評(píng)論 5 343
  • 正文 年R本政府宣布,位于F島的核電站蹈丸,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏呐芥。R本人自食惡果不足惜逻杖,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,013評(píng)論 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望思瘟。 院中可真熱鬧荸百,春花似錦、人聲如沸滨攻。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 31,664評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)光绕。三九已至女嘲,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間诞帐,已是汗流浹背欣尼。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,818評(píng)論 1 269
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留停蕉,地道東北人愕鼓。 一個(gè)月前我還...
    沈念sama閱讀 47,711評(píng)論 2 368
  • 正文 我出身青樓钙态,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親菇晃。 傳聞我的和親對(duì)象是個(gè)殘疾皇子册倒,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,601評(píng)論 2 353

推薦閱讀更多精彩內(nèi)容

  • iOS開(kāi)發(fā)中,經(jīng)常會(huì)遇到各種各樣的時(shí)間問(wèn)題磺送,8小時(shí)時(shí)差驻子,時(shí)間戳,求時(shí)間間隔册着,農(nóng)歷等等拴孤。解決辦法網(wǎng)上比比皆是,但大多...
    小李龍彪閱讀 6,331評(píng)論 1 6
  • 在iOS開(kāi)發(fā)中甲捏,經(jīng)常會(huì)遇到各種各樣的時(shí)間問(wèn)題演熟,8小時(shí)時(shí)差,時(shí)間戳司顿,求時(shí)間間隔芒粹,農(nóng)歷等等。解決辦法網(wǎng)上比比皆是大溜,但大...
    真巧了_嘿閱讀 2,772評(píng)論 0 7
  • 像小強(qiáng)一樣活著閱讀 3,615評(píng)論 6 16
  • 主要有以下幾個(gè)類: NSDate:表示一個(gè)具體的絕對(duì)的時(shí)間點(diǎn)化漆。NSTimeZone:表示時(shí)區(qū)信息。NSLocale...
    獻(xiàn)國(guó)閱讀 5,223評(píng)論 0 3
  • 畢業(yè)后進(jìn)入了圖書(shū)出版行業(yè)钦奋,對(duì)象主要是高校教座云,但是總覺(jué)得應(yīng)該還不錯(cuò),整天和老師打交道付材。起初的時(shí)候很難朦拖,我不...
    mi婭的coffee閱讀 178評(píng)論 0 0