测试一天中的当前时间是否在两个 TimeIntervals 之间

Test whether current time of day is between two TimeIntervals

我有 2 个 TimeIntervals,它们仅代表一天中与日期无关的时间(例如 8:00 AM 和 5:00 PM)。因此,在本例中,0 正好代表午夜,而 29,040 代表 8:04 上午。我想检查 phone 的时间是否在两个 TimeIntervals 之间。

我发现了一些类似的 Stack Overflow 问题,但其中 none 确实涉及 TimeIntervals。似乎只使用 start <= Date().timeIntervalSinceReferenceDate <= end 或其他东西是行不通的,因为它会 return 一个巨大的价值。

在 Swift 3 中处理此类情况的最佳方法是什么?

编辑:澄清一下,我不需要担心夏令时之类的事情。例如,假设用户只希望应用程序中的某些事情发生在 X 和 Y 之间,其中 X 和 Y 从午夜开始作为 TimeInterval 值提供给我。因此,在完成操作之前,检查 phone 的 TimeInterval 是否足够,因为通常一天的午夜是在 X 和 Y 之间。

Date().timeIntervalSinceReferenceDate returns 自 2000 年 1 月 1 日以来的秒数,毫无疑问这是一个巨大的数字。

不建议将时间存储为自午夜以来的秒数,因为夏令时这个令人讨厌的小东西。每年,不同的国家在不同的日子和不同的时间进行。例如,即使英国和法国在同一天(2017 年 3 月 26 日)更改了时钟,但从 1AM to 2AM, the other goes from 2AM to 3AM 进行了更改。这很容易弄得一团糟!

改用DateComponents

let calendar = Calendar.current
let startTimeComponent = DateComponents(calendar: calendar, hour: 8)
let endTimeComponent   = DateComponents(calendar: calendar, hour: 17, minute: 30)

let now = Date()
let startOfToday = calendar.startOfDay(for: now)
let startTime    = calendar.date(byAdding: startTimeComponent, to: startOfToday)!
let endTime      = calendar.date(byAdding: endTimeComponent, to: startOfToday)!

if startTime <= now && now <= endTime {
    print("between 8 AM and 5:30 PM")
} else {
    print("not between 8 AM and 5:30 PM")
}

我最终使用 DateComponents 计算了 TimeInterval

let components = Calendar.current.dateComponents(
  [.hour, .minute, .second], from: Date())
guard let seconds = components.second,
  let minutes = components.minute,
  let hours = components.hour else
{
  return false
}
let currentTime = Double(seconds + minutes * 60 + hours * 60 * 60)
return startTime <= currentTime && currentTime <= endTime