Путаница с NSDate

Я пытаюсь таким образом создать объект NSDate.

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

    m_currentDate         = [gregorian dateFromComponents:timeZoneComps];

Когда я регистрирую currentDate, я получаю это

"2014-07-07 06:00:01 +0000"

Если я сохраню это в plist, я получу это

07-Jul-2014 11:30:01 am

Если я использую «UTC» в качестве часового пояса

я понимаю как

"2014-07-07 00:00:01 +0000"

и внутри plist он отображается как

07-Jul-2014 5:30:01 am

Я не понимаю, что происходит, может ли кто-нибудь помочь мне с этим

Я хочу знать, если я не установлю часовой пояс, какой часовой пояс будет использоваться?

Нам нужно явно установить UTC как timeZone или нам нужно использовать systemTimeZone.


person Ranjit    schedule 07.07.2014    source источник
comment
Часовой пояс, который вы хотите, зависит от того, какой часовой пояс вы хотите. Что означает дата/время?   -  person trojanfoe    schedule 07.07.2014
comment
Извините, я не понял вашего вопроса, какая информация вам нужна?   -  person Ranjit    schedule 07.07.2014
comment
Что значит сохранить в plist? Как вы его сохраняете?   -  person Fogmeister    schedule 07.07.2014
comment
Я храню NSdates в массиве и сохраняю этот массив в plist   -  person Ranjit    schedule 07.07.2014
comment
Я имею в виду, что используемый часовой пояс будет зависеть от того, что вы хотите, чтобы дата/время представляли. Если вам нужна дата/время, которые можно использовать глобально, независимо от собственного часового пояса пользователя, вам нужно UTC. Если вас интересует только местный часовой пояс, используйте его.   -  person trojanfoe    schedule 07.07.2014
comment
Я создаю календарь в своем приложении, и пользователь выбирает любую дату, которую я раскрашиваю. Я использую UTC и создал свой календарь.   -  person Ranjit    schedule 07.07.2014
comment
Поэтому я просто хочу убедиться, что если я в Индии, и я выбрал 7 июля 2014 года и раскрасил его в календаре, то, если я отправлюсь в другой часовой пояс, я хочу, чтобы 7 июля 2014 года оставался цветным, это мое требование   -  person Ranjit    schedule 07.07.2014


Ответы (1)


Что вам нужно понять о NSDate, так это то, что нет таких вещей, как день, неделя, месяц, год, часовой пояс и т. д.

NSDate — это просто момент времени. У него нет информации о том, какой часовой пояс и т. Д.

На самом деле это просто число. Вы можете думать об этом как об использовании UTC, если это поможет.

Классы, которые дают вам такие вещи, как часовой пояс, это NSCalendar, NSDateFormatter и т.д...

Я предполагаю, что вы находитесь в часовом поясе UTC+6? Вот почему, когда вы создаете дату с 00:00:01 и выходите из нее, она отображается как 06:00:01.

Это не имеет ничего общего с NSDate. То, что вы видите в консоли, — это строка. Это представление объекта даты с использованием часового пояса по умолчанию (вашего собственного).

Мне нужно увидеть ваш код для сохранения в plist, но я подозреваю, что это та же проблема. Вы что-то сохраняете и предполагаете, что он использует определенный часовой пояс, хотя на самом деле это не так.

person Fogmeister    schedule 07.07.2014
comment
Вы также должны упомянуть классическую разницу между регистрацией объекта NSDate с использованием [NSDate description], а не NSDateFormatter. - person trojanfoe; 07.07.2014
comment
Здесь я создал дату со временем 00:00:01, она показывает мне 6:00:01, но если я создаю дату с часовым поясом UTC, то почему она показывает 00:00:01, потому что время UTC будет 5 :30 часов отстает от моего часового пояса - person Ranjit; 07.07.2014
comment
Привет, когда мы получаем дату из строки, связано ли с ней какое-либо время - person Ranjit; 08.07.2014