【发布时间】:2014-08-30 06:54:27
【问题描述】:
我正在从 [NSdate date] 创建一个日期并将其保存到 plist,这是我创建日期的方式
- (void)applicationWillResignActive:(UIApplication *)application
{
NSCalendar *gregorian = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
// [gregorian setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];
NSDateComponents *weekdayComponents = [gregorian components:(NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSMinuteCalendarUnit)fromDate:[NSDate date]];
NSInteger day = [weekdayComponents day];
NSInteger month = [weekdayComponents month];
NSInteger year = [weekdayComponents year];
NSDateComponents *timeZoneComps=[[NSDateComponents alloc] init];
[timeZoneComps setDay:day];
[timeZoneComps setMonth:month];
[timeZoneComps setYear:year];
[timeZoneComps setHour:00];
[timeZoneComps setMinute:00];
[timeZoneComps setSecond:01];
NSDate *date = [gregorian dateFromComponents:timeZoneComps];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *filePath = [[paths objectAtIndex:0] stringByAppendingPathComponent:@"file.plist"];
NSMutableDictionary *d = [NSMutableDictionary new];
[d setObject:date forKey:@"my-date"];
[d writeToFile:filePath atomically:YES];
}
我测试了几个案例
案例 1:没有将时区设置为上面的 NSCalendar 对象 gregorian(默认情况下它将采用本地时区)并将设备中的时区设置为印度,我将日期保存到 plist,这就是我得到的
强>NSLog of date 显示 CurrentDate:2014-07-08 18:30:01 +0000
案例 2:现在将设备时区设置为美国圣何塞
NSLog 日期显示 2014-07-09 07:00:01 +0000
案例3:将NSCalendar对象的时区,上面的gregorian设置为“UTC”,并将设备中的时区设置为印度,这就是我在plist中得到的
NSLog 日期显示 2014-07-09 00:00:01 +0000
案例 4:将设备时间设置为美国圣何塞
NSLog 日期显示 2014-07-09 00:00:01 +0000
谁能解释一下在所有这些情况下发生了什么。
问候 兰吉特。
【问题讨论】:
-
+1 个结构良好的问题。当您使用
NSLog(@"date=%@", date);记录日期对象时,您是否在控制台中获得相同的日期/时间? -
谢谢,在什么情况下?\
-
那么上面的
NSLog()调用将使用[NSDate description]打印日期,即UTC 日期。因此,您已经证明了使用特定时区设置日期并将其保存为 UTC 的效果,这就是 plist 中日期更改的原因。 -
@trojanfoe,当时区是 UTC 并且设备时区是 san jose 时,为什么在 plist 中是上午 5:30:01,我可以理解印度地区,因为偏移量是 UTC+5 :30.
-
呃,老实说我不明白。您的代码可能有错误(印度和加利福尼亚的时间相同,所以这里有问题)。
标签: ios nsdate plist nsdatecomponents nstimezone