Swift - Получить текущую дату в разных часовых поясах, чтобы сравнить время - PullRequest
0 голосов
/ 27 апреля 2018

Я искал это, но не смог найти решение, которое соответствует моим потребностям. Мне нужно получить Date типа NSDate, а не String, который включает текущее время определенного часового пояса, чтобы позже сравнить его, чтобы увидеть, находится ли время в диапазоне.

Например, мне нужно посмотреть, открыт ли магазин. Я нахожусь в часовом поясе EST, и сейчас 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; CloseTime = 2018-04-28 03:00:00 +0000; StoreTimeZone = "EST" С этой информацией легко получить информацию, открыт ли магазин или нет, если я нахожусь в месте с другим часовым поясом от магазина? У меня уже есть функции для сравнения - время между OpenTime и CloseTime. Мне просто нужно указать правильное время в магазине, чтобы узнать, открыто оно или нет прямо сейчас.

Заранее спасибо.

1 Ответ

0 голосов
/ 28 апреля 2018

Вот мое решение. Я добавил часовой пояс в 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")
}

Магазин: Открыть

...