NSDate отличается для разных часовых поясов в iOS

#ios #nsdate #nsdateformatter #nscalendar #nstimezone

#iOS #nsdate #nsdateformatter #nscalendar #nstimezone

Вопрос:

У меня есть приложение-календарь, в котором я выделяю текущую дату,

Я выполнил следующие шаги, в настоящее время время на моем устройстве — 11:59 утра,

Индийский часовой пояс, я меняю его на первый 9.am , затем я меняю часовой пояс на Сан-Хосе ,

Я получаю время 25 июня в 9.34 вечера, теперь в календаре устройства оно показывает 25 июня, но

в моем приложении он по-прежнему показывает 26 июня.

Я получаю текущую дату таким образом

 -(void)initialize
{
    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];

   [m_dateFormatter setTimeZone:[NSTimeZone timeZoneWithAbbreviation:@"UTC"]];

    m_dateFormatter.dateFormat = @"dd/MM/yyyy";

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

}
  

Итак, мне нужна ваша помощь в этом отношении.

Комментарии:

1. Потому что вы явно используете UTC часовой пояс?

2. Я удалил его, теперь для Сан-Хосе он работает нормально, и в моем приложении он показывает 25 июня, но теперь, если я поменяю часовой пояс на Австралию, которая опережает индийский часовой пояс, он должен показать мне 26 июня, но он показывает 25 июня. Почему эта проблема может быть вызвана?

3. Привет, @trojanfoe, не могли бы вы взглянуть на мой комментарий

Ответ №1:

Я думаю, что [NSTimeZone systemTimeZone] это всегда даст вам текущий часовой пояс, обнаруженный (или установленный) устройством. Поскольку часовой пояс кэшируется в вашем приложении, вы также можете позвонить [NSTimeZone resetSystemTimeZone] , чтобы убедиться, что информация актуальна. Итак, в вашем коде:

[NSTimeZone resetSystemTimeZone];
[m_dateFormatter setTimeZone:[NSTimeZone systemTimeZone]];

Комментарии:

1. Привет, @spassas поскольку я создал свой календарь, установив часовой пояс на UTC, я не могу изменить это сейчас, потому что это нарушит несколько вещей, можем ли мы что-то сделать, сохранив часовой пояс как UTC.

2. Ммм, я не уверен, что понимаю. Вы пытаетесь получить текущую дату в текущем часовом поясе, это правильно? Таким образом, вы не можете явно использовать UTC часовой пояс… Если я могу спросить, чего вы боитесь сломать?

3. Я использовал часовой пояс UTC для своих предыдущих версий приложения. Итак, теперь, если я использую системный часовой пояс, я получу другое время. итак, теперь предыдущие даты будут в UTC, а новые даты будут в systemtime zone, поэтому время отличается

4. Я не понимаю, как это может вызвать проблемы. Просто извлеките текущий часовой пояс, укажите день / месяц в часовом поясе и выделите соответствующую ячейку в своем приложении. Почему это может нарушить какие-либо предыдущие версии?

5. Я попробую и свяжусь с вами.