代码之家  ›  专栏  ›  技术社区  ›  PvDev

如何在Swift 4中获取ISO8601格式?

  •  0
  • PvDev  · 技术社区  · 6 年前

    以下是我的完整控制台输出值: XML: InvalidParameterValue 参数timestamp的值2018-06-15t18%3a43%3a52z无效。原因:必须采用ISO8601格式。66A698A6-A967-4B34-B15A-94780F9287CE

        public func getSearchItem(searchKeyword: String) -> [String:AnyObject]{
          let timeStamp = getTimestamp()
    
        let dateFormatter = DateFormatter()
        dateFormatter.timeZone = TimeZone(identifier: "IST")
        let tempLocale = dateFormatter.locale // save locale temporarily
        dateFormatter.locale = Locale(identifier: "en_US_POSIX") // set locale to reliable US_POSIX
        dateFormatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ssZ"
        let date = dateFormatter.date(from: timeStamp.string(from: Date()))!
        dateFormatter.dateFormat = "dd-MM-yyyy HH:mm:ss"
        dateFormatter.locale = tempLocale // reset the locale
        let dateString = dateFormatter.string(from: date)
        print("EXACT_DATE : \(dateString)")
    
        let url = "http://webservices.amazon.in/onca/xml"
        let parameters: Parameters = ["Service": "AWSECommerceService",
                                      "Operation": "ItemSearch",
                                      "ResponseGroup": "Images,ItemAttributes",
                                      "SearchIndex":"All",
                                      "Keywords": searchKeyword,
                                      "Timestamp": urlEncode(timeStamp.string(from: date)),
                                      "AWSAccessKeyId": urlEncode(ViewController.kAmazonAccessID),
                                      "AssociateTag": urlEncode(ViewController.kAmazonAssociateTag)
                                     ]
    
    
    
        let signedParams = signedParametersForParameters(parameters: parameters as! [String : String])
    
        Alamofire.request(url, method: .get, parameters: signedParams, encoding: URLEncoding.default)
            .responseString { response in
                print(" - API url: \(String(describing: response.request!))")   // original url request
                var statusCode = response.response?.statusCode
    
                switch response.result {
                case .success:
                    print("status code is: \(String(describing: statusCode))")
                    if let string = response.result.value {
                        print("XML: \(string)")
                    }
                case .failure(let error):
                    statusCode = error._code // statusCode private
                    print("status code is: \(String(describing: statusCode))")
                    print(error)
                }
        }
    
    
        return parameters as [String : AnyObject]
    }
    
    func getTimestamp() -> DateFormatter{
        var timestampFormatter = DateFormatter()
        timestampFormatter = DateFormatter()
        timestampFormatter.dateFormat = AWSDateISO8601DateFormat1
        timestampFormatter.timeZone = TimeZone(identifier: "IST")
        timestampFormatter.locale = Locale(identifier: "en_US_POSIX")
        return timestampFormatter
    }
    

    }

    2 回复  |  直到 6 年前
        1
  •  1
  •   Larme    6 年前

    Optional(400) XML: . InvalidParameterValue Value 2018-06-15T18%3A43%3A52Z for parameter Timestamp is invalid. Reason: Must be in ISO8601 format.
    

    问题是关于 : %3A )因为 2018-06-15T18:43:52Z 2018-06-15T18%3A43%3A52Z 不。

    parameters 以下内容:

    "Timestamp": urlEncode(timeStamp.string(from: date))
    

    =>

    "Timestamp": timeStamp.string(from: date)
    

    ISO8601DateFormatter 可以从IOS10+获得,这样可以避免您自己编写格式。

        2
  •  0
  •   Supanat Techasothon    6 年前

    func convertDateToDateString(date: Date, format: String) -> String {
        let dateFormatter = DateFormatter()
        dateFormatter.locale = Locale(identifier: "en_EN")
        dateFormatter.dateFormat = format
        dateFormatter.calendar = Calendar(identifier: .iso8601)
    
        let resultDate = dateFormatter.string(from: date)
        return resultDate
    }