0

私はNSDateクラスについて完全に台無しにしています

日付でスケジュールするスケジューリングアプリケーションをやっています

スケジュールが 2011 年 5 月 3 日 13:45 (各タイム ゾーン) であることを知っておく必要があります。タイムゾーンが GMT+5 か GMT+8 かは関係ありません)...

しかし、NSDate は (クラスの名前が示すように) 日付ではなく TIME MOMENT を格納するため、いくつかの問題が発生しています。

1) NSDate は保存されたタイムゾーンを保存しません。つまり、日付が 5.3.2011 13:45 の場合、それが GMT0 なのか GMT +1 なのかわかりません (現地時間よりも2011 年 5 月 3 日 14:45)

2) 2 つの NSDate が同じ日 (9 月 7 日など) である場合、それらは異なるタイムゾーンにある可能性があるため、比較できません (日付は 1 つのゾーンの時点を表すため、この時点は 1 つの日に対応します。他のタイムゾーンから別のタイムゾーンへ)

何をすべきか?

私は次のような方法を見つけました

-(NSDate *) dateToLocalTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = [tz secondsFromGMTForDate: self];
    return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

-(NSDate *) dateToGlobalTime
{
    NSTimeZone *tz = [NSTimeZone defaultTimeZone];
    NSInteger seconds = -[tz secondsFromGMTForDate: self];
    return [NSDate dateWithTimeInterval: seconds sinceDate: self];
}

しかし、これは期待どおりに機能しません

なぜなら、彼らは

NSTimeZone *tz = [NSTimeZone defaultTimeZone];
NSInteger seconds = -[tz secondsFromGMTForDate: self]; 

つまり、これを適切に機能させるには、日付を defaultTimezone に保存する必要がありました

4

1 に答える 1

0

このスレッド (http://www.cocoabuilder.com/archive/cocoa/278456-nsdate-without-time-portion.html) は私を大いに助けてくれました

日付を文字列に格納するので、15.7.2011 15:30 は、どのタイムゾーンにいても 15.7.2011 15:30 のままです

static NSDateFormatter * formatter = nil;

- (NSDate *) reminderLocalDate
{
    if (formatter == nil) {
        NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"YYYYMMDD"];
        [formatter setTimeZone:[NSTimeZone localTimeZone]];
    }
    //[formatter setTimeZone:[NSTimeZone localTimeZone]];
    return [formatter dateFromString:self.reminder];
}

- (void) setReminderWithLocalDate:(NSDate *)date
{
    if (formatter == nil) {
        NSDateFormatter * formatter = [[NSDateFormatter alloc] init];
        [formatter setDateFormat:@"YYYYMMDD"];
        [formatter setTimeZone:[NSTimeZone localTimeZone]];
    }

    self.reminder = [formatter stringFromDate:date];
}

または、20110411 のように NSNumber に格納すると、< == > 演算子を使用できます。

- (NSNumber *) toDNumber
{
    unsigned int unitFlags = NSDayCalendarUnit | NSMonthCalendarUnit | NSYearCalendarUnit;
    NSDateComponents * dc = [[NSCalendar currentCalendar] components:unitFlags fromDate:self];
    return [NSNumber numberWithInt:dc.year * 10000 + dc.month * 100 + dc.day];
}

+ (NSDate *) dateWithDNumber:(NSNumber *)number
{
    NSDateComponents * dc = [[NSDateComponents alloc] init];

    int num = [number intValue];
    dc.year = num / 10000;
    num = num % 10000;

    dc.month = num / 100;
    num = num % 100;

    dc.day = num;

    return [[NSCalendar currentCalendar] dateFromComponents:dc];
}
于 2012-03-16T16:10:54.993 に答える