我完全搞砸了NSDate类
我正在做一个日程安排应用程序,你按日期安排
我只需要知道时间表是5.3.2011 13:45(在每个时区),那就是它(如果你打开应用程序,当地时间是5.3.2011 13:40你看到“在5分钟“无论您的时区是GMT + 5还是GMT + 8 ......”
但由于NSDate存储TIME MOMENT,而不是日期(作为类状态的名称),因此遇到了几个问题
1)NSDate不存储保存时区,这意味着如果我有日期 5.3.2011 13:45我不知道它是GMT0,还是GMT +1(比当地时间5.3.2011 14:45)
2)我无法比较两个NSDates是否在同一天(如9月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才能正常使用
答案 0 :(得分:0)
这个主题(http://www.cocoabuilder.com/archive/cocoa/278456-nsdate-without-time-portion.html)对我帮助很大
我将日期存储在字符串中,所以15.7.2011 15:30,1513.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];
}