Тотальное разочарование по поводу Cococa NSDate - PullRequest
0 голосов
/ 16 марта 2012

Я полностью запутался в классе NSDate

Я делаю приложение планирования, где вы планируете по дате

Мне нужно просто знать, что расписание на 5.3.2011 13:45 (в каждом часовом поясе) и вот оно (если вы открываете приложение, а местное время - 5.3.2011 13:40, вы видите "в 5 минут "независимо от того, ваш часовой пояс GMT + 5 или GMT + 8) ...

но поскольку NSDate хранит МОМЕНТ ВРЕМЕНИ, а не дату (как указывает название класса), у меня возникают несколько проблем

1) NSDate не хранит часовой пояс, в котором он был сохранен, что означает, что если у меня есть дата 5.3.2011 13:45 я не знаю, будет ли это время по Гринвичу0 или по Гринвичу +1 (чем по местному времени его 5.3.2011 14:45)

2) я не могу сравнить, если две NSDates находятся в один и тот же день (например, 7 сентября), так как они могут быть в другом часовом поясе (так как дата представляет момент времени, в одной зоне этот момент времени соответствует одному дню , в другой часовой пояс в другой)

что делать?

я нашел такие методы, как

-(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 для правильной работы

1 Ответ

0 голосов
/ 16 марта 2012

эта тема (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];
}

или даже намного лучше, чтобы хранить их в NSNumber, например 20110411, чтобы я мог использовать операторы <==>

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