Использование сокращений часовых поясов может быть проблематичным, хотя «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