【问题标题】:Swift get Last-Modified property from NSHTTPURLResponse as NSDateSwift 从 NSHTTPURLResponse 获取 Last-Modified 属性作为 NSDate
【发布时间】:2015-10-20 04:39:37
【问题描述】:

我正在尝试将我的 URLResponse 的最后修改属性作为 NSDate。 我按照以下说明操作:

How can I convert string date to NSDate?

Convert String to NSDate in Swift

Date string to NSDate swift

From String to NSDate in Swift

但它们都不起作用..我从 URLResponse-Object 以“星期一,2015 年 10 月 19 日 05:57:12 GMT”的形式正确接收日期作为字符串

我需要将此字符串转换为 NSDate,以便能够将其与 NSDate: 2015-10-19 05:57:12 UTC 形式的 localDate 进行比较

我也尝试过不同的日期格式,但没有任何区别。

我目前的代码如下:

//The serverDate needs to match the localDate which is a
//NSDate? with value: 2015-10-19 05:57:12 UTC

if let httpResp: NSHTTPURLResponse = response as? NSHTTPURLResponse {
    let date = httpResp.allHeaderFields["Last-Modified"] as! String //EXAMPLE:  "Mon, 19 Oct 2015 05:57:12 GMT"
    let dateFormatter = NSDateFormatter()
    dateFormatter.dateFormat = "yyyy-MM-dd HH:mm:ss ZZZ"
    dateFormatter.timeZone = NSTimeZone(abbreviation: "UTC")
    let serverDate = dateFormatter.dateFromString(date) as NSDate?

    //conversion always fails serverDate == nil       
    println("ServerDate: \(serverDate)")    
}

谁能解释转换失败的原因?有没有其他方法可以尝试转换我的日期?

【问题讨论】:

    标签: ios swift type-conversion nsdate


    【解决方案1】:

    Swift 4,XCode 9:

    let date = httpResponse.allHeaderFields["Date"] as! String
    let dateFormatter = DateFormatter()
    dateFormatter.dateFormat = "EEEE, dd LLL yyyy HH:mm:ss zzz"
    let serverDate = dateFormatter.date(from: date)
    

    @MikeTaverne 建议的对“HH”的更改确实是必需的。

    【讨论】:

    • 别忘了设置语言环境dateFormatter.locale = Locale(identifier: "en")
    【解决方案2】:

    我解决了...

    这是一个合乎逻辑的问题,因为我想解析一个日期的字符串,我必须指定输入 dateFormat 以接收正确的日期返回:

    来自服务器的输入:String = "Mon, 19 Oct 2015 05:57:12 GMT"

    这是一个日期格式:“EEEE, dd LLL y​​yyy HH:mm:ss zzz” (http://userguide.icu-project.org/formatparse/datetime)

    --> 工作代码:

    if let httpResp: NSHTTPURLResponse = response as? NSHTTPURLResponse {
        //EXAMPLE:  "Mon, 19 Oct 2015 05:57:12 GMT"
        let date = httpResp.allHeaderFields["Last-Modified"] as! String 
        let dateFormatter = NSDateFormatter()
        dateFormatter.dateFormat = "EEEE, dd LLL yyyy HH:mm:ss zzz"
        serverDate = dateFormatter.dateFromString(date) as NSDate?
    
        //serverDate is now: 2015-10-19 05:57:12 UTC 
        println("ServerDate: \(serverDate)")
     }
    

    【讨论】:

    • 你需要使用HH,而不是hh。否则,当时间为 PM(13-23 小时)时,您将得到 nil date。
    • 我发现使用星期格式说明符 EEEE 会产生完整的星期名称(例如星期一、星期二等)。但是,我将其发送到的服务器(Rails 后端)无法识别它以这种方式格式化。将其更改为 EEE 会产生一个三字符的星期几(例如周一、周二等),服务器会欣然接受。
    【解决方案3】:

    正如评论所说,这段代码有效:

    if let httpResp: NSHTTPURLResponse = response as? NSHTTPURLResponse {
        // "Mon, 19 Oct 2015 05:57:12 GMT"
        let headerDate = httpResp.allHeaderFields["Last-Modified"] as! String;
    
        // converter
        let dateFormatter = NSDateFormatter();
        dateFormatter.dateFormat = "EEEE, dd LLL yyyy HH:mm:ss zzz";
    
        // your answer
        let serverDate = dateFormatter.dateFromString(headerDate) as NSDate?;
        print("ServerDate: \(serverDate)")
     }
    

    请注意接受答案中的大写 HH而不是 hh

    【讨论】:

      猜你喜欢
      • 2023-03-25
      • 2013-10-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多