Проблема с датой конца месяца в DAYLIGHT SAVING TIME - PullRequest
0 голосов
/ 05 апреля 2019

Дата конца месяца дает другую дату для часового пояса Оттавы (Канада).

Я пытаюсь получить дату конца месяца в любом часовом поясе.

Примечание: Вы можете помочь мне, изменив настройку часового пояса (Mac или в iphone) Оттава, Канада. & Вставьте код на детской площадке

extension Date {
    public func setTime(day: Int, month: Int,year:Int, timeZoneAbbrev: String = "UTC") -> Date {
        let x: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
        let cal = Calendar.current
        var components = cal.dateComponents(x, from: self)

        components.timeZone = TimeZone(abbreviation: timeZoneAbbrev)
        components.hour = 0
        components.minute = 0
        components.second = 0
        components.day = day
        components.month = month
        components.year = year

        return cal.date(from: components) ?? self
    }
    func getMonthGapDate(month: Int) -> Date {
        return Calendar.current.date(byAdding: .month, value: month, to: self)!
    }

    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }

}
let firstDayDate = Date().setTime(day: 1, month: 4, year: 2019)
let startDate = firstDayDate.getMonthGapDate(month: -1)
let endDate = firstDayDate.endOfMonth()
print(firstDayDate)
print(startDate)//Prints 2019-03-01 01:00:00 +0000(Ottawa - Canada time zone) Day light zone
print(endDate)// (This is issue)Prints 2019-03-31 04:00:00 +0000(Ottawa - Canada time zone) Day light zone//It should 2019 - 04 - 30

1 Ответ

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

Использование сокращений часовых поясов может быть проблематичным, хотя «UTC» довольно безопасен.

Однако я подозреваю, что вам следует использовать TimeZone.autoupdatingCurrent, чтобы обеспечить получение дат с местной полуночью.

extension Date {
    public func setTime(day: Int, month: Int,year:Int) -> Date {
        let x: Set<Calendar.Component> = [.year, .month, .day, .hour, .minute, .second]
        let cal = Calendar.current
        var components = cal.dateComponents(x, from: self)

        components.timeZone = TimeZone.autoupdatingCurrent
        components.hour = 0
        components.minute = 0
        components.second = 0
        components.day = day
        components.month = month
        components.year = year

        return cal.date(from: components) ?? self
    }
    func getMonthGapDate(month: Int) -> Date {
        return Calendar.current.date(byAdding: .month, value: month, to: self)!
    }

    func startOfMonth() -> Date {
        return Calendar.current.date(from: Calendar.current.dateComponents([.year, .month], from: Calendar.current.startOfDay(for: self)))!
    }

    func endOfMonth() -> Date {
        return Calendar.current.date(byAdding: DateComponents(month: 1, day: -1), to: self.startOfMonth())!
    }

}

Это дает мне следующий вывод:

2019-04-01 04:00:00 + 0000

2019-03-01 05:00:00 +0000

2019-04-30 04:00:00 + 0000

Обратите внимание на +0000 - даты указаны в UTC, но представляют местную полночь.

  • В начале марта Оттава не использует летнее время, поэтому это UTC-5
  • В конце марта Оттава составляет летомвремя, так что это UTC-4
...