6

出席を追跡する iOS アプリを作成しています。各出席エントリは、ステータス属性 (出席、欠席など) と、出席記録が取得された日を示すNSDate属性 (called ) を持つオブジェクトに格納されます。date特定の日付を (aUIDatePickerViewまたは alike を使用して) 選択すると、その日付のすべての出席レコード (オブジェクト) がテーブル ビューに表示されます。

これは原則として単純に聞こえますが、タイムゾーンに関連する問題に直面しています。s がタイムゾーンとは無関係に保存されることは承知していますNSDate(つまり、UTC/GMT +0000 を基準にして保存されます)。これは、私がシドニーにいて、たとえば 2012 年 11 月 4 日の日曜日に出勤した場合、日付はタイムゾーンに依存しないものとして保存されているため、iPhone/iPad を別のタイムゾーン (サンフランシスコなど) に持って行った場合、すべての出勤日が記録されることを意味します。レコードは 1 日さかのぼり、この場合は 2012 年 11 月 3 日土曜日に移動します。これは、サンフランシスコの現地時間 (実際にはシドニーの現地時間で翌日) で出席が取得された時点であるためです。

私はこれが起こってほしくありません - 私は日付が絶対であることを望みます。つまり、出席が 2012 年 11 月 4 日の日曜日に取得された場合、世界のどこにいても (そしてどのタイムゾーンにいても)、その日付にとどまる必要があります。ご覧のとおり、これは、たとえば予定のタイミングがタイムゾーンに応じて変化することが望ましいカレンダー アプリケーションとはまったく対照的です。

この問題にアプローチするためのより良い方法についての提案をいただければ幸いです。UIDatePickerViewタイムゾーンに依存しない形式で現在を返すを使用して表示する日付を選択していることに注意してくださいNSDate。そのため、簡単な比較を行う方法も必要です (NSPredicate出席オブジェクトは Core Data に保存されているため、 であることが望ましい)。その特定の日のすべての出席オブジェクトを取得します。

4

2 に答える 2

6

時間を NSDateComponents に変換しようとしましたか? その後、タイムゾーンに関係なく、そこから NSDate を再作成できます。

編集して追加

// This is just so I can create a date from a string.
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss z"];


// Create a date as recorded in a timezone that isn't mine.
NSDate *localDate = [formatter dateFromString:@"2012-10-30 10:30:00 +0200"];
NSLog(@"Initial Date: %@", localDate);
// this logs 2012-10-30 08:30:00 +0000
// Which is what you would expect, as the original time was 2 hours ahead

NSDateComponents *components = [[NSDateComponents alloc] init];
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
components = [gregorian components:NSYearCalendarUnit | NSMonthCalendarUnit | NSDayCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit fromDate:localDate];

NSLog(@"Components: %@", components);


// Create a date from these time components in some other time zone
[gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EST"]];
NSDate *newDate = [gregorian dateFromComponents:components];

NSLog(@"New Date: %@", newDate);
// This logs 2012-10-30 12:30:00 +0000
// Which is the local EST of 8:30 am expressed in UTC

これは、+2 タイムゾーンの午前 8 時 30 分を -4 タイムゾーンの場合と同じように見せる方法を示しています。

于 2012-11-04T03:56:08.687 に答える
1

タイムゾーンに依存しないため、タイムスタンプを使用することをお勧めします。タイムスタンプを日付に変換したり戻したりするには、vary メソッドを使用できます。そして、あなたが望むロジックを実装してください。

また、それらを簡単に比較することもできます。

于 2012-11-04T05:37:27.507 に答える