一个复杂的两个日期比较在迅速



构建一个发出排队系统票证的应用程序。用户检查他将预订票证的分支机构,并发出具有一定延迟时间的票证。延迟时间是他到达分支所需的时间。

排队系统 API 分支数据库的分支的打开和关闭时间字段以字符串格式为"9:00""17:00"。此外,API 有一个布尔字段,如果分支关闭或打开,我会使用它,所以我检查该布尔值在分支状态关闭时不发出票证。

问题是当分支打开时,用户将发出具有一定延迟时间的票证。我需要做的是计算:

var branchClosingTime = "17:00"
var delay = 3000 //sec
var timeNow = Date().TimeIntervalSince1970
if (timeNow + delay) < branchClosingTime {
print("Issue ticket")
} else {
print("Don't issue ticket")
}

通过这个计算,我将检查他是否没有通过分行关闭时间。我有算法,但我真的不知道如何做到这一点。我在 xcode 操场上玩了一点将日期转换为 unix 时间戳,但我不知道如何将这个关闭时间字符串转换为 unix 时间戳并进行比较。

您可以使用以下方法解析字符串的内容:

let dateString = "20:34"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
if let date = dateFormatter.date(from: dateString) {
let calendar = Calendar.current
let components = calendar.dateComponents([.hour,.minute], from: date)
print(components.hour!)
print(components.minute!)
}

Calendar 类具有一些例程,可以帮助您确定字符串表示的日期(相对于现在)。 例如,我不知道您的"17:00"是指今天,还是下一次出现 17:00......但是日历类有例程来帮助你弄清楚。

多亏了@Scott的建议,我才能解决我的问题,这就是它是如何完成的。

var orderTime: TimeInterval = 1494520200 - 7200  // -7200 sec to adabt to my time zone
var delay: TimeInterval = 2000 //sec
var orderDate = Date(timeIntervalSince1970: orderTime) // "May 11, 2017, 4:30 PM"
var orderDateWithDelay = orderDate + delay //"May 11, 2017, 5:03 PM"

let dateString = "17:00"
let dateFormatter = DateFormatter()
dateFormatter.dateFormat = "HH:mm"
if let date = dateFormatter.date(from: dateString) {
let calendar = Calendar.current
let components = calendar.dateComponents([.hour,.minute], from: date)
let closeDate = calendar.nextDate(after: orderDate, matching: components, matchingPolicy: .nextTime, repeatedTimePolicy: .first, direction: .forward) //"May 11, 2017, 5:00 PM"

if closeDate!.compare(orderDateWithDelay) == .orderedDescending
{
print("Close date after order date")
print("Issue ticket")
} else if closeDate!.compare(orderDateWithDelay) == .orderedAscending {
print("Close date before order date")
print("Don't issue ticket")
} 
}

最新更新