如何获取 Swift 中另一个时区的当前日期和时间?
How to get the current date and time of another timezone in Swift?
我有一个预定的工作需要 运行 在不同时区的不同时间 windows。最终,了解澳大利亚的(例如)20:00 时的 UTC 时间,以便开始该地区的工作。
更新
有关我的用例的更多详细信息:
我有一份预定的工作,需要每隔几个小时 运行。哪个为不同的客户端做一些 Redis 缓存清理。
这项工作需要 运行 在我的每个客户的下班时间,这是关于他们的时区。
我有每个客户的时区。但是,我需要找出每个时区的时间,以便能够 运行 我的每个客户的清理工作。
我找不到有关如何在 Swift 中获取另一个时区时间的示例?
您需要将 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 更改为您要转换为本地的日期。
有多种方法可以获取本地时间,例如使用字符串时区标识符和 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)
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
我有一个预定的工作需要 运行 在不同时区的不同时间 windows。最终,了解澳大利亚的(例如)20:00 时的 UTC 时间,以便开始该地区的工作。
更新
有关我的用例的更多详细信息: 我有一份预定的工作,需要每隔几个小时 运行。哪个为不同的客户端做一些 Redis 缓存清理。
这项工作需要 运行 在我的每个客户的下班时间,这是关于他们的时区。
我有每个客户的时区。但是,我需要找出每个时区的时间,以便能够 运行 我的每个客户的清理工作。
我找不到有关如何在 Swift 中获取另一个时区时间的示例?
您需要将 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 更改为您要转换为本地的日期。
有多种方法可以获取本地时间,例如使用字符串时区标识符和 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)
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