NSDates 始终以 UTC 格式存储,实际上日期本身并不了解时区或周、月、年。它们只是一个时间点。
要查看您在地球表面上的位置的正确时间,您需要使用代表您的时间模型的 NSCalendar。您可以直接使用它并弄乱您的日期,或者创建一个 NSDateFormatter 保持日期不变,但根据您的需要调整它们的外观。
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];
NSLog(@"%@", [formatter stringFromDate: date1]);
结果是
Thursday, July 12, 2012, 4:36:07 PM Central European Summer Time
回应评论:
试试这个代码作为测试
NSDate *now = [NSDate date];
NSDate *startOfToday = nil;
NSDate *startOfThisWeek = nil;
NSDate *startOfThisMonth = nil;
NSDate *startOfThisYear = nil;
[[NSCalendar currentCalendar] rangeOfUnit:NSDayCalendarUnit startDate:&startOfToday interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSWeekCalendarUnit startDate:&startOfThisWeek interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSMonthCalendarUnit startDate:&startOfThisMonth interval:NULL forDate:now];
[[NSCalendar currentCalendar] rangeOfUnit:NSYearCalendarUnit startDate:&startOfThisYear interval:NULL forDate:now];
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateStyle:NSDateFormatterFullStyle];
[formatter setTimeStyle:NSDateFormatterFullStyle];
NSLog(@"%@", now);
NSLog(@"%@", [formatter stringFromDate:now]);
NSLog(@"%@", startOfToday);
NSLog(@"%@", [formatter stringFromDate:startOfToday]);
NSLog(@"%@", startOfThisWeek);
NSLog(@"%@", [formatter stringFromDate:startOfThisWeek]);
NSLog(@"%@", startOfThisMonth);
NSLog(@"%@", [formatter stringFromDate:startOfThisMonth]);
NSLog(@"%@", startOfThisYear);
NSLog(@"%@", [formatter stringFromDate:startOfThisYear]);
您会意识到,日、周、月和年的开始将根据您的本地时间进行调整,因为每个 NSLog 对中的第一个将为您提供 UTC 日期和您当地时区的第二个日期。
在您发布此代码的聊天中
NSDateFormatter *dateFormat = [[NSDateFormatter alloc] init];
[dateFormat setDateFormat:@"yyyy-MM-dd HH:mm"];
[dateFormat setTimeZone:[NSTimeZone timeZoneForSecondsFromGMT:0]];
NSDate *date = [dateFormat dateFromString:dateString];
[dateFormat release];
所以问题是,日期字符串实际上不是来自 GMT,而是 EET(东欧时间)
尝试
[dateFormat setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"EET"]];
但到目前为止,最优雅的解决方案是获取带有 UTC 偏移量的日期字符串,类似于2012-07-12 12:23:00 +0300
如果有可能的话。
在这种情况下,您可以使用它来解析它
[dateFormat setDateFormat:@"yyyy-mm-dd HH:mm:ss Z"];
并且不需要进一步的时区处理,因为格式化程序通过Z
-specifier 知道偏移量。
另请注意,如果您未设置任何时区,则应使用设备的当前时区。如果用户始终与日期字符串中的时间处于同一时区,这也应该有效。但是如果用户离开了那个区域,或者你想让它在世界范围内工作,你应该使用我给你的解决方案之一。使用第二个(在日期字符串中指定时区)作为首选。