Правильное использование Apple Foundation Calendar - PullRequest
0 голосов
/ 09 февраля 2019

Меня немного смущает правильное использование платформы Calendar of Apple Foundations.

let calendar = Calendar(identifier: .iso8601)
let dayComponent = DateComponents(year: 2019, weekday: 1, weekOfYear: 6)
let date = calendar.date(from: dayComponent)

Мне нужно получить первый день данной недели в году.При использовании вышеприведенного кода в зависимости от дня недели указываются следующие даты:

//weekday:
//0 -> 08 FEB
//1 -> 09 FEB
//2 -> 03 FEB
//3 -> 04 FEB
//4 -> 05 FEB

Почему день недели начинается с 0 на текущей неделе (6) при переключении на неделю 5 при увеличении?

Спасибо за любую помощь.

1 Ответ

0 голосов
/ 09 февраля 2019

Пара наблюдений:

  1. Когда вы выполняете итерацию по рабочим дням, вы хотите перейти от 1 до 7, потому что «числа дня, недели, дня недели, месяца и года обычноНа основе 1 ... » Руководство по программированию даты и времени: компоненты даты и единицы календаря .Вы можете использовать range(of:in:for:), maximumRange(of:) и т. Д., Чтобы найти диапазон возможных значений.

  2. Значения дней недели изС 1 по 7 не означают «первый день недели», «второй день недели» и т. Д. Они относятся к определенным дням недели, например, для .iso8601, «Солнце» равно 1, «Пн» равно 2и т. д.

  3. Убедитесь, что при использовании weekOfYear вы используете yearForWeekOfYear:

    let calendar = Calendar(identifier: .iso8601)
    let firstOfWeek = DateComponents(calendar: calendar, weekOfYear: 6, yearForWeekOfYear: 2019).date!
    
  4. Ваш код выполняет итерациюбудни.Рассмотрим код, который перечисляет все дни недели для шестой недели 2019 года (т.е. недели, начинающейся с понедельника 4 февраля и заканчивающейся воскресением 10 февраля):

    let weekdays = calendar.range(of: .weekday, in: .weekOfYear, for: firstOfWeek)!
    let daysOfTheWeek = Dictionary(uniqueKeysWithValues: zip(weekdays, calendar.weekdaySymbols))
    
    for weekday in weekdays {
        let date = DateComponents(calendar: calendar, weekday: weekday, weekOfYear: 6, yearForWeekOfYear: 2019).date!
        print("The", daysOfTheWeek[weekday]!, "in the 6th week of 2019 is", formatter.string(from: date))
    }
    

    В результате:

    Солнце на 6-й неделе 2019 года - воскресенье, 10 февраля 2019 годаПонедельник на 6-й неделе 2019 года - понедельник, 4 февраля 2019 года.Вторник, 6 февраля 2019 года, вторник, 5 февраля 2019 года.Средой на 6-й неделе 2019 года является среда, 6 февраля 2019 года.Четверг, 6-я неделя 2019 г., четверг, 7 февраля 2019 г.Пятница на 6-й неделе 2019 года - пятница, 8 февраля 2019 года.Суббота на 6-й неделе 2019 года - суббота, 9 февраля 2019 года.

    Это именно то, что делает ваш код, и почему вы не видите того, что ожидали.

  5. Если вы хотите выполнить итерацию по семи дням неделипо порядку, просто получите начало недели, а затем сместите ее оттуда:

    let calendar = Calendar(identifier: .iso8601)
    let startOfWeek = DateComponents(calendar: calendar, weekOfYear: 6, yearForWeekOfYear: 2019).date!
    
    for offset in 0 ..< 7 {
        let date = calendar.date(byAdding: .day, value: offset, to: startOfWeek)!
        print(offset, "->", formatter.string(from: date))
    }
    

    В результате:

    0 -> понедельник, 4 февраля 2019 г.1 -> вторник, 5 февраля 2019 г.2 -> среда, 6 февраля 2019 г.3 -> четверг, 7 февраля 2019 г.4 -> пятница, 8 февраля 2019 г.5 -> суббота, 9 февраля 2019 г.6 -> воскресенье, 10 февраля 2019 г.

  6. Вы спросили:

    Мне нужно получить первый день данной недели года.

    Вероятно, нет необходимости говорить об этом, но просто опустите день недели:

    let startOfWeek = DateComponents(calendar: calendar, weekOfYear: 6, yearForWeekOfYear: 2019).date!
    

Также см. Руководство по программированию даты и времени: недельные календари .

...