我收到一个约会
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"
如果您想要 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
您说“...我想获取一个日期和一个小时,并考虑原始字符串中给出的偏移量。”我认为没有一种简单的方法可以使用 DateFormatter 从日期字符串中提取时区。
如果您知道它将采用 ISO8601DateFormatter .withInternetDateTime 格式,您可以编写代码来自己从 UDT 中提取偏移量,然后将该时区应用于输出日期格式化程序,然后再将日期转换为字符串。
您可以删除时区部分,然后获取小时:
let slotDateString = String("2023-12-06T15:45:00+01:00".dropLast(6)) // 👈 Drop timezone from the string
var iso8601FormatterWithFullTimeZone: DateFormatter {
let formatter = DateFormatter(withFormat: "yyyy-MM-dd'T'HH:mm:ss") // 👈 No timezone in the formatter
,,,
}
所以
slotHour
就是 "15:45"
如果您希望同一时区具有相同的 HH:mm,则只需访问原始字符串中的值即可。在这种情况下不需要日期格式化程序。
let slotDateString: String = "2023-12-06T15:45:00+04:00"
let slotHour = String(slotDateString.dropLast(9).dropFirst(11))
只要
slotDateString
采用您在问题中显示的格式,并且只要您希望时间与原始字符串的时区相同而不是用户当前的时区,则此方法就有效。