我正在尝试将timeStamp字符串日期转换为Date。
结果总是返回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
}
答案 0 :(得分:0)
首先,我强烈建议您使用警卫而不是武力
第二,为什么要两次设置日期格式?第一次是dateFormatter.dateFormat =“ yyyy-MM-dd'T'HH:mm:ssZ”,然后几行用您在dateFormatter.dateFormat = strdateFormat中传递的参数将其重置。选择一个并在开始时进行设置-可能会导致您出现问题
第三,如果以上都不是问题-如果日期完全不对,请确保您的日期格式正确无误,它将返回nil。甚至空格和冒号也必须是完美的,我建议使用字符串生成器来确保它们是一致的
答案 1 :(得分:0)
您的主要问题是格式"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时间的最后一个字符串(这是您当前的代码会得到的)还是要在用户当地时间的最后一个字符串?
如果要在用户的本地时间中使用最后一个字符串,则完全不要设置timezone属性。默认为当地时间。