如何在 Swift 中获取另一个时区的当前日期和时间?

Posted

技术标签:

【中文标题】如何在 Swift 中获取另一个时区的当前日期和时间?【英文标题】:How to get the current date and time of another timezone in Swift? 【发布时间】:2019-11-20 16:22:42 【问题描述】:

我有一个需要在不同时区的不同时间窗口运行的计划作业。最终,知道澳大利亚的 UTC 时间(例如)20:00,以便开始该地区的工作。

更新

有关我的用例的更多详细信息: 我有一个计划的工作,需要每隔几个小时运行一次。哪个为不同的客户端做了一些 Redis 缓存清理。

这项工作需要在我的每个客户的办公时间之后运行,这与他们的时区有关。

我有每个客户的时区。但是,我需要找出每个时区的时间,以便能够为我的每个客户运行清理工作。

我找不到如何在 Swift 中获取另一个时区时间的示例?

【问题讨论】:

您是否只需要组件来构建String 我不确定我明白你的意思吗? 另一个时间的当前日期和时间与当前时间完全相同,除了时区小时偏移。对我来说,你想要达到的目标并不是很清楚。通常建议使用 UTC 日期 您是否需要在另一个时区的某个时间安排您当地时区的工作?即您是否需要知道(例如)澳大利亚 19:45 的 UTC 时间? ***.com/a/46660225/2303865 的可能重复项 【参考方案1】:

有多种方法可以获取本地时间,例如使用字符串时区标识符和 GMT 秒数。并且有多种格式可以表示时间,例如字符串和原生Date 对象。您在问题中没有详细说明,所以这是一个起点:

func localTime(in timeZone: String) -> String 
    let f = ISO8601DateFormatter()
    f.formatOptions = [.withInternetDateTime]
    f.timeZone = TimeZone(identifier: timeZone)
    return f.string(from: Date())


print(localTime(in: "Asia/Tehran")) // 2019-11-20T20:17:13+03:30 (8:17 PM)

世界上有多少时区并不完全确定,但普遍共识似乎是 38。我更喜欢使用 secondsFromGMT,因为它比使用字符串标识符更具确定性,因为字符串标识符可能会发生变化(因为这是一个 Swift 库),而 secondsFromGMT 不能(不改变时区本身)。

// For a list of all time zone string identifiers
for timeZone in TimeZone.knownTimeZoneIdentifiers 
    print(timeZone)

很遗憾,secondsFromGMT 不识别小数时区,而且还有不少;因此,我们可以使用这两种方法来获得 38 个的完整列表:

-12:00 TimeZone(secondsFromGMT: -43200) -11:00 TimeZone(secondsFromGMT: -39600) -10:00 TimeZone(secondsFromGMT: -36000) -09:30 TimeZone(identifier: "Pacific/Marquesas") -09:00 TimeZone(secondsFromGMT: -32400) -08:00 TimeZone(secondsFromGMT: -28800) -07:00 TimeZone(secondsFromGMT: -25200) -06:00 TimeZone(secondsFromGMT: -21600) -05:00 TimeZone(secondsFromGMT: -18000) -04:00 TimeZone(secondsFromGMT: -14400) -03:30 TimeZone(identifier: "America/St_Johns") -03:00 TimeZone(secondsFromGMT: -10800) -02:00 TimeZone(secondsFromGMT: -7200) -01:00 TimeZone(secondsFromGMT: -3600) +00:00 TimeZone(secondsFromGMT: 0) +01:00 TimeZone(secondsFromGMT: 3600) +02:00 TimeZone(secondsFromGMT: 7200) +03:00 TimeZone(secondsFromGMT: 10800) +03:30 TimeZone(identifier: "Asia/Tehran") +04:00 TimeZone(secondsFromGMT: 14400) +04:30 TimeZone(identifier: "Asia/Kabul") +05:00 TimeZone(secondsFromGMT: 18000) +05:30 TimeZone(identifier: "Asia/Colombo") +05:45 TimeZone(identifier: "Asia/Kathmandu") +06:00 TimeZone(secondsFromGMT: 21600) +06:30 TimeZone(identifier: "Asia/Yangon") +07:00 TimeZone(secondsFromGMT: 25200) +08:00 TimeZone(secondsFromGMT: 28800) +08:45 TimeZone(identifier: "Australia/Eucla") +09:00 TimeZone(secondsFromGMT: 32400) +09:30 TimeZone(identifier: "Australia/Adelaide") +10:00 TimeZone(secondsFromGMT: 36000) +10:30 TimeZone(identifier: "Australia/Lord_Howe") +11:00 TimeZone(secondsFromGMT: 39600) +12:00 TimeZone(secondsFromGMT: 43200) +12:45 TimeZone(identifier: "Pacific/Chatham") +13:00 TimeZone(secondsFromGMT: 46800) +14:00 TimeZone(secondsFromGMT: 50400)

【讨论】:

如果您发布使用时区的示例,我将不胜感激!提前致谢! 你如何确定你需要哪个时区或者你需要所有时区? 我几乎需要处理所有时区,但最终我会根据我的物理服务器将它们分成四个区域。 编辑了我的答案。【参考方案2】:
func getDateAndTime(timeZoneIdentifier: String) -> String? 

    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ssZ"
    dateFormatter.timeZone = TimeZone(identifier: timeZoneIdentifier)

    return dateFormatter.string(from: Date())


print(getDateAndTime(timeZoneIdentifier: "UTC")) //2019-11-20 23:37:28 091

【讨论】:

【参考方案3】:

您需要将 UTC 时间转换为本地时区。这是转换它的代码。

let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd HH:mm:ss SSS"
formatter.locale = Locale.current
formatter.timeZone = TimeZone.current
let date = dateFormatter.date(from: utcDate)

在此处将 utcDate 更改为您要转换为本地的日期。

【讨论】:

以上是关于如何在 Swift 中获取另一个时区的当前日期和时间?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Java 中获取时区的当前日期和时间?

如何在javascript中获取时区的当前日期

如何在 Python 中获取或打印 GMT 时区的当前日期时间? [复制]

获取时区的当前日期对象[重复]

如何获取另一个时区的夏令时状态

在Java中获取当前时区的日期