【问题标题】:Get the local time of chosen timezone - Swift获取所选时区的当地时间 - Swift
【发布时间】:2020-12-18 10:32:12
【问题描述】:

我正在创建一个社交媒体应用。您只能每 24 小时发布一次,我将它与 firebase 一起使用,因此所有发布的数据都会进入 firebase 数据库。

在创建帖子时,我有变量 Date,这是您跟踪自上次帖子以来是否已过 24 小时的方式...

唯一的问题是用户可以更改他们设备上的时钟并发布任意次数的帖子。我需要获取一个日期变量,它是我所在时区 (EST) 的当地时间,所以我知道数据是准确的,但我不知道该怎么做...

这就是我通常会得到当前日期的方式:

let date = Date()
let currentTime = date.timeIntervalSince1970

所以,我只需要让currentTime 成为当前的东部标准时间 (EST)

提前致谢!

【问题讨论】:

  • 您是要允许用户每天发帖一次,还是如果用户已经在晚上 9 点发帖,那么用户只能在第二天晚上 9 点之后再次发帖?

标签: swift date timezone nsdate


【解决方案1】:

从 Firebase 服务器获取当前时间戳,并与上一篇文章的日期进行比较

firebase.database.ServerValue.TIMESTAMP

参考这里firebase.database

用于火库

firebase.firestore.Timestamp.now()

参考这里firebase.firestore

【讨论】:

    【解决方案2】:

    如果要确保已经过了 24 小时,则需要比较 UTC 中的日期,而不是 EST,UTC 是没有任何时区的日期

    这里

    let date = Date()
    let currentTime = date.timeIntervalSince1970
    

    你有 UTC 时间戳

    UPD:发布本身的事实应该在服务器上专门检查,而服务器应该在发布之前获取它的 UTC 时间并检查数据库中最后一次发布的时间。

    【讨论】:

    • 这并不能解决用户手动更改设备时间的问题。
    • @LeoDabus 发布本身的事实应该在服务器上专门检查,而服务器应该使用它的 UTC 时间并检查数据库中最后一次发布的时间,在发布之前,也许作者想要仅对出版可能性进行目视检查...
    【解决方案3】:

    如果您不信任设备时间,您可以使用 NTP 客户端通过互联网连接获取日期。

    有一些用 Swift 编写的实现,例如 TrueTimeKronos。 两者似乎都默认使用time.apple.com

    他们各自的指南(关于 README 文件)似乎非常简单。

    使用TrueTime的示例:

    let client = TrueTimeClient()
    client.start()
    client.fetchIfNeeded { result in
        switch result {
        case let .success(referenceTime):
            // Current date
            let now = referenceTime.now()
            client.pause()
        case let .failure(error):
            print("Error: \(error)")
        }
    }
    

    使用Kronos的示例:

    Clock.sync { date, offset in
        // Current date
        print(date)
    }
    

    【讨论】:

      猜你喜欢
      • 2013-03-24
      • 1970-01-01
      • 2013-04-05
      • 2012-02-27
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-04
      • 1970-01-01
      相关资源
      最近更新 更多