Я создаю дату из [дата NSdate] и сохраняю ее в 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 григорианского выше (по умолчанию он будет использовать локальный часовой пояс) и установки часового пояса в устройстве для Индии, я сохранил дату в plist, и вот что я получил
NSLog даты показывает CurrentDate:2014-07-08 18:30:01 +0000
Случай 2. Теперь часовой пояс устройства устанавливается на Сан-Хосе, США
NSLog даты показывает 2014-07-09 07:00:01 +0000
Случай 3: установка часового пояса объекта NSCalendar, григорианского выше на «UTC» и установка часового пояса в устройстве в Индию, это то, что я получил в plist
NSLog даты показывает 2014-07-09 00:00:01 +0000
Случай 4. Установка времени на Сан-Хосе, США
NSLog даты показывает 2014-07-09 00:00:01 +0000
Кто-нибудь может объяснить мне, что происходит во всех этих случаях.
С уважением Ранджит.
NSLog(@"date=%@", date);
? - person trojanfoe   schedule 09.07.2014NSLog()
будет использовать[NSDate description]
для печати даты, которая является датой в формате UTC. Таким образом, вы доказали влияние установки дат с определенными часовыми поясами и сохранения их в формате UTC, поэтому даты меняются в plist. - person trojanfoe   schedule 09.07.2014NSCalendar
, будет использоваться при расчете окончательного объектаNSDate
. Первые два являются неявными, а вторые два явными. Однако последней строкой всегда будет индийское стандартное время. - person borrrden   schedule 09.07.2014