Вот что я думаю об ошибке, о которой я сообщил Apple в июне прошлого года (ошибка № 41023217), но не получил ответа.Любые идеи приветствуются.
Резюме:
Сканирование назад и вперед для дат, соответствующих месяцу, дает странные результаты.Прямое сканирование, похоже, неправильно обрабатывает переход на летнее время.Сканирование в обратном направлении приводит к результатам, которые иногда кажутся просто неправильными.
Шаги для воспроизведения:
Запустите swift REPL в терминале и запустите этот код:
import Foundation
var now = Date()
var cal = Calendar.current
var comp = DateComponents()
print("Scanning forward")
for monthNo in 1...12 {
comp.setValue(monthNo, for: .month)
let nextDate = cal.nextDate(after: now, matching: comp, matchingPolicy: .strict, repeatedTimePolicy: .first, direction: .forward)
print("Month: ", monthNo, ", next date: ", nextDate)
}
print("Scanning backward")
for monthNo in 1...12 {
comp.setValue(monthNo, for: .month)
let nextDate = cal.nextDate(after: now, matching: comp, matchingPolicy: .strict, repeatedTimePolicy: .first, direction: .backward)
print("Month: ", monthNo, ", next date: ", nextDate)
}
Ожидаемые результаты:
Следующая дата с соответствующим значением месяца для прямого поиска.Самая последняя дата с соответствующим значением месяца для обратного поиска (или, по крайней мере, начало самого последнего диапазона с соответствующим значением месяца).
Фактические результаты:
Scanning forward
Month: 1 , next date: Optional(2020-01-01 00:00:00 +0000)
Month: 2 , next date: Optional(2020-02-01 00:00:00 +0000)
Month: 3 , next date: Optional(2019-03-01 00:00:00 +0000)
Month: 4 , next date: Optional(2019-03-31 23:00:00 +0000)
Month: 5 , next date: Optional(2019-04-30 23:00:00 +0000)
Month: 6 , next date: Optional(2019-05-31 23:00:00 +0000)
Month: 7 , next date: Optional(2019-06-30 23:00:00 +0000)
Month: 8 , next date: Optional(2019-07-31 23:00:00 +0000)
Month: 9 , next date: Optional(2019-08-31 23:00:00 +0000)
Month: 10 , next date: Optional(2019-09-30 23:00:00 +0000)
Month: 11 , next date: Optional(2019-11-01 00:00:00 +0000)
Month: 12 , next date: Optional(2019-12-01 00:00:00 +0000)
Scanning backward
Month: 1 , next date: Optional(2019-01-05 00:00:00 +0000)
Month: 2 , next date: Optional(2018-02-01 01:00:00 +0000)
Month: 3 , next date: Optional(2018-03-02 23:00:00 +0000)
Month: 4 , next date: Optional(2018-03-31 23:00:00 +0000)
Month: 5 , next date: Optional(2018-05-02 23:00:00 +0000)
Month: 6 , next date: Optional(2018-05-31 23:00:00 +0000)
Month: 7 , next date: Optional(2018-07-01 23:00:00 +0000)
Month: 8 , next date: Optional(2018-08-31 22:00:00 +0000)
Month: 9 , next date: Optional(1970-08-31 23:00:00 +0000)
Month: 10 , next date: Optional(2018-10-03 00:00:00 +0000)
Month: 11 , next date: Optional(2018-11-01 00:00:00 +0000)
Month: 12 , next date: Optional(2018-12-31 23:59:59 +0000)