簡體   English   中英

NSRepublicOfChinaCalendar和NSGregorianCalendar有什么區別?

[英]What is the difference between NSRepublicOfChinaCalendar and NSGregorianCalendar?

我開發了一個應用程序,它可以使用日期工作,並使用此方法將這些應用程序存儲為核心數據中的字符串:

- (NSDate*) stringToDate{
   NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
   [dateFormat setDateFormat:@"yy-MM-dd HH:mm"];
   NSDate *date = [dateFormat dateFromString:self];

   return date;

}

使用日期/時間非常棘手 - 僅僅是系統和現場時間之間的時差 - 無論如何,上述方法應該照顧到這一點。 (所以我希望,因為將NSDate格式化為NSString會返回正確的本地時間,而不是在調試器中查看NSDate變量,這表明我的情況有2小時的差異)

還有很多像這樣的計算:

    NSCalendar *calendar = [NSCalendar currentCalendar];   <------

    NSDateComponents *components = [calendar components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSYearCalendarUnit |NSMonthCalendarUnit|NSDayCalendarUnit) fromDate:someDate];

    NSInteger now_hour = [components hour];
    NSInteger now_minute = [components minute];
    NSInteger yearx =  [components year];
    NSInteger monthx =  [components month];
    NSInteger dayx =  [components day];

我需要設置/更改/創建某些日期/時間,進行計算並將其作為NSStrings再次檢索/存儲在核心數據中。

我的問題是關於使用適當的日歷。

我應該總是寫:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

要么

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSRepublicOfChinaCalendar];

ESP。 取決於該應用程序是用於歐洲/美國對中國?

您的方法stringToDate實際上不會完全正常工作,請參閱QA1480 簡短版本:不幸的是, NSDateFormatter有兩個略有矛盾的角色 - 解碼和編碼特定的文本格式並轉換日期以供顯示。 因為后者與語言環境相關,所以它是默認值。 為了確保您獲得前一種行為,您應該明確設置en_US_POSIX語言環境,這完全可以保證您的日期字符串。

話雖如此,你似乎對NSDate含義感到有些困惑。 它不是NSString或任何其他日期的書面表示。 這是一個精確時刻的抽象記錄。 因此,它與當前日歷完全無關。 用戶的日歷和區域設置將影響日期的打印方式,但不會影響日期本身。 現在還在,但是你寫了。 這就是為什么當你將格式化程序應用到日期時你得到一個正確的本地日期,但是如果你只是將日期記錄到控制台,那么你會得到一些抽象的東西,而不一定是你當地的時區。 NSDate沒有時區或不同日歷的概念。

核心數據可以直接存儲日期(也就是說,你不需要手動轉換為字符串,而不是數字值)所以我不完全確定你得到了什么。 但是,當您想要為用戶顯示內容時,正常行為是使用currentCalendar 這將根據他們的時區和其他設置顯示。

根據質量保證,對於應用固定日期字符串,您應該使用具有明確設置的語言環境的日期格式化程序,而不要考慮日歷。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM