如何在Swift中获取其他时区的当前日期和时间



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

更新

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

对于我的每个客户来说,这项工作需要在下班后运行,这与他们的时区有关。

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

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

有多种方法可以获取本地时间,例如使用字符串时区标识符和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:00TimeZone(secondsFromGMT: -43200)
-11:00TimeZone(secondsFromGMT: -39600)
-10:00TimeZone(secondsFromGMT: -36000)
-09:30TimeZone(identifier: "Pacific/Marquesas")
-09:00TimeZone(secondsFromGMT: -32400)
-0800TimeZone(secondsFromGMT: -28800)
-07:00TimeZone(secondsFromGMT: -25200)
-06:00TimeZone(secondsFromGMT: -21600)
-05:00TimeZone(secondsFromGMT: -18000)
-04:00TimeZone(secondsFromGMT: -14400)
-03:30TimeZone(identifier: "America/St_Johns")
03:00TimeZone(secondsFromGMT: -10800)
-02:00TimeZone(secondsFromGMT: -7200)
01:00TimeZone(secondsFromGMT: -3600)
+000:00TimeZone(secondsFromGMT: 0)
+11:00TimeZone(secondsFromGMT: 3600)
+0.02:00TimeZone(secondsFromGMT: 7200)
+03:00TimeZone(secondsFromGMT: 10800)
+03:30TimeZone(identifier: "Asia/Tehran")
+0.4:00TimeZone(secondsFromGMT: 14400)
+04:30TimeZone(identifier: "Asia/Kabul")
+05:00TimeZone(secondsFromGMT: 18000)
+05:30TimeZone(identifier: "Asia/Colombo")
+55:45TimeZone(identifier: "Asia/Kathmandu")
+0.06:00TimeZone(secondsFromGMT: 21600)
+06:30TimeZone(identifier: "Asia/Yangon")
+77:00TimeZone(secondsFromGMT: 25200)
+88:00TimeZone(secondsFromGMT: 28800)
+88:45TimeZone(identifier: "Australia/Eucla")
+9:00TimeZone(secondsFromGMT: 32400)
+9:30TimeZone(identifier: "Australia/Adelaide")
+10:00TimeZone(secondsFromGMT: 36000)
+10:30TimeZone(identifier: "Australia/Lord_Howe")
+11:00TimeZone(secondsFromGMT: 39600)
+12:00TimeZone(secondsFromGMT: 43200)
+12:45TimeZone(identifier: "Pacific/Chatham")
+13:00TimeZone(secondsFromGMT: 46800)
+14:00TimeZone(secondsFromGMT: 50400)

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

您需要将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更改为要转换为本地的日期。

我想要一个简单的时间格式。即用户当前语言环境设置中的CCD_ 43。

我是这样做的:

func getTimeWithLocale(with timeZone: String) -> String {
let dateFormatter = DateFormatter()
dateFormatter.dateStyle = .none
dateFormatter.timeStyle = .short
dateFormatter.timeZone = TimeZone(identifier: timeZone)
dateFormatter.locale = .current

let time = dateFormatter.string(from: Date()).lowercased().replacingOccurrences(of: " ", with: "")

return time
}

最新更新