Я пытаюсь создать объект Date с днем, месяцем и годом, но функция Calendar возвращает nil.

let calendar = Calendar.current
let date = calendar.dateComponents([.day,.month,.year], from: Date()).date! // <- nil

Как создать объект Date только с днем, месяцем и годом?

6
Augusto 14 Сен 2018 в 22:01

2 ответа

Лучший ответ

Если вы хотите убрать временную часть даты (установить ее на полночь), вы можете использовать Calendar startOfDay:

let date = Calendar.current.startOfDay(for: Date())

Это даст вам полночь по местному времени для текущей даты.

Если вам нужна полночь текущей даты для другого часового пояса, создайте новый экземпляр Calendar и установите его timeZone по мере необходимости.

6
rmaddy 14 Сен 2018 в 19:08

В дополнение к ответу rmaddy, причина почему вашего кода возвращает nil заключается в том, что вы пытаетесь преобразовать DateComponents в Date без указания Calendar .

Если это преобразование выполняется с помощью календарного метода

let calendar = Calendar.current
let components = calendar.dateComponents([.day, .month, .year], from: Date())
let date = calendar.date(from: components)

Или если вы добавите календарь к компонентам даты

let calendar = Calendar.current
let date = calendar.dateComponents([.day, .month, .year, .calendar], from: Date()).date

Тогда вы получите ожидаемый результат.

10
Martin R 14 Сен 2018 в 19:32