2014-02-16 37 views
0

2個月前我發佈了我的第一個應用程序到App Store,迄今爲止成功非常出色。但是最近我發現了一個問題。iOS App不同的時區處理日期條目不同

該應用的前提是能夠跟蹤給定和收到的金錢信封。這是一個簡單的應用程序,允許您添加條目,然後在標籤欄中顯示按時間順序排列的時間軸,然後按照其他選項卡中的名稱,事件和年份進行過濾。除了當你改變時區時,它在世界各地運作良好。

該應用程序在後臺使用核心數據,包括一些NSPredicate檢查,看看「如果你今年選擇已經存在,我會返回它,如果沒有,我將創建一個新的條目的一年」 。因此,如果您有2014年和2013年的一個條目,那麼在年份選項卡中,您將看到2014年的一個條目和2013年的一個條目。如果您爲2014年添加了另一個條目,則不會在2014年看到兩個2014條目年份「選項卡,但仍然是2014年的一個條目(下面列出了所有交易)。

使用UIDatePicker選擇日期以獲取實際日期。

當您更改時區時會出現問題。如果你這樣做,2014年作爲一年的入口不再被認定爲與之前的2014年相同的入口,因此在年份標籤中,我將結束多個2014年的參賽作品,這當然是沒有意義的。

我發現這與時間有關,下面你可以看到我沒有使用時區,而是使用了NSGregorianCalendar功能。

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date]; 
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent]; 

沒有太多在這裏改變了應用程序的功能(我希望它以同樣的方式工作),我將如何去指定的發言權GMT的時區,但因爲夏令等的,我我希望將它保持在格林威治標準時間下午12點作爲標準,所以無論您身在何處,它都將關注格林威治標準時間12點。

我希望這是有道理的,但任何援助將不勝感激。

感謝,

+0

通常我使用帶有GMT時區的dateFormatter來解析日期字符串,併發送/接收帶有零時區的日期字符串(例如@「01/01/2014 +000」)。 'NSDateFormatter * dateFormatter = [NSDateFormater new]; [dateFormatter setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]]'。不知道是否正確的解決方案,但它適合我的需求 –

+0

親愛的Mykola - 非常感謝您的答覆,這是有道理的 - 我用馬丁的答案來得到這個工作,但我也明白你的方法 - 欣賞它! – amitsbajaj

回答

2

時區是相當棘手的處理..你總是要考慮你的日期屬性的語義(例如,如果澳大利亞在2014年進入了一個值應顯示爲「2014年」或因爲'家庭時區'在美國,這是2013年等等)

NSCalendar默認使用當前本地時區,因爲UIDatePicker(和NSTimeFormatter,它在內部使用時您使用的是po date在調試器中)。 我的第一個建議是今年存儲在數據庫中的獨立字段,如果你想這樣做基於它的過濾..

但是,如果你想「正常化」日期值到一個特定的時間段,您可以設置在NSDateComponents UTC時區,以獲得UTC今年第一時刻:

NSCalendar *yearCal = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *yearComponent = [yearCal components:NSYearCalendarUnit fromDate:self.datePicker.date]; 
[yearComponent setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]] 
NSDate *selectedYear = [yearCal dateFromComponents:yearComponent]; 

這將覆蓋NSCalendar的所在時區屬性(它應該是一樣的UIDatePicker的)。

+0

您好Martin - 非常感謝您的回覆,並且對於遲到的回覆表示歉意(幾天都有點瘋狂),但是您的代碼確實幫助了大量的工作,並且確保現在已經刪除了該錯誤。這真的很有幫助,它使用UTC時區是完全合理的。非常感謝 - 非常感謝! – amitsbajaj