今天做了一個(gè)關(guān)于關(guān)于本地推送的功能厅篓,調(diào)試很長(zhǎng)時(shí)間膜赃,一開(kāi)始是因?yàn)橛幸粋€(gè)NSDateFormatter 對(duì)象沒(méi)有設(shè)置格式“YYYY-MM-dd”剧董,后來(lái)發(fā)現(xiàn)赶熟,時(shí)分秒的給事是“HH:mm:ss”(ps:小時(shí)的雙H要大些)
這些旁枝末節(jié)搞定之后,主要是因?yàn)镹SDate的時(shí)差問(wèn)題了米同。因?yàn)橄到y(tǒng)默認(rèn)的NSDate的當(dāng)前時(shí)間和我們實(shí)際上是有8個(gè)小時(shí)的時(shí)差的(這應(yīng)該是因?yàn)槲覀冎袊?guó)和英國(guó)的本初子午線差8個(gè)時(shí)區(qū))骇扇,但這只是打印出來(lái)的顯示效果上的差異(這是我后來(lái)發(fā)現(xiàn)的,不知道是不是正確面粮,求證少孝?)。也就是說(shuō)熬苍,打印出來(lái)的默認(rèn)時(shí)間會(huì)比我們現(xiàn)實(shí)中的時(shí)間慢8個(gè)小時(shí)稍走,但實(shí)際上我們和英國(guó)佬是在同一個(gè)時(shí)間點(diǎn)上的,只是我們兩個(gè)地方時(shí)鐘顯示的時(shí)間不一樣罷了(不知道這么說(shuō)柴底,夠不夠清楚)婿脸。
那么現(xiàn)在問(wèn)題就來(lái)了,我做本地推送功能的時(shí)候要給推送設(shè)置一個(gè)fireDate
UILocalNotification *notification = [[UILocalNotification alloc] init];
NSDate *date =[ [NSDate date] dateByAddingTimeInterval:10.0f]; //當(dāng)前時(shí)間后的10秒鐘柄驻,開(kāi)始發(fā)送本地通知
notification.fireDate= date;
這就是設(shè)置什么時(shí)候發(fā)送通知狐树。如果運(yùn)行這幾行代碼的時(shí)間是 早上 12:00:00 ,那么date的打印出來(lái)的時(shí)間就是 4:00:10。
我做得時(shí)候就把這個(gè)date打印出來(lái)了鸿脓,發(fā)現(xiàn)跟我預(yù)想的不太一樣抑钟,這個(gè)4:00:10是不是意味著要等到手機(jī)的系統(tǒng)時(shí)間是4:00:10才會(huì)發(fā)送通知呢。于是 為了消除這個(gè)時(shí)差野哭,我上網(wǎng)找到了消除時(shí)差的方法(請(qǐng)自行搜索)味赃。消除了之后,我打印出來(lái)的date終于和我手機(jī)上的時(shí)間一樣了虐拓,也就是說(shuō)消除時(shí)差后,date打印出來(lái)的是 12:00:10傲武。好了蓉驹,現(xiàn)在我以為我能夠放心的運(yùn)行了城榛。但是運(yùn)行了之后,我一直等态兴,一直等狠持,都等不到本地通知的推送出現(xiàn)。我就奇怪了瞻润,代碼明明是沒(méi)有問(wèn)題的喘垂,為什么會(huì)有不發(fā)送通知呢?
花了一段時(shí)間绍撞,我終于搞清楚了正勒。解決的辦法就是:刪掉消除時(shí)差的代碼,也就是date打印出來(lái)是 4:00:10時(shí)候的代碼傻铣。
所以我覺(jué)得章贞,雖然系統(tǒng)默認(rèn)打印出來(lái)的當(dāng)前時(shí)間[NSDate date]或許與我們的現(xiàn)實(shí)中的時(shí)間顯示的時(shí)間不一樣,但是對(duì)應(yīng)的都是同一個(gè)時(shí)間點(diǎn)非洲,而系統(tǒng)用的時(shí)自己的那一套時(shí)間鸭限,所以我們的12:00:00是系統(tǒng)的4:00:00,但是系統(tǒng)的12:00:00卻是我們的20:00:00两踏。
總結(jié)一下:在只為了顯示時(shí)間數(shù)據(jù)的時(shí)候败京,我們可以利用消除時(shí)差后的date來(lái)作為顯示。 而如果是為了利用某個(gè)時(shí)間點(diǎn)來(lái)實(shí)現(xiàn)某一功能的時(shí)候(比如上面所說(shuō)梦染,用時(shí)間來(lái)確定發(fā)送本地通知的時(shí)間)赡麦,那么久使用系統(tǒng)自帶的date就可以了,不必勞神我們消除時(shí)差弓坞。