如何根据营业时间确定企业是否营业(Swift iOS)

如何根据营业时间确定企业是否营业(Swift iOS),ios,swift,nsdate,Ios,Swift,Nsdate,我有一个我正在Swift中构建的应用程序,需要确定商店/餐厅当前是否开门。它查询我控制的数据库,这样我就可以随意设置开放时间。目前,我为一周中的每一天设置了一个openTime/closeTime列作为时间戳。例如:MonOpen=11:00,MonClose=19:00 如何使用swift确定营业地当前是否营业?我在想象类似于if currentTime>MonOpen¤tTimeMonOpen&&now.hour

我有一个我正在Swift中构建的应用程序,需要确定商店/餐厅当前是否开门。它查询我控制的数据库,这样我就可以随意设置开放时间。目前,我为一周中的每一天设置了一个openTime/closeTime列作为时间戳。例如:MonOpen=11:00,MonClose=19:00

如何使用swift确定营业地当前是否营业?我在想象类似于
if currentTime>MonOpen¤tTime


iOS Starbucks应用程序就是一个例子。如果你去各个地点,每个地点都会列出“开放至22:00”或“开放至23:00”。

这只是玩时区的问题,不管你是使用用户系统的时区还是让他们在应用程序的设置中选择另一个时区:

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
}
let tz=NSTimeZone.defaultTimeZone()
现在让我们来看看=NSCalendar.currentCalendar().componentsInTimeZone(tz,fromDate:NSDate())
如果now.weekDay==2&&now.hour>MonOpen&&now.hour
我想对这个问题再做一次尝试,因为我们现在有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
}
如果某一周是假日,只需更新该周的日程安排,一切都会好起来


如果一天结束了,只需从日程表中删除该键。

效果很好。我发现可以使用
NSTimeZone.setDefaultTimeZone(NSTimeZone(名称:“America/New_York”)!)
设置应用程序委托中的默认时区。@code不同-如果开始或结束日期包含分钟,例如MonOpen=11:30、MonClose=19:30等,该怎么办?能否更新您的答案?如何将
MonOpen
MonClose
存储为十进制小时(11.5和19.5)?或作为字符串?您没有计算日差?我如何检查UTC到本地时区的日差?
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")
}