谢谢你,奥莱。我终于明白了
NSDate
和
NSDateformatter
只是抽象的
概念和“日期”在内部真正被保存为“自2001年1月1日起的毫秒或秒”。
我做了一个“概念证明”来真正理解它。现在,写一些分类突然变得非常简单
小精灵
这样可以确保输入和输出的日期格式正确,但所有计算都是在原始UTC日期完成的。
- (void) testGMTDateParser {
NSMutableArray *arrayDates = [NSMutableArray arrayWithCapacity:5];
[self setParsedDates:arrayDates];
NSMutableArray *arrayGMTOffsets = [NSMutableArray arrayWithCapacity:5];
[self setParsedGMTOffsets:arrayGMTOffsets];
NSString *date00 = @"2010-03-30T12:00:00";
NSString *GMT00 = @"-2";
NSString *date01 = @"2010-03-30T12:00:00";
NSString *GMT01 = @"-1";
NSString *date02 = @"2010-03-30T12:00:00";
NSString *GMT02 = @"+0";
NSString *date03 = @"2010-03-30T12:00:00";
NSString *GMT03 = @"+1";
NSString *date04 = @"2010-03-30T12:00:00";
NSString *GMT04 = @"+2";
NSArray *dateArray = [NSArray arrayWithObjects:date00, date01, date02, date03, date04,nil];
NSArray *GMTArray = [NSArray arrayWithObjects:GMT00, GMT01, GMT02, GMT03, GMT04, nil];
for (int i = 0; i < [dateArray count]; i++) {
[self parseDateString:[dateArray objectAtIndex:i] withGMTString:[GMTArray objectAtIndex:i]];
}
}
根据各自的GMT偏移量分析日期。这将确保节省UTC时间
内部是正确的。
-(void) parseDateString:(NSString*) dateString withGMTString:(NSString*) GMTString {
NSInteger hoursFromGMT = [GMTString intValue];
NSInteger secondsFromGMT = (hoursFromGMT * 60 * 60);
NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:secondsFromGMT];
NSDateFormatter *dateFormatterGMTAware = [[NSDateFormatter alloc] init];
[dateFormatterGMTAware setTimeZone:timeZone];
[dateFormatterGMTAware setDateFormat:@"yyyy-MM-dd'T'HH:mm:ss"];
NSDate *date = [dateFormatterGMTAware dateFromString:dateString];
[dateFormatterGMTAware release];
[self.parsedDates addObject:date];
[self.parsedGMTOffsets addObject:[NSNumber numberWithInt:secondsFromGMT]];
}
设置nsdateformatter以打印有关gmt偏移量的保存日期。
现在,所有日期都可以作为UTC进行操作,而不必考虑GMT。
-(void) printOutDates {
for (int i = 0; i < [self.parsedDates count]; i++) {
NSTimeZone *timeZone = [NSTimeZone timeZoneForSecondsFromGMT:[[parsedGMTOffsets objectAtIndex:i] intValue]];
NSDateFormatter *dateFormatterGMTAware = [[NSDateFormatter alloc] init];
[dateFormatterGMTAware setTimeZone:timeZone];
[dateFormatterGMTAware setDateFormat:@"yyyy-MM-dd HH:mm:ss Z"];
NSLog(@"%@ in Original GMT", [dateFormatterGMTAware stringFromDate:[parsedDates objectAtIndex:i]]);
NSLog(@"%@ in Local GMT\n\n", [parsedDates objectAtIndex:i]);
}
}
2010-03-30 18:50:31.284 Timezonepoc[39830:207]2010-03-30 12:00:00-0200,原始GMT
2010-03-30 18:50:31.285 Timezonepoc[39830:207]2010-03-30 16:00:00+0200(当地时间GMT)
2010-03-30 18:50:31.287 Timezonepoc[39830:207]2010-03-30 12:00:00-0100,原始GMT
2010-03-30 18:50:31.287 Timezonepoc[39830:207]2010-03-30 15:00:00+0200(当地时间GMT)
2010-03-30 18:50:31.289 Timezonepoc[39830:207]2010-03-30 12:00:00+0000,原始GMT
2010-03-30 18:50:31.289 Timezonepoc[39830:207]2010-03-30当地时间14:00:00+0200
2010-03-30 18:50:31.290时区记录[39830:207]2010-03-30 12:00:00+0100,原始GMT
2010-03-30 18:50:31.292时间分区太平洋[39830:207]2010-03-30 13:00:00+0200当地时间GMT
2010-03-30 18:50:31.292 Timezonepoc[39830:207]2010-03-30 12:00:00+0200,原始GMT
2010-03-30 18:50:31.294 Timezonepoc[39830:207]2010-03-30 12:00:00+0200(当地时间GMT)