我有一个应用程序,我正在Swift构建,需要确定商店/餐厅目前是否开放。它查询我控制的数据库,因此我可以设置我想要的开放时间。目前,我将一周中每天的openTime / closeTime列设置为时间戳。例如:MonOpen = 11:00,MonClose = 19:00。
我如何使用swift来确定营业地点目前是否开放?我在想像if currentTime > MonOpen & currentTime < MonClose {...
这是iOS星巴克应用程序的一个例子。如果您前往地点,每个地点都会列出“营业至22:00”或“营业至23:00”。
答案 0 :(得分:1)
这只是玩时区的问题,无论你是使用用户系统的时区还是让他们在应用程序的设置中选择另一个时区:
let tz = NSTimeZone.defaultTimeZone()
let now = NSCalendar.currentCalendar().componentsInTimeZone(tz, fromDate: NSDate())
if now.weekDay == 2 && now.hour > MonOpen && now.hour < MonClose {
// The store is open
}
答案 1 :(得分:1)
由于我们现在有了Swift 5.1,而且大多数公司的营业时间比几个小时要复杂得多,因此我想在这个问题上再作个探讨。
import Foundation
// There might be an enum in Swift
// that I did not bother to lookup
enum Days : Int {
case Sun = 1
case Mon = 2
case Tue = 3
case Wed = 4
case Thu = 5
case Fri = 6
case Sat = 7
}
func isOfficeOpenNow(weekSchedule: [Days: (Int, Int)]) -> Bool {
let tz = NSTimeZone.default
let now = NSCalendar.current.dateComponents(in: tz, from: Date())
guard let weekday = now.weekday,
let today = Days(rawValue: weekday),
let hour = now.hour,
let minute = now.minute else {
return false
}
guard let todayTuple = weekSchedule[today] else {
return false // no key, means closed
}
let opensAt = todayTuple.0
let closesAt = todayTuple.1
assert(opensAt < closesAt, "Your schedule is setup wrong.")
let rightNowInMinutes = hour * 60 + minute
return rightNowInMinutes > opensAt &&
rightNowInMinutes < closesAt
}
要使用此功能,只需定义每天的字典。
键是星期几。可以使用字符串“ Mon”,“ Tue”等 但随后您将需要一个映射或DateFormatter
值是分钟内(打开,关闭)的元组(int,int) 使用分钟,因为许多商店都有更复杂的营业时间 关闭时间不只是几个小时
let schedule = [
Days.Mon: (9*60+30, 22*60+30),
Days.Tue: (9*60+30, 23*60+05),
Days.Wed: (9*60+30, 22*60+30),
Days.Thu: (9*60+30, 22*60+30),
Days.Fri: (9*60+30, 22*60+30),
]
if isOfficeOpenNow(weekSchedule: schedule) {
print("Store open")
} else {
print("Store closed")
}
如果特定的一周是假期,则只需更新该周的时间表即可,这对整个世界都很有利。
如果一天关闭,只需从计划表中删除密钥即可。