Search code examples
iosswiftdatetimenotificationsuilocalnotification

decrement int from string time 4:01 to 3:51 in swift


hi I want to make a local notification from string time, I want the notification launch 10 minute before given time. I have trouble how to make the time from 4:01 into 3:51, please help. this is my code

let a = "4:01"

func startNoftification(prayer: String) {
    let time = prayer.split(separator: ":").map { (x) -> Int in
    return Int(String(x))!
}
   let content = UNMutableNotificationContent()
   content.title = "Adzan"
   content.body = "it's time to sholat dzuhur"

   let gregorian = Calendar(identifier: .gregorian)
   var component = gregorian.dateComponents([.year, .month, .day, .hour, .minute, .second], from: Date())
   component.hour = time[0]
   component.minute = time[1] - 10

   guard let date = gregorian.date(from: component) else { return }
   let triggerDaily = Calendar.current.dateComponents([.hour, .minute, .second], from: date)
   let trigger = UNCalendarNotificationTrigger(dateMatching: triggerDaily, repeats: true)
   let request = UNNotificationRequest(identifier: "Hijrah", content: content, trigger: trigger)

   UNUserNotificationCenter.current().add(request) { (error) in
    if let err = error {
        print("Notif error:", err)
        return
    }
  }
}

Solution

  • Is this what you need?

    let time = "4:01"
    
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "hh:mm"
    
    guard let date = dateFormatter.date(from: time) else {
        return 
    } 
    
    let targetTime = Date(timeInterval: -(10 * 60), since: date) // Change time interval to required value in seconds
    let targetTimeString = dateFormatter.string(from: targetTime)
    print(targetTimeString) // Prints 3:51
    

    Or if your countdown time has a lot of time components, use DateComponents.

    var dateComponents = DateComponents()
    dateComponents.minute = -10
    // Other components
    
    if let targetTime = Calendar.current.date(byAdding: dateComponents, to: date)
        print(dateFormatter.string(from: targetTime))
    }