Создание даты с DateComponents - PullRequest
       38

Создание даты с DateComponents

0 голосов
/ 01 марта 2019

Я хочу получить первый день и последний день недели.Но мои результаты не соответствуют документации Apple: https://developer.apple.com/documentation/foundation/nsdatecomponents/1410442-weekday

Это моя функция:

func startAndEndDateOfWeek(weekOfYearWithYear: (week: Int,year: Int)) -> (start: Date, end: Date) {
    var output = (start: Date.init(), end: Date.init())

    let calendar = Calendar(identifier: .gregorian)
    var firstDayComponents = DateComponents()
    firstDayComponents.weekOfYear = weekOfYearWithYear.week
    firstDayComponents.yearForWeekOfYear = weekOfYearWithYear.year
    firstDayComponents.weekday = 1

    let firstDay = calendar.date(from: firstDayComponents)

    var lastDayComponents = DateComponents()
    lastDayComponents.weekOfYear = weekOfYearWithYear.week
    lastDayComponents.yearForWeekOfYear = weekOfYearWithYear.year
    lastDayComponents.weekday = 2

    let lastDay = calendar.date(from: lastDayComponents)
    output = (start: firstDay!, end: lastDay!)
    return output
}

.weekday = 2 -> приводит к воскресенью, а не 0.

enter image description here

Я тоже хочу иметь целый день, а не 16: 00.

1 Ответ

0 голосов
/ 01 марта 2019

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

  1. В григорианском календаре день недели = 1 означает воскресенье;день недели = 2 означает понедельник;и т. д. Вы можете посмотреть на calendar.maximumRange(of: .weekday), чтобы получить диапазон допустимых значений, и вы можете посмотреть на calendar.weekdaySymbols, чтобы увидеть, что означают эти weekDay значения (например, «Солнце», «Пн», «Вт», «Ср.»,« Чт »,« пт »и« сб »).

  2. Вы сказали:

    Я тоже хочу иметь целый день, а не16:00.

    A Date объект ссылается на момент времени.Так что это не может представлять «целый день».Но это может означать полночь (а полночь в вашем часовом поясе, вероятно, 16:00 в GMT / UTC / Zulu).

    Вы также можете вернуть DateInterval, что соответствует диапазону времени.

    func interval(ofWeek week: Int, in year: Int) -> DateInterval {
        let calendar = Calendar.current
    
        let date = DateComponents(calendar: calendar, weekOfYear: week, yearForWeekOfYear: year).date!
        return calendar.dateInterval(of: .weekOfYear, for: date)!
    }
    

    А затем

    let formatter = DateIntervalFormatter()
    formatter.dateStyle = .short
    formatter.timeStyle = .short
    
    let year = Calendar.current.component(.year, from: Date())
    let dateInterval = interval(ofWeek: 2, in: year)
    print(formatter.string(from: dateInterval))
    

    В США для США интервал начинается 6 января:

    1/6/19, 12:00 -13.01.19, 12:00 AM

    В то время как в немецком языке интервал начинается 7-го числа:

    07.01.19, 00:00 - 14.01.19, 00: 00

  3. Если вы хотите, чтобы начало первого дня недели и последний день недели, вы можете сделать:

    func startAndEndDate(ofWeek week: Int, in year: Int) -> (Date, Date) {
        let date = DateComponents(calendar: calendar, weekOfYear: week, yearForWeekOfYear: year).date!
        let lastDate = calendar.date(byAdding: .day, value: 6, to: date)!
    
        return (date, lastDate)
    }
    

    А потом

    let formatter = DateFormatter()
    formatter.dateStyle = .short
    
    let year = Calendar.current.component(.year, from: Date())
    let (start, end) = startAndEndDate(ofWeek: 2, in: year)
    print(formatter.string(from: start), "-", formatter.string(from: end))
    
...