如何在 swift 4 中获取 ISO8601 格式?
how to get ISO8601 format in swift 4?
我正在使用亚马逊网络服务进行商品搜索。我可以获得时间戳值并转换为 iso 格式。但在控制台输出中显示 Timestamp 无效。原因:必须是ISO8601格式
这是我的完整控制台输出值:
状态码为:可选(400)
XML:
.
InvalidParameterValue
参数时间戳的值 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
}
}
错误是:
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
在 ISO8601 格式中似乎有效,而 2018-06-15T18%3A43%3A52Z
无效。
您在 parameters
:
中添加了逃逸百分比
所以:
"Timestamp": urlEncode(timeStamp.string(from: date))
=>
"Timestamp": timeStamp.string(from: date)
另外,请注意 iOS 中有一个 iOS10+ 提供的 ISO8601DateFormatter
可以避免您自己编写格式。
尝试
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
}
我正在使用亚马逊网络服务进行商品搜索。我可以获得时间戳值并转换为 iso 格式。但在控制台输出中显示 Timestamp 无效。原因:必须是ISO8601格式
这是我的完整控制台输出值:
状态码为:可选(400)
XML:
.
InvalidParameterValue
参数时间戳的值 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
}
}
错误是:
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
在 ISO8601 格式中似乎有效,而 2018-06-15T18%3A43%3A52Z
无效。
您在 parameters
:
所以:
"Timestamp": urlEncode(timeStamp.string(from: date))
=>
"Timestamp": timeStamp.string(from: date)
另外,请注意 iOS 中有一个 iOS10+ 提供的 ISO8601DateFormatter
可以避免您自己编写格式。
尝试
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
}