无法将时间戳日期转换为 swift 中的字符串 4

can't convert time stamp date to string in swift 4

我正在尝试将时间戳字符串日期转换为日期。

结果总是returns nil。

func getDatefromTimeStamp (str_date : String , strdateFormat: String) -> String { 
    // stringDate '2018-01-01T00:00:00.000+03:00' 
    let dateFormatter = DateFormatter() 
    dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
    dateFormatter.timeZone = NSTimeZone(forSecondsFromGMT: 0) as TimeZone! 


    let date = dateFormatter.date(from: str_date) 
    dateFormatter.dateFormat = strdateFormat 
    let datestr = dateFormatter.string(from: date!) 
    return datestr 
}

首先我强烈建议你使用守卫而不是部队

其次为什么要设置两次日期格式?第一次是 dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ" 然后几行之后用你传入的参数重置它 dateFormatter.dateFormat = strdateFormat。选择一个并将其设置在开头 - 这可能会导致您的问题

第三,如果以上不是问题 - 请确保您的日期完全符合必要的格式,如果完全错误,它将 return 为零。即使是空格和冒号也必须是完美的,我建议使用字符串生成器来确保它们是一致的

您的主要问题是格式 "yyyy-MM-dd'T'HH:mm:ssZ""2018-01-01T00:00:00.000+03:00" 等字符串不匹配。该字符串包含毫秒,但您的格式没有。

将您的格式更新为 "yyyy-MM-dd'T'HH:mm:ss.SSSZ"

这将修复 nil 结果。

那么你应该清理你对 NSTimeZone 的使用。只需使用 TimeZone.

dateFormatter.timeZone = TimeZone(secondsFromGMT: 0)

但是在解析这个字符串的时候不需要设置时区,因为这个字符串包含了时区信息。

但是,在将生成的 Date 转换为新的 String 时,您可能需要也可能不需要设置时区。这取决于你想要什么结果。

您想要 UTC 时间的最终字符串(这是您将使用当前代码获得的结果)还是您想要用户本地时间的最终字符串?

如果您想要用户本地时间的最终字符串,则根本不要设置时区 属性。它将默认为当地时间。