Swift - 从包括时区的字符串创建日期

问题描述 投票:0回答:2

我收到一个约会

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"

swift date time timezone dateformatter
2个回答
0
投票

您说“...我想获取一个日期和一个小时,并考虑原始字符串中给出的偏移量。”我认为没有一种简单的方法可以使用 DateFormatter 从日期字符串中提取时区。

如果您知道它将采用 ISO8601DateFormatter .withInternetDateTime 格式,您可以编写代码来自己从 UDT 中提取偏移量,然后将该时区应用于输出日期格式化程序,然后再将日期转换为字符串。


0
投票

如果您想要 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

© www.soinside.com 2019 - 2024. All rights reserved.