提问者:小点点

Swift-获取具有不同时区的当前日期以在时间之间进行比较


我一直在寻找这个,但没有找到一个解决方案,符合我的需要。我需要获取NSDate类型的日期,而不是字符串,其中包括特定时区的当前时间,以便稍后对其进行比较,查看该时间是否介于一个范围之间。

例如,我需要看看商店是否在营业。我在东部时区,现在是晚上11:30,所以我看到一个商店的时间表,它在11点关门,但商店是在PST的,这意味着现在是晚上10点,在那个地区和剧照开门。因此,我需要将我的时区更改为商店时区,以显示一个标志,如果它是打开的或关闭的。

这是我尝试的一个例子:

guard let tz = model?.timeZone else {return "EST"};    
let tz = TimeZone.init(abbreviation: timeZone);
df.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZZZZZ";
let dateString = df.string(from:Date()); //time is correct
let date = df.date(from: dateString); //ignore timeZone and transform to a different date.

但当我转换包含时区正确设置的时间的字符串并将其解析回日期类型时,只需忽略时区并显示不同的时间。我想我必须做一些事情,比如得到时间之间的差异,并添加到当前的时间,但我不确定如何做到这一点。因为这也是我一直在努力做的:

let localTimeZoneOffset = myTimeZone.secondsFromGMT(for: Date());
let currentTime = Date().addingTimeInterval(TimeInterval(- 
localTimeZoneOffset));

我仍然可以在任何一个区域,我想看看另一个区域的商店是否在不同的时区打开,设备的当前时间和商店的开闭时间。我的位置可以在任何地方,我选择的商店也是,所以我想我需要得到这两个时间的差异或类似的东西

假设这是我得到的信息:Now=Date();OpenTime=2018-04-27 11:00:00+0000;关闭时间=2018-04-28 03:00:00+0000;StoreTimeZone=“est”有了这个信息,如果我在一个与商店有不同时区的地方,商店是否开着,很容易得到吗?我已经有了可以比较的函数,就是时间是在开放时间和关闭时间之间,我只需要在商店中传递正确的时间,以获得它是打开的或不是现在。

提前道谢。


共1个答案

匿名用户

这是我的解决方案。我在一个方便的地方为JSON添加了一个时区;您需要调整以允许数据中时区的位置。

struct Schedule: Codable {
    var timezone: String
    var storeHours: [DayHours]
}

struct DayHours: Codable {
    var hours: String
    var day: String
    var date: String
}


struct OpeningHours {
    let day: String
    let openTime: Date
    let closeTime: Date

    func isOpen(on date: Date) -> Bool {
        return date >= openTime && date < closeTime
    }
}

struct StoreSchedule {
    let openingHours:[OpeningHours]
    let timezone: TimeZone

    init?(_ schedule: Schedule) {
        guard let timezone = TimeZone(abbreviation:schedule.timezone) else {
            return nil
        }

        let dateFormatter = DateFormatter()
        dateFormatter.dateFormat = "yyyy-MM-dd hh:mm a"
        dateFormatter.timeZone = timezone
        self.timezone = timezone
        var openingHours = [OpeningHours]()
        for dayHours in schedule.storeHours {
            let components = dayHours.hours.components(separatedBy: "-")
            guard components.count == 2 else {
                return nil
            }
            let opening = components[0]
            let closing = components[1]
            guard let openTime = dateFormatter.date(from: "\(dayHours.date) \(opening)"),
                let closeTime = dateFormatter.date(from: "\(dayHours.date) \(closing)") else {
                    return nil
            }
            openingHours.append(OpeningHours(day: dayHours.day, openTime: openTime, closeTime: closeTime))
        }

        self.openingHours = openingHours
    }

    func isOpen(on date: Date) -> Bool{
        for openings in openingHours {
            if openings.isOpen(on: date) {
                return true
            }
        }
        return false
    }
}

let json = """
{
"timezone": "PST",
"storeHours": [{
"hours": "7:00 AM - 11:00 PM",
"day": "Friday",
"date": "2018-04-27"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Saturday",
"date": "2018-04-28"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Sunday",
"date": "2018-04-29"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Monday",
"date": "2018-04-30"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Tuesday",
"date": "2018-05-01"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Wednesday",
"date": "2018-05-02"
}, {
"hours": "7:00 AM - 11:00 PM",
"day": "Thursday",
"date": "2018-05-03"
}]
}
"""

let schedule = try! JSONDecoder().decode(Schedule.self, from: json.data(using: .utf8)!)

if let storeSchedule = StoreSchedule(schedule) {
    //  print(storeSchedule)
    let openClosed = storeSchedule.isOpen(on: Date()) ? "Open":"Closed"
    print("Store is: \(openClosed)")
} else {
    print("Unable to create schedule")
}

商店为:打开