2010-10-16 97 views
1

我想編碼的程序的一部分,允許用戶設置一個或多個警報,提醒他們啓動應用程序,並在一天中的某些時間做某些事情。適當的方式來表示鬧鐘的時間

我基本上明白我需要使用本地通知,但我很難想出用最佳方式在適當的方式下在我的應用程序設置中表示一天的時間。

例如,我想這樣的事情來代表上午08時

[NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)] 

但問題是,這意味着上午08點GMT,而不是在本地時區,所以當我通過這NSDateFormatter例如,我在我的時區結束了凌晨3點。

基本上我知道我需要做一些與NSCalendarNSDateNSTimeInterval,也許NSDateComponents,但我似乎無法拿出來這個最簡單的方法,讓我算算調度NSDates爲iOS本地通知。

所以我想這是什麼歸結爲,我怎麼能代表在系統時區的上午8:00以NSDateFormatter將正確格式化爲本地時間?

好像我應該能算出來,但也許是在晚上只是爲時已晚....

回答

2

例如,我想這樣的事情表示上午08點

[NSDate dateWithTimeIntervalSince1970:(8 * 60 * 60)] 

但問題是,這意味着8 AM GMT,而不是在本地時區...

沒有,問題是,這意味着在1月1日上午8點GMT,1970年

NSDate對象不在任何日曆或時區中表示。 NSDate對象是歷史上的一刻,僅此而已。您需要一個日曆對象來將其轉換爲或來自日曆表示(例如,年,月,日,月,小時,分鐘,秒)或日期格式化器以將其轉換爲字符串表示或從字符串表示轉換(例如, 「2010-10-15T22:29:27-0700」)。

如果您想今天計算上午8點的NSDate,請創建NSCalendar對象並ask it when that is。使用components:fromDate:立即將([NSDate date])變成日期組件,然後覆蓋小時,分鐘和秒並轉換回來。一個UIDatePicker(例如你可能應該向用戶展示,讓他們選擇他們的鬧鐘的日期和時間)會給你一個NSDate;沒有必要對其執行任何類型的轉換或操縱。如果用戶選擇讓你在實際事件之前多次響起警報,那麼你可能需要做的最多的是減去一些時間。

所以我想這是什麼歸結爲,我如何表示在系統時區的上午8:00以NSDateFormatter將正確格式化爲本地時間?

NSDateFormatter需要NSDate,正如我所說的,NSDates不在時區中。正如你看到的,你的日期格式化程序默認使用用戶的時區(儘管這在文檔中沒有明確說明)。爲了讓日期格式化者使用別的東西,你必須告訴它這樣做。

+0

好的,我從中得到的是我不應該試圖濫用NSDate來表示一天中的時間,而只是存儲小時和分鐘的NSUIntegers,或者可能只是存儲自午夜以來的分鐘或秒鐘,然後只是用它來計算通知排定時的日期。然後,我只是不使用NSDateFormatter在UI中顯示鬧鐘時間,因爲它不適合用於此。 – Nimrod 2010-10-16 11:24:40

+0

Nimrod:使用NSDateComponents來計算小時和分鐘,或者存儲自午夜以來的秒數(作爲NSTimeInterval,它沒有固定參考點 - 參考點+間隔=日期)。你可以使用NSDateFormatter來呈現一個特定的火災日期(「下一次報警:2010-10-17T08:00」),但是,對於單獨的小時和分鐘,你應該使用別的東西。 – 2010-10-16 15:31:47