NSRepublicOfChinaCalendar と NSGregorianCalendar の違いは何ですか?
-
11-12-2019 - |
質問
私は日付を多く扱うアプリを開発し、次の方法を使用して日付を文字列としてコアデータに保存します。
- (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];
特に。アプリがヨーロッパ/米国と中国のどちらで使用されているかによって異なりますか?
解決
あなたの方法 stringToDate
実際には正確に動作しません。 QA1480. 。短縮版:の NSDateFormatter
残念ながら、 には、特定のテキスト形式のデコードとエンコード、および表示用の日付の変換という、少し矛盾した 2 つの役割があります。後者はロケールに関連しているため、これがデフォルトです。確実に前者の動作を得るには、明示的に設定する必要があります。 en_US_POSIX
ロケールは、日付文字列を正確に尊重することが保証されています。
そうは言っても、あなたは、それが何なのか少し混乱しているようですが、 NSDate
は。それはありません NSString
または日付のその他の書面による表現。それは正確な瞬間の抽象的な記録です。したがって、現在の暦とはまったく関係ありません。ユーザーのカレンダーとロケールは日付の印刷方法に影響しますが、日付自体には影響しません。どう書いても、今はまだ今です。そのため、日付にフォーマッタを適用すると正しいローカル日付が取得されますが、日付をコンソールに記録するだけでは抽象的な日付が取得され、必ずしもローカル タイム ゾーンにあるとは限りません。 NSDate
には、タイムゾーンや異なるカレンダーの概念がありません。
Core Data は日付を直接保存できるので (つまり、数値の場合と同様に手動で文字列に変換する必要はまったくありません)、何をしているのか完全にはわかりません。ただし、通常の動作は使用することです currentCalendar
ユーザーに何かを表示したいとき。これは、タイムゾーンやその他の設定に従って表示されます。
QA によると、固定日付文字列を適用するには、明示的に設定されたロケールを持つ日付フォーマッタを使用する必要があり、カレンダーについてはまったく考慮しないでください。