2015-11-03 195 views
3

我用伪代码编写了一些这样的代码,因为我不知道它的语法。我想让timeLeftLabel.text反映在6个小时后,剩下多少小时,几分钟和几秒钟。我最大的问题是我不知道如何加减时间。谁能帮我?在Swift中添加和减去时间

var timer = NSTimer() 

func timerResults() { 
    let theDate = NSDate() 
    var endTime = theDate //+ 6 hours 
    let timeLeft = endTime //- theDate 
    timeLeftLabel.text = "\(timeLeft)" 
} 

@IBOutlet weak var timeLeftLabel: UILabel! 
@IBAction func IBbtnUpdateTap(sender: UIButton){ 

timer = NSTimer.scheduledTimerWithTimeInterval(1.0, target: self, selector: Selector("timerResults"), userInfo: nil, repeats: true) 

} 

回答

4

假设你的部署目标是iOS的8.0或更高版本,您应该使用NSDateComponentsFormatter来格式化串。你想要这样的事情:

class MyViewController : UIViewController { 

    @IBOutlet weak var timeLeftLabel: UILabel! 

    var targetDate: NSDate? 
    var labelUpdateTimer: NSTimer? 
    var timeLeftFormatter: NSDateComponentsFormatter? 

    @IBAction func startTimerButtonWasTapped() { 
     targetDate = NSDate(timeIntervalSinceNow: 6 * 60 * 60) 
     labelUpdateTimer = NSTimer.scheduledTimerWithTimeInterval(1, 
      target: self, selector: "labelUpdateTimerDidFire:", userInfo: nil, repeats: true) 
     timeLeftFormatter = NSDateComponentsFormatter() 
     timeLeftFormatter?.unitsStyle = .Abbreviated // gives e.g. "1h 20m 34s" 
      // You might prefer .Positional, which gives e.g. "1:20:34" 
     timeLeftFormatter?.allowedUnits = [ .Hour, .Minute, .Second ] 

     labelUpdateTimerDidFire(labelUpdateTimer!) 
    } 

    @objc func labelUpdateTimerDidFire(timer: NSTimer) { 
     let now = NSDate() 
     timeLeftLabel.text = timeLeftFormatter!.stringFromDate(now, 
      toDate: targetDate!) 
     if now.compare(targetDate!) != NSComparisonResult.OrderedAscending { 
      print("times up!") 
      labelUpdateTimer?.invalidate() 
     } 
    } 

} 
+0

你的'@ objc'关键字代码的目的是什么?有一些具体的目标还是其他的东西? –

+0

在这种情况下它不是必需的,但它是习惯性的。 –

+0

@rob这不适合我。当我按下我的按钮时,我的文本显示“5小时59分58秒”,并保持这种状态,而不是倒计时。有什么建议么? – adman

0

这将加6时间:

let future = now.dateByAddingTimeInterval(3600*6) // 1 hour is 3600 seconds 

这将找到的差异:

let difference = future.timeIntervalSinceDate(now) 
+0

永远不要做第一行。并非所有的小时都有3600秒。但是,第二行对于查找两个日期之间的秒数是正确的。 – rmaddy

+0

@rmaddy哇,我从来没有听说过没有3600秒的小时。你能提供一些关于这些的更多信息吗? –

+0

@rmaddy我会更新NSDateComponents,如果他想要一个非常正确的答案。 –