2012-03-16 49 views
0

IAM总无奈完全以搞砸有关的NSDate类约Cococa的NSDate

IAM做一个日程安排应用程序,在那里你按日期

我只需要知道的时间表是2011年3月5日13时间表: 45(在每个时区),这就是它(如果你打开应用程序,当地时间是5.3.2011 13:40你会看到“在5分钟内”,不管你的时区是GMT + 5还是GMT + 8)。 ..

但由于NSDate存储了一个TIME MOMENT,而不是日期(作为类的名称状态),iam遇到几个问题

1)NSDate不存储它保存的时区,这意味着如果我有一个日期 5.3.2011 13:45我不知道它是否是GMT0,或它在GMT + 1(比在当地时间它的5.3.2011 14:45)

2)我不能比较,如果两个NSDates是在同一天(如9月7日),因为他们可以在不同的时区(由于日期代表时间的时刻,在一个区域中,这个时刻对应于一天,在另一个时区到另一个时区)

该怎么办?

我发现,因为它们使用

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

这意味着日期已经被保存在defaultTimezone按预期

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

但方法都不起作用努力工作

+0

什么不按预期与他们工作? – 2012-03-16 15:05:54

+0

,因为他们使用NSTimeZone * tz = [NSTimeZone defaultTimeZone]; NSInteger秒= - [tz secondsFromGMTForDate:self];这意味着日期必须保存在defaultTimezone才能正确工作 – 2012-03-16 15:08:05

+1

听起来像你还没有发现['NSCalendar'](http://developer.apple.com/library/mac/#documentation/Cocoa/Reference/Foundation /Classes/NSCalendar_Class/Reference/NSCalendar.html)。 – 2012-03-16 22:43:09

回答

0

此线程(http://www.cocoabuilder.com/archive/cocoa/278456-nsdate-without-time-portion.html)帮助了我很多

我将存储日期字符串,所以15.7.2011 15 30,保持2011年7月15日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]; 
}