Когда я пытаюсь добавить временной интервал к заданной дате в конце некоторых месяцев, я получаю нелогичные результаты.
В следующем примере, когда я добавляю 5 часов ко времени 20:00 в заданную дату, результирующая дата будет следующей в 1:00 ночи, что и ожидалось. Но если я добавлю 6 часов вместо 5, результатом будет дата, следующая за следующей, в 2:00 ночи, что совершенно не имеет смысла.
import SwiftUI
let calendar = Calendar(identifier: .islamic)
let formatter = DateFormatter()
formatter.calendar = calendar
formatter.dateFormat = "dd/MM/yyyy HH:mma"
let components = DateComponents(calendar: calendar, year: 1445, month: 7, day: 29, hour: 20, minute: 0, second: 0)
let givenDate = calendar.date(from: components)!
let after_5_hours = givenDate.advanced(by: 60 * 60 * 5)
let after_6_hours = givenDate.advanced(by: 60 * 60 * 6)
formatter.string(from: givenDate) // = "29/07/1445 20:00PM"
formatter.string(from: after_5_hours) // = "30/07/1445 01:00AM"
formatter.string(from: after_6_hours) // = "01/08/1445 02:00AM"
Обновлять:
Такое поведение происходит при использовании календаря islamic
. Мне не удалось воспроизвести это в gregorian
календаре.
Ассалам алейкум! Я не использовал календарь .islamic
в iOS, но думаю, может быть, FORMATTER тоже нужно как-то правильно настроить?
Пробовали ли вы другие форматы этой команды, например .date(byAdding: .day, value: ..etc
Это может привести к некоторым выводам.
Точно, используйте тот же экземпляр календаря для добавления. calendar.date(byAdding: .hour, value: 5, to: givenDate)!
@ScottHunter поведение одинаковое в течение нескольких месяцев и нескольких лет. Я получаю эти результаты случайным образом
@Fattie, форматтер является глобальным и постоянным. Нет смысла менять его на каждую дату.
@JoakimDanielson Я попробую Calendar.date(byAdding...)
«Случайный» не обязательно означает «невидимую закономерность». В каких месяцах/годах, по вашему мнению, это происходит?
@JoakimDanielson, следующий код не сработал. все еще получая те же неожиданные результаты. Calendar.date(byAdding: .hour, значение: 5, до: заданная дата)
@ScottHunter такое поведение происходит 29.07.1445 и 29.12.1445.
Отличается ли поведение в разные годы?
Это похоже на летнее время. Какой у вас часовой пояс?
@Мохаммед, ура, я имел в виду, что тебе, возможно, придется что-то установить (один раз) в formatter
, но я думаю, что это просто летнее время, как упоминает РобНапье
@ScottHunter Такое поведение проявляется и в другие годы, например, 29.04.1444.
@RobNapier мой часовой пояс «Азия/Кувейт». нет летнего времени
@Fattie В регионе, который я тестирую (Азия/Кувейт), нет летнего времени.
Использование Calendar(identifier: .islamicCivil)
решает проблему.
Отличается ли поведение в разные годы?