使用DateFormatter()Swift 4将字符串转换为用户本地时间的问题

时间:2019-04-16 15:20:10

标签: swift

我正在尝试将字符串转换为Date类型。我正在尝试将时间转换为本地时间,但是输出却很奇怪。这是我正在使用的功能以及得到的结果。我使用的字符串输入看起来像是“上午10:15:

下面的函数返回一个字符串,但这只是看输出,最终它将返回一个Date。

func convertTime(date: String) -> String {
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "hh:mm a"
    dateFormatter.locale = Locale.current
    print(Locale.current.identifier)
    print(TimeZone.current.identifier)
    dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)
    if let formattedTime = dateFormatter.date(from: date) {
        let userFormatter = DateFormatter()
        userFormatter.timeStyle = .short // Set as desired

        return userFormatter.string(from: formattedTime)
    } else {
        return "Unknown date"
    }
}

输出的第一部分是输入字符串,第二部分是转换时间。我希望获得美国/丹佛时区的转换时间,但事实并非如此。

en_US
America/Denver
Input String: 10:58 AM, Output String: 3:58 AM
en_US
America/Denver
Input String: 7:43 PM, Output String: 12:43 PM
en_US
America/Denver
Input String: 12:14 PM, Output String: 5:14 AM

1 个答案:

答案 0 :(得分:0)

您的输出对您发布的代码是正确的。您将字符串“ 10:58 AM”视为第一年中的UTC时间。这是因为时间字符串没有日期,并且因为您在日期格式器上设置了UTC时区。

您将在本地时间获得“ 3:58 AM”的输出(这对您来说是丹佛)。丹佛通常为UTC-7(夏令时为UTC-6)。

如果您的目标是将UTC时间转换为用户的本地时间(在这种情况下为丹佛),则您的代码运行正常。

如果您想将原始字符串视为本地时间,而您的目标只是更改格式,请不要在第一个日期格式器上设置location

不相关,但无需使用以下行:

timeZone

因为日期格式化程序默认为当前语言环境。