将带有AM/PM的字符串转换为UserNotificationCenter显示值



我试图将时间值作为字符串,然后让一个通知使用该值作为它的触发器来显示。我的问题是通知采用这种格式来设置时间:

var dateComponents = DateComponents()
dateComponents.hour = 06
dateComponents.minute = 30
let trigger = UNCalendarNotificationTrigger(dateMatching: dateComponents, repeats: false)

我目前正在实现这篇Stack Overflow文章中的以下内容,以从字符串中分离出int值。

let time = "7:30" //Would like to pass in "7:30 PM" instead
let components = time.characters.split { $0 == ":" } .map { (x) -> 
Int in return Int(String(x))! }
let hours = components[0]
let minutes = components[1]

两者都不允许任何AM/PM信息。有没有一种简单的方法可以记录一天中的时间并根据输入设置通知?谢谢

如果你想使用字符串,那么你可以在"上进行额外的拆分,检查你是否有AM或PM,并在此基础上调整小时部分

let time = "7:30 PM" 
let firstSplit = time.split(separator: " ")
let components = firstSplit[0].split(separator: ":").compactMap { Int($0) }
let isPM = firstSplit[1] == "PM"
let hours = components[0] + (isPM ? 12 : 0)
let minutes = components[1]

当然,可能需要进行一些安全检查来验证输入字符串是否正确。

另一方面,如果你想使用Date和DateComponents,可以有一个更干净的解决方案,比如这个

let formatter = DateFormatter()
formatter.timeStyle = .short
formatter.locale = Locale(identifier: "en_US_POSIX")
if let parsedTime = formatter.date(from: time) {
let dateComponents = Calendar.current.dateComponents([.hour, .minute], from: parsedTime)
}

最新更新