实际字符串-January 31, 2020 at 11:59:59 p.m. (ET).
格式-"MMMM d, yyyy 'at' hh:mm:ss aa"
无法将此字符串转换为Date对象。尝试了各种日期格式,但无法将字符串更改为Date对象。
请帮忙
答案 0 :(得分:1)
您可以删除.
和p
之间的非标准字符m
,并在时区周围转括号
let dateString = "January 31, 2020 at 11:59:59 p.m. (ET)"
let trimmedDateString = dateString.replacingOccurrences(of: ".m.", with: "m")
let formatter = DateFormatter()
formatter.locale = Locale(identifier: "en_US_POSIX")
formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a (v)"
let date = formatter.date(from: trimmedDateString)
答案 1 :(得分:0)
let raw = "January 31, 2020 at 11:59:59 p.m. (ET)"
func getDateFrom(_ raw: String) -> Date? {
if let i = (raw.range(of: "(")?.lowerBound) { // get index of open parenthesis
var zone: TimeZone?
let dateString = String(raw.prefix(upTo: i)) // January 31, 2020 at 11:59:59 p.m.
let zoneString = String(raw.suffix(from: i)) // (ET)
switch zoneString { // determine time zone
case "(ET)", "(EST)", "(EDT)": // study your data source and learn how they may express time zones
zone = TimeZone(abbreviation: "EDT")
default:
return nil // failure
}
let formatter = DateFormatter()
formatter.dateFormat = "MMMM d, yyyy 'at' hh:mm:ss a"
formatter.timeZone = zone
formatter.amSymbol = "a.m."
formatter.pmSymbol = "p.m."
if let date = formatter.date(from: dateString) {
return date
} else {
return nil
}
} else {
return nil
}
}
if let date = getDateFrom(raw) {
print(date) // 2020-02-01 04:59:59 +0000
}
这应该是一个很好的起点。有多种方法可以执行此操作,例如,如果无法确定时区是否希望它失败,如何提取时区(使用缩写,标识符,格林尼治标准时间(GMT)的秒数)等。我喜欢vadian的如果我对时区完全满意,请回答。但是,时区以字符串表示时是如此不一致并且令人惊讶地没有标准化,我宁愿使用一种机制来获取它并确保它是有效的。
也就是说,这是一个我将要开始的地方的相对粗略的例子-完成的版本会更加细微。在此示例中,如果时区失败,则功能失败。