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

时间:2018-11-01 16:51:27

标签: swift date-formatting

我正在尝试将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 
}

2 个答案:

答案 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属性。默认为当地时间。