Skip to main content
 首页 » 操作系统

swift之在 Swift 中获取日期之间的剩余分钟数

2024年01月01日37zhoujg

我的问题是基于一个时间间隔

我正在获取小时和分钟(现在),我想创建一个自那一刻起 75 分钟的计时器,但我希望计时器继续工作,即使我在多任务处理中关闭应用程序也是如此

所以我在想,如果我将时间保存为 NSUserDefault 值,并且每次我打开应用程序时,它都会读取存储的值并重新计算

这是我的实际代码

    override func viewDidLoad() { 
    super.viewDidLoad() 
 
    var timer = NSTimer.scheduledTimerWithTimeInterval(30, target: self, selector: Selector("update"), userInfo: nil, repeats: true) 
} 
 
func update() { 
    //here I should update the GUI with the remaining minutes and do a NSUserDefault check if the 75 minutes have already 
} 
 
@IBAction func save_time(sender: AnyObject) { 
 
    let date = NSDate() 
    let calendar = NSCalendar.currentCalendar() 
    let components = calendar.components(.CalendarUnitHour | .CalendarUnitMinute, fromDate: date) 
    var hour = components.hour 
    var minutes = components.minute + 75 
    if (minutes>59){ 
        hour += 1 
        minutes -= 60 
    } 
    defs.setInteger(hour, forKey: "u_hora") 
    defs.setInteger(minutes, forKey: "u_minutos") 
 
 
} 

请您参考如下方法:

您可以使用 NSUserDefaults 将它们存储为 TimeInterval,并且您应该创建一个时间间隔扩展以根据需要格式化您的时间字符串:

import UIKit 
 
class ViewController: UIViewController { 
 
    @IBOutlet weak var strTimer: UILabel! 
 
    var tasksManager = NSTimer() 
    var endTime:NSTimeInterval = 0 
    var now: NSTimeInterval { 
        return NSDate().timeIntervalSinceReferenceDate 
    } 
 
    func updateTime(){ 
        strTimer.text = ( endTime - now ).time 
    } 
 
    override func viewDidLoad() { 
        super.viewDidLoad() 
        // NSUserDefaults().removeObjectForKey("endTime") 
        // loads endTime if it exists otherwise assign 0 value 
        endTime = NSUserDefaults().valueForKey("endTime") as? NSTimeInterval ?? 0 
        // restart timer if endTime exists 
        if endTime > 0 { 
            tasksManager = NSTimer.scheduledTimerWithTimeInterval(1/15, target: self, selector: "updateTime", userInfo: nil, repeats:true) 
        } else { 
            strTimer.text = "0:01:00.00" 
        } 
    } 
    override func didReceiveMemoryWarning() { 
        super.didReceiveMemoryWarning() 
    } 
    @IBAction func startTimer (sender: AnyObject) { 
        // sets endTime new timeinterval to a future point in time 
        // so we need to add n seconds from now 
        endTime = now + 60.0    // now + n seconds 
        // saves it using NSUserDefaults 
        NSUserDefaults().setValue(endTime, forKey: "endTime") 
        // if the timer doest exists we create one 
        if !tasksManager.valid { 
            tasksManager = NSTimer.scheduledTimerWithTimeInterval(1/30, target: self, selector: "updateTime", userInfo: nil, repeats:true) 
            // if the timer exists we invalidate it 
        } else { 
            tasksManager.invalidate() 
            endTime = 0 
            strTimer.text = "0:01:00.00" 
            NSUserDefaults().removeObjectForKey("endTime") 
        } 
    } 
 
} 
extension NSTimeInterval { 
    var time: String { 
        return String(format: "%d:%02d:%02d.%02d", Int(self/3600), Int(self/60%60), Int(self%60), Int(self*100%100)) 
    } 
}