Совершенно нелогичные значения Date() в Swift

Когда я пытаюсь добавить временной интервал к заданной дате в конце некоторых месяцев, я получаю нелогичные результаты.

В следующем примере, когда я добавляю 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 календаре.

Отличается ли поведение в разные годы?

Scott Hunter 05.07.2024 20:37

Ассалам алейкум! Я не использовал календарь .islamic в iOS, но думаю, может быть, FORMATTER тоже нужно как-то правильно настроить?

Fattie 05.07.2024 20:39

Пробовали ли вы другие форматы этой команды, например .date(byAdding: .day, value: ..etc Это может привести к некоторым выводам.

Fattie 05.07.2024 20:42

Точно, используйте тот же экземпляр календаря для добавления. calendar.date(byAdding: .hour, value: 5, to: givenDate)!

Joakim Danielson 05.07.2024 20:48

@ScottHunter поведение одинаковое в течение нескольких месяцев и нескольких лет. Я получаю эти результаты случайным образом

Mohammed 05.07.2024 20:56

@Fattie, форматтер является глобальным и постоянным. Нет смысла менять его на каждую дату.

Mohammed 05.07.2024 20:58

@JoakimDanielson Я попробую Calendar.date(byAdding...)

Mohammed 05.07.2024 20:59

«Случайный» не обязательно означает «невидимую закономерность». В каких месяцах/годах, по вашему мнению, это происходит?

Scott Hunter 05.07.2024 21:02

@JoakimDanielson, следующий код не сработал. все еще получая те же неожиданные результаты. Calendar.date(byAdding: .hour, значение: 5, до: заданная дата)

Mohammed 05.07.2024 21:04

@ScottHunter такое поведение происходит 29.07.1445 и 29.12.1445.

Mohammed 05.07.2024 21:10

Отличается ли поведение в разные годы?

Scott Hunter 05.07.2024 21:33

Это похоже на летнее время. Какой у вас часовой пояс?

Rob Napier 05.07.2024 22:23

@Мохаммед, ура, я имел в виду, что тебе, возможно, придется что-то установить (один раз) в formatter, но я думаю, что это просто летнее время, как упоминает РобНапье

Fattie 05.07.2024 22:41

@ScottHunter Такое поведение проявляется и в другие годы, например, 29.04.1444.

Mohammed 06.07.2024 06:59

@RobNapier мой часовой пояс «Азия/Кувейт». нет летнего времени

Mohammed 06.07.2024 07:00

@Fattie В регионе, который я тестирую (Азия/Кувейт), нет летнего времени.

Mohammed 06.07.2024 07:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
16
79
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Использование Calendar(identifier: .islamicCivil) решает проблему.

Другие вопросы по теме