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