Почему fun c date (bySettingHour: минута: секунда: из: matchPolicy: repeatTimePolicy: direction :) не работает должным образом? - PullRequest
0 голосов
/ 19 марта 2020

Справочная информация: Изменение времени 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:)?

Какая разница между этими двумя функциями?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...