我收到一个约会
let slotDateString: String = "2023-12-06T15:45:00+04:00"
我有两个格式化程序:
var iso8601FormatterWithFullTimeZone: DateFormatter {
let formatter = DateFormatter(withFormat: "yyyy-MM-dd'T'HH:mm:ssZZZZZ")
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = .current
return formatter
}
var hoursMinutesFormatter: DateFormatter {
let formatter = DateFormatter(withFormat: "HH:mm")
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.timeZone = .current
return formatter
}
当我运行以下代码时:
let dateFormatter: DateFormatter = .iso8601FormatterWithFullTimeZone
let hoursMinutesFormatter: DateFormatter = .hoursMinutesFormatter
guard let slotDate: Date = dateFormatter.date(from: slotDateString) else {
return
}
let slotHour: String = hoursMinutesFormatter.string(from: slotDate)
slotDate
返回我2023-12-06 12:45:00 +0000
并且
slotHour
返回我"12:45"
我住在时区 +01:00,但我想获取考虑到原始字符串中给出的偏移量的日期和小时。 所以
slotDate
应该具有类似的值
2023-12-06 15:45:00 +4000
或 2023-12-06 12:45:00 +0100
和
slotHour
应该正好 "15:45"
您说“...我想获取一个日期和一个小时,并考虑原始字符串中给出的偏移量。”我认为没有一种简单的方法可以使用 DateFormatter 从日期字符串中提取时区。
如果您知道它将采用 ISO8601DateFormatter .withInternetDateTime 格式,您可以编写代码来自己从 UDT 中提取偏移量,然后将该时区应用于输出日期格式化程序,然后再将日期转换为字符串。
如果您想要 Date 对象的特定输出,您需要使用第二个格式化程序来输出
let formatter = ISO8601DateFormatter()
formatter.formatOptions = [.withInternetDateTime]
formatter.timeZone = .current // <-- Same as yours, +1
let output = formatter.string(from: slotDate)
print(output)
2023-12-06T12:45:00+01:00
要获取原始时区的小时/分钟字符串,您需要在格式化程序中使用该时区
var hoursMinutesFormatter: DateFormatter {
let formatter = DateFormatter()
formatter.dateFormat = "HH:mm"
formatter.timeZone = TimeZone(secondsFromGMT: 4*3600) // Or use an identifier/abbrevation init if you know the zone
return formatter
}
let slotHour = hoursMinutesFormatter.string(from: slotDate)
print(slotHour)
15:45