Справочная информация: Изменение времени 2020 в США
WWD C Видео: Решения общих проблем с датой и временем
func dateLog(_ date: Date?, hint: String) {
guard let date = date else { return }
let formatter = DateFormatter()
formatter.dateFormat = "yyyy/MM/dd HH:mm:ss"
formatter.timeZone = TimeZone(abbreviation: "EST")!
print(hint)
print("Formatted: " + formatter.string(from: date))
}
var calendar = Calendar.init(identifier: .gregorian)
calendar.timeZone = TimeZone(abbreviation: "EST")!
// 2020 US DST Time
var dstComp = DateComponents()
dstComp.year = 2020
dstComp.month = 3
dstComp.day = 8
dstComp.hour = 1
dstComp.minute = 28
dstComp.second = 0
dstComp.nanosecond = 0
let dstDate = calendar.date(from: dstComp)
dateLog(dstDate, hint: "2020 US DST Time")
// 2020 US DST Time
// Formatted: 2020/03/08 01:28:00
let missingDate1 = calendar.date(bySettingHour: 2,
minute: 30,
second: 0,
of: dstDate!,
matchingPolicy: .nextTime,
repeatedTimePolicy: .first,
direction: .forward)
dateLog(missingDate1, hint: "missingDate1")
Для использования .nextTime
MatchPolicy консоль печатает:
missingDate1
Formatted: 2020/03/08 03:00:00 // It's right!
Для использования .strict
MatchPolicy консоль печатает:
missingDate1
Formatted: 2020/03/09 02:30:00 // It's right!
Для использования .nextTimePreservingSmallerComponents
MatchPolicy, консоль печатает:
missingDate1
Formatted: 2020/03/08 03:00:00 // ? What I expected is 2020/03/08 03:30:00
// or this result actually is right, I misunderstand the usage of this func?
Для использования .previousTimePreservingSmallerComponents
MatchPolicy, консоль печатает:
missingDate1
Formatted: 2020/03/08 03:00:00 // ? What I expected is 2020/03/08 01:30:00
// or this result actually is right, I misunderstand the usage of this func?
, если я использую другую забаву c nextDate(after:matching:matchingPolicy:repeatedTimePolicy:direction:)
var compToBeMatched = DateComponents()
compToBeMatched.hour = 2
compToBeMatched.minute = 30
let missingDate2 = calendar.nextDate(after: dstDate!,
matching: compToBeMatched,
matchingPolicy: .nextTime)
dateLog(missingDate2, hint: "missingDate2")
Для использования .nextTime
MatchPolicy консоль печатает:
missingDate2
Formatted: 2020/03/08 03:00:00 // It's right!
Для использования .strict
MatchPolicy, консоль печатает:
missingDate2
Formatted: 2020/03/09 02:30:00 // It's right!
Для использования .nextTimePreservingSmallerComponents
MatchPolicy консоль печатает:
missingDate2
Formatted: 2020/03/08 03:30:00 // It's right!
Для использования .previousTimePreservingSmallerComponents
MatchPolicy консоль печатает:
missingDate2
Formatted: 2020/03/08 01:30:00 // It's right!
Может кто-нибудь объяснить неожиданный результат при использовании date(bySettingHour:minute:second:of:matchingPolicy:repeatedTimePolicy:direction:)
?
Какая разница между этими двумя функциями?