【问题标题】:Time-related calculations与时间相关的计算
【发布时间】:2018-02-26 02:08:40
【问题描述】:

我正在使用 Swift 4 编写一个应用程序。此应用程序首先获取当前设备时间并将其放入标签 (currentTimeLabel) 中,格式为 HH:mm

它还从 Firebase 数据库中获取不同时区的时间作为字符串,并将其放入两个标签(currentSharedTimeLabeltimeReceivedFromServerLabel)中,格式也是 HH:mm。从服务器检索的数据还包括秒数。显然,这第二次并没有改变——但我希望它表现得像用户期望的那样,即我想每秒添加一秒到服务器时间。

为此,我首先使用以下代码将共享时间从字符串更改为格式化时间:

let isoDate = timeReceivedFromServerLabel.text
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm:ss"
let mathDate = dateFormatter.date(from: isoDate!)

然后我想运行一个函数,它每秒向mathDate 添加一秒并将结果放入currentSharedTimeLabel。你能告诉我如何实现这一目标吗?

目前,完全没有效果,我正在做:

for i in 0..<1314000 {
    let j = i + 1
    print(i, j)

    let newCalcTime = mathDate?.addingTimeInterval(TimeInterval(j))
    currentSharedTimeLabel.text = ("\(newCalcTime)")
    print("\(String(describing: newCalcTime))")

我对此有点不知所措,如果能提供任何帮助,我将不胜感激。

(我希望我已经把我的问题说清楚了,不要因为缺乏或肤浅的信息而让你不高兴)。

编辑 2: 数据库观察者代码(更新 Cocoapods 后)

// SUBMIT BUTTON
    let submitAction = UIAlertAction(title: "Submit", style: .default, handler: { (action) -> Void in
        let textField = alert.textFields![0]
        self.enterSharingcodeTextfield.text = textField.text

        // SEARCHES FOR SHARING CODE IN DATABASE (ONLINE)
        let parentRef = Database.database().reference().child("userInfoWritten")

        parentRef.queryOrdered(byChild: "sharingcode").queryEqual(toValue: textField.text).observeSingleEvent(of: .value, with: { snapshot in

            print(snapshot)

            // PROCESSES VALUES RECEIVED FROM SERVER
            if ( snapshot.value is NSNull ) {

                // DATA WAS NOT FOUND
                // SHOW MESSAGE LABEL
                self.invalidSharingcodeLabel.alpha = 1

            } else {

                // DATA WAS FOUND
                for user_child in (snapshot.children) {

【问题讨论】:

  • 为什么要用HH:mm:ss 格式化它?你不是说是HH:mm的格式吗?是否要显示秒数?如果你不这样做,那么每分钟增加一分钟就可以了,对吧?
  • @Sweeper 它来自服务器,格式为“07:30:22”的字符串,因此以秒为单位。我这样做是为了能够正确执行“每秒添加 1 秒”的计算。在向用户显示最终计算时间的标签中,最好只显示 HH:mm。

标签: swift nsdateformatter swift4 dateformatter


【解决方案1】:

我认为这听起来像是 Timer 的一个很好的用例。

假设您将当前时间转换为以秒为单位的存储在currentTimeInSeconds 变量中。

您可以在每次视图控制器出现时更新它的值,然后使用计时器在本地更新它的值,直到用户离开视图控制器,这会给用户留下它像“实际”时钟一样工作的印象.

因此,您在班级范围内的顶部定义了计时器:

var timer = Timer()

您可以像这样在viewDidAppear 中初始化计时器:

timer = Timer.scheduledTimer(timeInterval: 1.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)

它会每秒调用你的 updateTimer() 方法:

func updateTimer() {
    currentTimeInSeconds += 1
}

您唯一需要做的就是将currentTimeInSeconds 转换为hh:mm:ss 中的时间,然后您就可以开始了!

或者,您也可以使用DateaddTimeInterval() 方法在updateTimer() 方法中将Date 直接增加一秒,具体取决于您何时(如果)要转换NSNumber 您是否从 Firebase 数据库获取到 Date

当用户离开视图控制器 (viewDidDisappear) 时,别忘了让计时器失效:

timer.invalidate()

【讨论】:

  • 恐怕我正在监督一些事情。我启动了计时器,但在updateTimer() function 中,它告诉我“二进制运算符'+=' 不能应用于'Date?' 类型的操作数?和'Int'”.
  • 这是因为您无法在日期中添加 int(又名 1)。如果你想直接增加 1 秒到你的日期,那么你需要这样做:mathDate?.addTimeInterval(1.0) 就可以了 :)
  • 否则,如果您从 Firebase 获取当前时间作为 NSNumber,那么您将改为使用 yourTimeInSeconds.intValue += 1 也可以。
  • 谢谢!但是,现在在控制台中只有2000-01-01 19:27:29 +0000 一遍又一遍地出现(每秒一个新行)。第二个只添加了一次,从firebase数据库收到的时间是19:27:28。 :(
  • 我明白了!你能告诉我你添加数据库观察者的代码吗?
猜你喜欢
  • 2015-01-22
  • 1970-01-01
  • 2021-05-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-05-29
  • 2019-04-17
  • 1970-01-01
相关资源
最近更新 更多