当前位置: 首页 > 知识库问答 >
问题:

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

终安和
2023-03-14

我一直在寻找这个,但没有找到一个解决方案,符合我的需要。我需要获取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个答案

国仰岳
2023-03-14

这是我的解决方案。我在一个方便的地方为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")
}

商店为:打开

 类似资料:
  • 我有个约会‘2019-05-08t 22:15:00-0400’。我想将这个日期与当前的日期和时间进行比较。如果上述日期和时间小于当前日期和时间,那么我必须做些什么。 我的代码是:- 但它返回 false 。

  • 我想做一个考勤应用程序,我真的很困惑iOS和Firebase中的日期和时间。

  • 问题内容: 我在获取24小时制的当前时间时遇到问题。据我所知,“ HH”应代表24小时制的当前小时,但是由于某种原因,“ HH”根本没有被解释。这就是为什么以下代码行输出类似 “ HH:50:06 Uhr,Sep. Sep.”的原因。 : 有什么想法我做错了吗?但是,使用“ hh”有效,这将以12小时制输出时间,这不是我想要的。 帮助表示赞赏! 问题答案: 您可以使用SimpleDateForma

  • 问题内容: 刚从操场开始。我正在尝试创建一个简单的应用程序。 我创建了一个这样的日期对象: 我如何获得当前时间?在其他语言中,我可以执行以下操作: 但是我找不到像这样的任何属性/方法。我找到了一种方法。我应该用那个吗?如果是这样,怎么办? 问题答案: Swift 3更新: 我这样做: 在Objective-c中看到相同的问题,如何从NSDate获得小时和分钟?与Nate的答案相比,您将获得一个数字

  • 问题内容: 我有一个可在JavaScript中显示当前日期和时间的脚本,但这始终是错误的。这是代码: 它应该打印并打印 有什么帮助吗?谢谢 问题答案: 返回一个从零开始的数字,以便获得正确的月份,您需要将其加1,因此调用in可能会返回而不是。 因此,在您的代码中,我们可以用来输出正确的值。此外: 返回月中的某天 < -这是您想要的*那一天 * 是对象的单独方法,它将返回代表星期几(0-6)等的整数

  • 问题内容: 如何使用Java获取当前日期和时间? 我正在寻找与C#等效的东西。 问题答案: 只需构造一个没有任何参数的新对象即可;这会将当前日期和时间分配给新对象。 在的话的Javadoc的无参数的构造函数: 分配一个Date对象并对其进行 初始化,以便它表示分配它的时间( 以最近的毫秒为单位)。 确保您使用的不是-后者没有零参数构造函数,并且语义有所不同,这是完全不同的对话的主题。:)