0

私は、この方法を使用して、日付を多く処理し、これらを文字列としてコアデータに格納するアプリを開発しました。

- (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];

特定の日付/時刻を設定/変更/作成し、計算を行い、それらをNSStringとしてコアデータに再度取得/保存する必要がある場合。

私の質問は、適切なカレンダーの使用についてです。

私はいつも書くべきですか:

NSCalendar *calendar = [NSCalendar currentCalendar]; ?

また

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

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

特に アプリがヨーロッパ/アメリカと中国のどちらで使用されているかによって異なりますか?

4

1 に答える 1

2

あなたの方法stringToDateは実際には正確には機能しません。 QA1480を参照してください。短いバージョン:NSDateFormatter残念ながら、 には、特定のテキスト形式のデコードとエンコード、および表示用の日付の変換という、わずかに矛盾する 2 つの役割があります。後者はロケール関連であるため、デフォルトです。en_US_POSIX以前の動作を確実に取得するには、日付文字列を正確に尊重することが保証されているロケールを明示的に設定する必要があります。

そうは言っても、あなたは an とは何かについて少し混乱しているようNSDateです。これNSStringは、日付の書面による表現ではありません。正確な瞬間の抽象的な記録です。したがって、現在のカレンダーとはまったく関係ありません。ユーザーのカレンダーとロケールは日付の印刷方法に影響しますが、日付自体には影響しません。どんなに書いても今はまだ今。そのため、日付にフォーマッタを適用すると正しいローカル日付が取得されますが、コンソールに日付を記録するだけでは、抽象的なものになり、必ずしもローカル タイム ゾーンにあるとは限りません。NSDateタイムゾーンや異なるカレンダーの概念はありません。

Core Data は日付を直接格納できる (つまり、数値の場合よりも手動で from 文字列に変換する必要がない) ため、何を求めているのか完全にはわかりません。ただし、通常の動作はcurrentCalendar、ユーザーに何かを表示する場合に使用します。タイムゾーンやその他の設定に従って表示されます。

QA によると、固定の日付文字列を適用するには、明示的に設定されたロケールで日付フォーマッタを使用する必要があり、カレンダーについてはまったく考えないでください。

于 2012-07-25T15:34:12.813 に答える