#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. Я попробую и свяжусь с вами.