【问题标题】:Swfit- Check whether current time is between two time stringSwift-检查当前时间是否在两个时间字符串之间
【发布时间】:2020-10-01 17:56:46
【问题描述】:

如何检查当前时间是否在以下格式的两个时间字符串之间。 HH:MM AM/PM 说如果

startTime = "10:30 AM" 
endTime = "06:30 PM"

如何检查currentTime() 的值是否在开始时间和结束时间之间?

【问题讨论】:

  • 您是否厌倦了获取相当于日期+时间的 Unix 时间戳,然后比较所有三个值。时间戳不应低于开始时间和高于结束时间
  • 我从 API 获取开始和结束日期,因此无法使用 Unix 时间戳
  • 那你就可以用普通的swift特性来比较时间戳了....我举个例子

标签: ios swift


【解决方案1】:

您可以设置今天的日期格式化程序defaultDate,解析日期字符串,创建一个带有开始和结束日期的DateInterval,并检查它是否包含现在Date()

extension Formatter {
    static let today: DateFormatter = {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = .init(identifier: "en_US_POSIX")
        dateFormatter.defaultDate = Calendar.current.startOfDay(for: Date())
        dateFormatter.dateFormat = "hh:mm a"
        return dateFormatter
        
    }()
}

func checkIfCurrentTimeIsBetween(startTime: String, endTime: String) -> Bool {
    guard let start = Formatter.today.date(from: startTime),
          let end = Formatter.today.date(from: endTime) else {
        return false
    }
    return DateInterval(start: start, end: end).contains(Date())
}

let startTime = "10:30 AM"
let endTime = "06:30 PM"
checkIfCurrentTimeIsBetween(startTime: startTime, endTime: endTime)   // true

【讨论】:

  • 我喜欢today 格式化程序的技巧,它默认为当天的时间。然而,使用 DateInterval 检查当前时间是否在开始时间和结束时间之间似乎有点愚蠢。对于最近的几个 OS 版本,Date 对象是 Comparable,所以你可以说 if now >= start && now <= end
  • @DuncanC 我喜欢可读性。我也可以使用日期范围和模式匹配运算符并返回 start..<end ~= Date() 但 OP 对 Swift 来说似乎很新
  • 就可读性(或者说缺乏可读性)而言,我个人讨厌模式匹配运算符。
【解决方案2】:

您可以使用 Swift 的 Dateformatter() 来编码和比较日期:

let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "hh:mm a"
dateFormatter.locale = Locale.init(identifier: "en_GB")
dateFormatter.defaultDate = Calendar.current.startOfDay(for: Date())
dateFormatter.amSymbol = "AM"
dateFormatter.pmSymbol = "PM"

let startTimeFormatted = dateFormatter.today.date(from: startTime)
let endTimeFormatted = dateFormatter.today.date(from: endTime)

//Now you can compare the two, e.g.

if startTimeFormatted > currentDate() && currentDate() < endTimeFormatted{
    return true
}

【讨论】:

  • 您的代码存在一些问题。它应该是 hh 而不是 h。您应该使用语言环境“en_US_POSIX”。结果日期将是 2000 年 1 月 1 日而不是今天。
  • DateFormatter 上没有 today 实例属性。 dateFormatter.today 是错误的。只需使用普通的dateFormatter.whatever。您仍在使用错误的语言环境。在发布答案之前,您应该始终尝试编译您的代码。
  • 我忘了说你应该在设置dateFormat属性之前设置语言环境。
猜你喜欢
  • 2021-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-19
  • 1970-01-01
  • 1970-01-01
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多