毫秒到Swift的午夜(当地时间)?

use*_*145 -5 time ios swift

我正在编写一个iOS应用,我需要使用Swift在用户的本地时间中知道午夜(即第二天的12:00:00.000)之前的(整个)毫秒数。

该应用程序是这样的表达式:

let milliseconds_until_midnight : Int;

DispatchQueue.main.asyncAfter(deadline: .now() + .milliseconds(milliseconds_until_midnight)) {

  //do_something
}
Run Code Online (Sandbox Code Playgroud)

我们应该怎么做?附录:类型必须为Int,因为在此特定情况下不接受UInt64。

Leo*_*bus 6

您可以使用Calendar方法nextDate(after:)来获取第二天的开始时间,可以使用Date方法timeIntervalSince(date:)来找出到第二天为止的秒数,然后将其乘以1000即可:

extension Date {
    var startOfNextDay: Date {
        return Calendar.current.nextDate(after: self, matching: DateComponents(hour: 0, minute: 0), matchingPolicy: .nextTimePreservingSmallerComponents)!
    }
    var millisecondsUntilTheNextDay: TimeInterval {
        return startOfNextDay.timeIntervalSince(self) * 1000
    }
}
Run Code Online (Sandbox Code Playgroud)

游乐场测试:

let milliseconds = UInt64(Date().millisecondsUntilTheNextDay)   // 7731021 
Run Code Online (Sandbox Code Playgroud)

  • 这对我来说似乎是一个很好的答案。它直接且明确地回答了OP的问题。(投票)谁投票反对?为什么? (2认同)
  • 了解 OP 未指定类型。短语“数字毫秒有点松散*暗示*一个整数计数,这就是我建议它的原因。是的,我使用术语“强制转换”是草率的,因为 Swift 并没有真正允许在标量类型之间进行强制转换习惯想到它们。类型强制是更准确的术语。 (2认同)
  • 您可能需要`.nextTimePreservingSmallerComponents`。如果您使用`previous`,则如果第二天没有午夜,例如DST于2017-10-15在巴西/东部时区结束,则可能会得到错误的答案。 (2认同)