Получение текущего времени в iOS

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

NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar]; 
NSDateComponents *weekdayComponents3 = [calendar components:(NSDayCalendarUnit | NSYearCalendarUnit | NSMonthCalendarUnit | NSHourCalendarUnit | NSMinuteCalendarUnit |NSSecondCalendarUnit)fromDate:[NSDate date]];

NSInteger hour = [weekdayComponents3 hour];
NSInteger min = [weekdayComponents3 minute];
NSInteger sec = [weekdayComponents3 second];

Теперь я просто хочу добавить 1 час к текущему времени и получить ближайший следующий час, например, если текущее время 18:10, я должен получить 19:00, если текущее время 18:45, то также я должен получить 19:00.

Для этого я написал этот код

 NSDateComponents *timeZoneComps1=[[NSDateComponents alloc] init];
    [timeZoneComps1 setDay:day];
    [timeZoneComps1 setMonth:month];
    [timeZoneComps1 setYear:year];
    [timeZoneComps1 setHour:hour+1];
    [timeZoneComps1 setMinute:00];
    [timeZoneComps1 setSecond:01];

    NSDate *reqiredDate  = [calendar dateFromComponents:timeZoneComps1];

Я правильно понял, используя этот код.

Теперь здесь начинается мое замешательство,

если я установлю часовой пояс на UTC

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

и попробуйте с приведенным выше кодом, я получаю немедленный следующий час, например, если текущее время 18:10, я получаю 19:30, если текущее время 18:45, то я получаю 19:30.

В том же случае, если я попытаюсь перейти в часовой пояс США (путем изменения часового пояса с помощью настроек в устройстве, а не с помощью кода), здесь я получаю правильное значение сразу в следующий час, опять же, например, если текущее время 18:10, я получаю 19:00, если текущее время 18:45, то я получаю 19:00

Поэтому я не понимаю, почему такое разное поведение и, во-вторых, как сделать его последовательным.

Я думаю, что это связано со смещением к UTC, но не уверен.


person Ranjit    schedule 28.05.2014    source источник
comment
Если это связано со смещением UTC, почему бы вам сначала не установить часовой пояс, а затем установить компонент даты для минут и секунд равным 0?   -  person Mischa    schedule 28.05.2014
comment
@Миша, я только этим и занимаюсь   -  person Ranjit    schedule 28.05.2014
comment
Я не могу воспроизвести вашу проблему. Какой у вас часовой пояс?   -  person Jeffery Thomas    schedule 28.05.2014
comment
Почему вы считаете, что результаты неверны? NSLog всегда отображает время как местное время, поэтому, если ваше местное время имеет смещение UTC, отличное от полного часа, вы получите результаты, о которых сообщаете.   -  person David Berry    schedule 28.05.2014
comment
@ Дэвид, я устанавливаю напоминания и хочу установить их сразу на следующий час, но это добавляет к ним дополнительные полчаса.   -  person Ranjit    schedule 28.05.2014
comment
IST смещено на 30 минут, поэтому, если вы примените этот алгоритм к времени UTC, местное время также будет смещено на 30 минут.   -  person David Berry    schedule 28.05.2014


Ответы (2)


Если вы протолкнете 00:10 UTC через свой алгоритм, вы получите 01:00 UTC. Поскольку IST — это UTC+6:30, по местному времени вы видите, что 06:40 становится 07:30.

Точно так же, если вы возьмете 18:10 по местному времени (IST) и конвертируете его в UTC, вы получите 11:40. Запустите это, и вы получите 12:00 UTC. Верните обратно в местное время, и вы получите 18:30.

Вам придется вернуться к требованиям и выяснить, должно ли время будильника определяться относительно UTC (маловероятно) или местного времени (кажется более разумным), а затем удалить настройку часового пояса, если вы хотите, чтобы они были местным временем .

person David Berry    schedule 28.05.2014

Свифт 4

func getCurrentTime(){

    let strDateTime: String = "Current Time: " + String(describing: Date())

    print(strDateTime)
} 
person Deepak Tagadiya    schedule 11.12.2017