Ios I';当我的应用程序每天达到UTC时间9:00时,我会尝试使用pop ViewController

Ios I';当我的应用程序每天达到UTC时间9:00时,我会尝试使用pop ViewController,ios,swift,firebase,server,nsdate,Ios,Swift,Firebase,Server,Nsdate,我尝试在每天UTC时间达到9:00时使用我的应用程序pop ViewController。我不希望它使用当地时间,因为它可以在不同的地区改变,也可以改变。我曾想过使用服务器时间,但我在让解决方案正常工作时遇到了问题。我得到了一个历元时间戳,并将其转换为日期 let ref = FIRDatabase.database().reference() let timestamp = FIRServerValue.timestamp() ref.setValue(timestamp)

我尝试在每天UTC时间达到9:00时使用我的应用程序pop ViewController。我不希望它使用当地时间,因为它可以在不同的地区改变,也可以改变。我曾想过使用服务器时间,但我在让解决方案正常工作时遇到了问题。我得到了一个历元时间戳,并将其转换为日期

let ref = FIRDatabase.database().reference()   
let timestamp = FIRServerValue.timestamp()
  ref.setValue(timestamp)

    ref.observe(.value, with: {
        snap in
        if let t = snap.value as? TimeInterval {
            // Cast the value to an NSTimeInterval
            // and divide by 1000 to get seconds.
            print("this is the time in seconds \(t)")
            let date = Date(timeIntervalSince1970: t)
            print("this is the time \(Date(timeIntervalSince1970: t/1000))")
它打印出时间2016-10-10 18:40:21+0000


现在的问题是如何计算出只有小时分和秒的时间,这样我就可以比较时间日期了

选项之一可能是:

  • 在应用程序启动时从服务器请求当前时间
  • 计算9:00 UTC与当前时间之间的差值
  • 设置一个计时器(
    NSTimer
    ),该计时器在差异过去时触发
  • 最后,以您喜欢的任何方式处理回调:弹出屏幕、显示弹出窗口等

您可以使用以下内容:

let calendar = Calendar.current
let components = NSDateComponents()
components.hour = 9

let nineOClock = calendar.nextDate(after: Date(), matching: components as DateComponents, matchingPolicy: .strict)

let timer = Timer(fireAt: nineOClock!, interval: 0, target: self, selector: #selector(doSomething), userInfo: nil, repeats: true)
RunLoop.main.add(timer, forMode: RunLoopMode.commonModes)

func doSomething(){
    print("Doing something")
}

一种基于当前时间(1970年起的秒数)计算到下一个上午9点的时间(秒)的方法


多亏了阿泰姆和他的帮助,我走上了正确的道路。在花了很多时间研究日期转换之后,我发现了这个问题。最后的目标是将这两个值转换成整数,这样我可以在几秒钟内比较它们,并在计时器中使用它们来计算剩余的时间

  ref.observe(.value, with: {
        snap in
        if let t = snap.value as? TimeInterval {

     let FinalTimeInterval = self.convertStringToDateToIntStartTime() - self.convertEpochTimeStampToDateToStringToDateToIntEndTime(timeInterval: t)

            if FinalTimeInterval < 0 {
                print("less than zero")
            } else {

            let timer = Timer.scheduledTimer(withTimeInterval: TimeInterval(FinalTimeInterval), repeats: false) { _ in
                // TODO: pop view controllers
                print("i'm so happy this is working")
            }
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)

            }

        }
    })


  func convertEpochTimeStampToDateToStringToDateToIntEndTime(timeInterval: TimeInterval) -> Int {
    let date = Date(timeIntervalSince1970: timeInterval/1000)

    var dateFormater = DateFormatter()
    dateFormater.timeZone = TimeZone(identifier: "UTC")
    dateFormater.dateFormat = "HH:mm:ss"
    let dateString = dateFormater.string(from: date)

    let endTime = dateFormater.date(from: dateString)


        dateFormater.dateFormat = "HH"
        let endHours = Int(dateFormater.string(from: endTime!))
        dateFormater.dateFormat = "mm"
        let endMinutes = Int(dateFormater.string(from: endTime!))
        dateFormater.dateFormat = "ss"
        let endSeconds = Int(dateFormater.string(from: endTime!))



    return endSeconds! + endMinutes! * 60 + endHours! * 3600


}
func convertStringToDateToIntStartTime() -> Int {

    var dateFormater = DateFormatter()
    dateFormater.timeZone = TimeZone(identifier: "UTC")
    dateFormater.dateFormat = "HH:mm:ss"

    let startTime = dateFormater.date(from: "09:00:00")
    dateFormater.dateFormat = "HH"

    let startHours = Int(dateFormater.string(from: startTime!))
    dateFormater.dateFormat = "mm"

    let startMinutes = Int(dateFormater.string(from: startTime!))
    dateFormater.dateFormat = "ss"

    let startSeconds = Int(dateFormater.string(from: startTime!))



    return startSeconds! + startMinutes! * 60 + startHours! * 3600

}
ref.observe(.value,带:{
管理单元
如果让t=捕捉值为?时间间隔{
让FinalTimeInterval=self.convertStringToDateToIntStartTime()-self.ConvertepTimeStampToDateToStringToToToDateToToToToToToToToToToToToDateToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToToTo
如果最终时间间隔<0{
打印(“小于零”)
}否则{
设timer=timer.scheduledTimer(withTimeInterval:TimeInterval(finaltimeinteval),repeats:false){in
//TODO:弹出视图控制器
打印(“我很高兴这是工作”)
}
RunLoop.current.add(计时器,forMode:RunLoopMode.commonModes)
}
}
})
func converterepochtimestamptodatetostringtodatepointendtime(timeInterval:timeInterval)->Int{
让日期=日期(时间间隔自1970年起:时间间隔/1000)
var DateFormatter=DateFormatter()
DateFormatter.timeZone=时区(标识符:“UTC”)
DateFormatter.dateFormat=“HH:mm:ss”
让dateString=DateFormatter.string(从:日期)
让endTime=DateFormatter.date(from:dateString)
DateFormatter.dateFormat=“HH”
让endHours=Int(dateformatter.string(from:endTime!))
DateFormatter.dateFormat=“mm”
让endMinutes=Int(dateformatter.string(from:endTime!))
DateFormatter.dateFormat=“ss”
让endSeconds=Int(dateformatter.string(from:endTime!))
返回结束秒数!+结束分钟数!*60+结束小时数!*3600
}
func convertStringToDateToIntStartTime()->Int{
var DateFormatter=DateFormatter()
DateFormatter.timeZone=时区(标识符:“UTC”)
DateFormatter.dateFormat=“HH:mm:ss”
让startTime=DateFormatter.date(从:“09:00:00”)
DateFormatter.dateFormat=“HH”
让startHours=Int(dateformatter.string(from:startTime!))
DateFormatter.dateFormat=“mm”
让startMinutes=Int(dateFormatter.string(from:startTime!))
DateFormatter.dateFormat=“ss”
让startSeconds=Int(dateFormatter.string(from:startTime!))
返回startSeconds!+startMinutes!*60+startHours!*3600
}

您是否需要获得时间方面的帮助,或者需要在9点钟点击函数的函数方面的帮助?在找到内聚解决方案时,两者都需要。我可能有很多方法可以做到这一点,但我想到的一些可能的解决方案非常混乱。现在还不太清楚您在这种情况下是如何使用Firebase的。这段代码只运行一次吗?它应该定期运行。然后,您应该使用NSCalendar类检查hour组件,如果它达到9:00点(或Firebase远程配置值),则根据需要激发它。每次加载视图时,它都会运行。我不太清楚如何检查时分和秒之间的差异,而不看日期、月份或年份。有什么建议吗?据我所知,设备时间不是一个选项。是的,我喜欢这个选项,但不幸的是,如果用户要更改时间,我认为这是行不通的。我错了吗?是的,我认为这是一个好的选择,并尝试了同样的事情。因此,我使用firebase获取当前时间作为历元时间戳,并对其进行转换。我将编辑我的问题以反映我的尝试。我喜欢这个解决方案,但我会遇到一些错误。我在guard语句和Int(timeInterval)中得到一个错误。没有时间间隔,你从哪里得到它?再次感谢你的帮助。所以我不确定这个函数是否能正常工作。当我使用它并打印出秒数时,我总是得到非常随机的结果。我会得到80887,然后10秒后运行应用程序,得到72708。昨晚我试着遍历了这个函数,似乎调用了else语句“return(daySeconds-todaySeconds)+ninemseconds”。所以它应该需要86400秒-时间纪元+9点或以秒为单位的任何时间。这不是一个负数吗?但不管怎样,没有得到我想要的结果。任何建议。谢谢。我也不确定毫秒是否被考虑在内,这就是为什么我一直得到各种各样的结果。我想出了一个解决方案。我想投票支持你的答案,感谢你的帮助,但最终,这对我没有用。对不起,再次谢谢你。在我的回答中,我会提到你所有的帮助。
let ref = FIRDatabase.database().reference()   
let timestamp = FIRServerValue.timestamp()
ref.setValue(timestamp)

ref.observe(.value, with: { snap in
    guard let ts = snap.value as? TimeInterval else {
        return
    }

    let seconds = untilNineAmSeconds(now: Int(ts))

    let timer = Timer.scheduledTimer(withTimeInterval: TimeInterval(seconds), repeats: false) { _ in
        // TODO: pop view controllers
    }

    // ...
}
  ref.observe(.value, with: {
        snap in
        if let t = snap.value as? TimeInterval {

     let FinalTimeInterval = self.convertStringToDateToIntStartTime() - self.convertEpochTimeStampToDateToStringToDateToIntEndTime(timeInterval: t)

            if FinalTimeInterval < 0 {
                print("less than zero")
            } else {

            let timer = Timer.scheduledTimer(withTimeInterval: TimeInterval(FinalTimeInterval), repeats: false) { _ in
                // TODO: pop view controllers
                print("i'm so happy this is working")
            }
RunLoop.current.add(timer, forMode: RunLoopMode.commonModes)

            }

        }
    })


  func convertEpochTimeStampToDateToStringToDateToIntEndTime(timeInterval: TimeInterval) -> Int {
    let date = Date(timeIntervalSince1970: timeInterval/1000)

    var dateFormater = DateFormatter()
    dateFormater.timeZone = TimeZone(identifier: "UTC")
    dateFormater.dateFormat = "HH:mm:ss"
    let dateString = dateFormater.string(from: date)

    let endTime = dateFormater.date(from: dateString)


        dateFormater.dateFormat = "HH"
        let endHours = Int(dateFormater.string(from: endTime!))
        dateFormater.dateFormat = "mm"
        let endMinutes = Int(dateFormater.string(from: endTime!))
        dateFormater.dateFormat = "ss"
        let endSeconds = Int(dateFormater.string(from: endTime!))



    return endSeconds! + endMinutes! * 60 + endHours! * 3600


}
func convertStringToDateToIntStartTime() -> Int {

    var dateFormater = DateFormatter()
    dateFormater.timeZone = TimeZone(identifier: "UTC")
    dateFormater.dateFormat = "HH:mm:ss"

    let startTime = dateFormater.date(from: "09:00:00")
    dateFormater.dateFormat = "HH"

    let startHours = Int(dateFormater.string(from: startTime!))
    dateFormater.dateFormat = "mm"

    let startMinutes = Int(dateFormater.string(from: startTime!))
    dateFormater.dateFormat = "ss"

    let startSeconds = Int(dateFormater.string(from: startTime!))



    return startSeconds! + startMinutes! * 60 + startHours! * 3600

}