NSDate保存为plist时的行为

我从[NSdatedate]创builddate并将其保存为plist,以下是我如何创builddate

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

我已经testing了几个例子

情况1:没有设置时区NSCalendar对象上面(默认情况下,将采取本地时区)和设置时区在印度,我保存dateplist,这就是我得到

date的NSLog显示CurrentDate:2014-07-08 18:30:01 +0000

在这里输入图像说明

案例2:现在将设备时区设置为圣何塞美国

date的NSLog显示2014-07-09 07:00:01 +0000

在这里输入图像说明

情况3:设置NSCalendar对象的时区,格式高于“UTC”,设置设备的时区到印度,这是我得到的plist

date的NSLog显示2014-07-09 00:00:01 +0000

在这里输入图像说明

案例4:设置设备时间到圣何塞美国

date的NSLog显示2014-07-09 00:00:01 +0000

在这里输入图像说明

任何人都可以解释我在这些情况下发生了什么事情。

关心Ranjit。

这是因为你处理NSDate的方式。 一旦你把东西转换成NSDate那么你将失去所有的时区信息,当你把它写入plist时,它会被写入当前的时区,因为它被转换回string。 所以让我们一个接一个地看看情景。

所有场景都遵循这个stream程NSDate – > NSDateComponents – > NSDate – > String

1)NSDate:2014-07-09 XX:XX:XX IST – > NSDateComponents 2014-07-09 00:00:01 IST – > NSDate 2014-07-09 00:00:01 IST – > 09-Jul-2014凌晨12:00:01

2)NSDate:2014-07-09 XX:XX:XX PST – > NSDateComponents 2014-07-09 00:00:01 PST – > NSDate 2014-07-09 12:30:01 IST – > 09-Jul-2014 12:30:01 pm

3)NSDate:2014-07-09 XX:XX:XX UTC – > NSDateComponents:2014-07-09 00:00:01 UTC – > NSDate:2014-07-09 05:30:01 IST – > 09-Jul -2014 5:30:01 am

4)与手动指定时区相同

请记住, NSDate 不关心时区 。 这只是一个时间点。 2014-07-09 00:00:01 UTC和2014-07-09 05:30:01 ISTNSDate (2001-01-01 00:00:00格林威治标准时间426556801秒)方面是完全相同的。 他们之所以在plist中有所不同,是因为您正在select(隐式)您的NSDate的本地时间表示。 如果你需要更多的控制,使用NSDateFormatter

编辑来想一想,你可以争辩说,结果应该是不同的,但NSDate输出到plist的方式是专有的,所以它看起来像保持使用印度标准时间的某些原因。 猜测可能包括,也许你没有杀死你的应用程序之间设置时区或东西。

第二次编辑实际上,我对原始的plist所持有的东西感兴趣。 您正在使用编辑器查看它,并且可能会在显示时将其转换为Mac的本地时间。

NSDate代表绝对时间点,与时区无关。 你所看到和logging的是NSDate 描述 ,它在不同的情况下是相当随意的, 用于根据Apple Docs进行debugging

该表示对于仅debugging是有用的。

date格式化string有许多选项,包括:date格式化程序(请参阅NSDateFormatter和数据格式指南)和NSDate方法descriptionWithLocale:,dateWithCalendarFormat:timeZone:和descriptionWithCalendarFormat:timeZone:locale:

因此,您可以将NSDate存储为独立于任何时区的信息,并使用NSCalendarNSDateFormatter为您的应用程序进行所有必要的转换。