calendar.date (bySetting: .day, value: 1, of: Date ()) ошибочно всегда добавлять один месяц - PullRequest
1 голос
/ 18 апреля 2019

Я хочу получить две даты, первый и последний день текущего месяца.Довольно простоНо date(bySetting: Calendar.Component, value: Int, of: Date) не работают должным образом.

Посмотрите этот фрагмент кода:

Когда Date() печатает 2019-04-18 14:11:36 UTC

let calendar = Calendar.current

let firstDayDate = calendar.date(bySetting: .day, value: 1, to: Date())! //2019-05-01 03:00:00 UTC  

let firsDayNextMonth = calendar.date(byAdding: .month, value: 1, to: firstDayDate)! //2019-06-01 03:00:00 UTC   
let lastDayMonthDate = calendar.date(bySetting: .day, value: -1, to: firsDayNextMonth)! //2019-05-31 03:00:00 UTC   

Посмотрите на значение firstDayDate, значение дня установлено в 1, нополучить добавленную 1 к значению месяца.

Пожалуйста, скажите мне, если я что-то забыл, но для меня это выглядит как ошибка

Obs: Теперь я могу сделать это, используя DateComponent, но если это ошибка, я хочуотправьте сообщение об ошибке в apple.

Edit1: Я не спрашиваю, как получить первый и последний день текущего месяца.Я знаю, как это сделать, используя другие методы, но, как я объясню, я думаю, что есть ошибка в методе date(byAdding: Calendar.Component, value: Int, to: Date) или если я не использую это должным образом.

1 Ответ

1 голос
/ 18 апреля 2019

Ну, так как я понял, что эта проблема не обязательно настоящая ошибка в методе, но это способ, которым они устанавливают компонент, поиск первый шаг вперед, а не установка , по моему мнению, название метода, описание и документация не отражают реальную особенность метода:

Они используют пример:

Таким образом, для «установлен на четверг»Например, найдите четверг на неделе, в которой находится данная дата (это может быть движение вперед или назад, а не обязательно ближайший четверг).

Но они рекомендуют использовать другой метод дляполучить больше контроля над поведением:

Для большего контроля над точным поведением используйте nextDate (после: Matching: MatchPolicy: поведение: direction:) .

Итак, вот реализация, использующая этот рекомендуемый метод:

let componentDay = DateComponents(day: 1)
let calendar = Calendar.current

let firstDayDate = calendar.nextDate(after: Date(), matching: componentDay, matchingPolicy: .previousTimePreservingSmallerComponents, direction: .backward)!


let firsDayNextMonth = calendar.date(byAdding: .month, value: 1, to: firstDayDate)!
let lastDayMonthDate = calendar.date(byAdding: .day, value: -1, to: firsDayNextMonth)!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...