2011-05-31 35 views
0

所以我似乎被iPhone的日曆支持again燒燬。核心數據比較日期的方式遇到了一個問題。核心數據似乎是使用格里曆的存儲日期,因爲它們以20XX-MM-dd格式出現。但是,當我建立一個NSPredicate這樣日語日曆下的核心數據錯誤地比較日期

[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [NSDate date], [NSDate date]]] 

如果用戶的設備未設置爲一個公曆則沒有項目會出現,作爲核心數據似乎並沒有本地化它NSDates對輸入日期比較之前不。

因此,如果日期是日曆日曆模式中的日期「2011-05-31」,那麼核心數據會使用'0023-05-31',因爲它是當前皇帝的第23年,因此將輸入日期大約在2000年前它與之相比。

我發現我可以解決此像這樣

NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init]; 
[dateFormat setLocale:[[[NSLocale alloc] initWithLocaleIdentifier:[[NSLocale preferredLanguages] objectAtIndex:0]] autorelease]]; 
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; 
NSString *todayGregorian = [[dateFormat stringFromDate:[NSDate date]] retain]; 
[dateFormat release]; 

NSDateFormatter *df = [[NSDateFormatter alloc] init]; 
[df setDateFormat:@"yyyy-MM-dd HH:mm:ss ZZZ"]; 
[nsRequest setPredicate:[NSPredicate predicateWithFormat:@"publish <= %@ AND expires >= %@", [df dateFromString:todayGregorian], [df dateFromString:todayGregorian]]]; 

,但我希望,也許我是一個傻瓜,有一個更好的辦法。有什麼建議麼?

請注意:

  • 問我的日本用戶更換他們 使用日期格式不是 選項。
  • 另外,我還需要 核心數據的日期存儲在一個公曆 格式,這些用戶有時會 改變他們的日曆回 等等。上述

真正的問題 我的解決辦法是錯誤的。 TechZen的答案讓我頭痛,我希望能夠給他投票100次,我最終解決了這個問題。

我的問題是數據要到核心數據正在由服務器發送GMT和formmater解析這些數據可能不一定是在格林尼治標準時間,所以我需要調整的時間正確要去到核心數據。

回答

2

你真的別無選擇,只能從NSDate轉換到各種日曆,特別是如果你的用戶使用多個日曆。

日曆對象本身不是日期,而是專門的格式化程序。所有日期實際上都以GMT標準格式存儲,而不管它們始於哪個日曆。然後根據需要將它們翻譯/格式化爲適當的日曆。我們不會立即在針對西方人的應用中看到這一點,因爲當代西方日曆基於GMT,因此不需要翻譯。

日期和時間編程看似複雜。我們並不直觀地認爲它很複雜,因爲通常爲我們處理這麼多煩瑣的工作。但是,當你開始做一些不尋常的事情時,複雜性就顯而易見了。作爲一個經驗法則,數據和時間編程所擔心的時間並不是代碼看起來很複雜,但似乎很簡單。

+0

你說得對。我的問題有兩個方面,數據進入核心數據由服務器在格林威治標準時間發送和格式解析數據可能不一定在格林尼治標準時間,所以我需要調整進入核心數據的時間和出來的時間如此我可以將它歸一化爲GMT。 – AWinter 2011-06-02 06:14:39

+0

我認爲這是一個CoreData框架的內部錯誤。我檢查了存儲在SQLite文件中的日期字段,它存儲爲紀元時間,換句話說,它存儲在浮點數中,'[NSDate timeIntervalSince1970]'可以在不同的日曆中正常工作。不知道'NSPredicate'內發生了什麼。我想我們可以通過自己存儲日期來解決這個問題,然後用'[NSDate timeIntervalSince1970]'比較日期。 – 2012-02-01 06:24:52