在Swift中添加和减去时间

5

我在伪代码中写了一些内容,因为我不知道它的语法。我想要让timeLeftLabel.text反映出剩下多少小时、分钟和秒钟,直到6个小时结束。我最大的问题是我不知道如何添加和减去时间。有人能帮我吗?

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)

}
2个回答

5
假设你的部署目标是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()
        }
    }

}

你的代码中 @objc 关键字的目的是什么?有特定的目标还是其他什么? - Victor Sigler
在这种情况下并不需要,但这是习惯性的。 - rob mayoff
@rob 对我来说还不太行。当我按下按钮时,我的文本显示“5h 59m 58s”,而不是倒计时。有什么建议吗? - adman
我已经修复了我的答案。在 labelUpdateTimerDidFire(_:) 中将 OrderedDescending 更改为 OrderedAscending。此外,在 startTimerButtonWasTapped 的末尾添加对 labelUpdateTimerDidFire(_:) 的调用,以便在计时器启动时立即更新标签。 - rob mayoff
Rob Mayoff,你赢得了互联网。 - adman

3
这将增加6小时:
let future = now.dateByAddingTimeInterval(3600*6) // 1 hour is 3600 seconds

这将找出差异:
let difference = future.timeIntervalSinceDate(now)

永远不要执行第一行。并非所有小时都有3600秒。然而,第二行是正确的,可以用来计算两个日期之间的秒数。 - rmaddy
@rmaddy 真是太神奇了,我从来没有听说过不是3600秒的小时。你能提供更多关于这些的信息吗? - Andriy Gordiychuk
@rmaddy 如果他想要一个非常准确的答案,我会更新为NSDateComponents。 - Aidan Gomez
@AndriyGordiychuk 闰秒偶尔会发生,每年在夏令时转换期间可能会重复或跳过数小时。 - rmaddy
@rmaddy:闰秒在Unix时间中不被计算,因此据我所知,一小时实际上始终有3600秒。但当然您是正确的,一天并不总是有24小时。 - Martin R

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接