DateFormatter возвращает дату за несуществующее (из-за летнего времени) время, но только при настройке календаря - PullRequest
2 голосов
/ 05 апреля 2020

Я анализирую фиксированный формат даты. Здесь я разбираю дату, которая не существует, поэтому я ожидаю получить nil, возвращенную из средства форматирования даты, и вот что я получаю:

let currentCal = DateFormatter()
currentCal.locale = Locale(identifier: "en_US_POSIX")
currentCal.timeZone = TimeZone(identifier: "America/Chicago")!
currentCal.dateFormat = "yyyy-MM-dd HH:mm:ss"

currentCal.date(from: "2010-03-14 02:15:00") // => nil

( В 2010 году, летнее время Время началось в Чике go 14 марта , поэтому часы были перенесены с 1:59:59 до 3:00:00. 2:15 утра не произошло в тот день.)

Однако, если я установлю календарь явно, я получу дату:

let specifiedCal = DateFormatter()
specifiedCal.calendar = Calendar(identifier: .gregorian)
specifiedCal.locale = Locale(identifier: "en_US_POSIX")
specifiedCal.timeZone = TimeZone(identifier: "America/Chicago")!
specifiedCal.dateFormat = "yyyy-MM-dd HH:mm:ss"

specifiedCal.date(from: "2010-03-14 02:15:00") // => a Date

С тех пор я узнал, что языковой стандарт включает в себя информацию о календаре, поэтому мне не нужно его устанавливать. Тем не менее, я не могу найти никаких указаний в документации или заголовочном файле NSDateFormatter, который объясняет, что происходит. Интуитивно кажется, что это не должно иметь никакого значения, так почему изменение в поведении?

...