【问题标题】:Convert date string to date object将日期字符串转换为日期对象
【发布时间】:2020-05-21 08:28:12
【问题描述】:

实际字符串 - January 31, 2020 at 11:59:59 p.m. (ET). 格式 - "MMMM d, yyyy 'at' hh:mm:ss aa" 无法将此字符串转换为 Date 对象。尝试了各种日期格式,但无法将字符串更改为 Date 对象。 请帮忙

【问题讨论】:

  • 你能展示一下到目前为止你尝试了什么吗?
  • @Rob 尝试更改时区、区域设置、日历所有内容
  • 没有@Afsaredrisy,我已经提到过这个字符串值需要转换成日期对象。
  • 我认为 DateFormatter 无法理解输入字符串的“p.m. (ET)”部分。这就是它无法将此字符串转换为 Date 对象的原因。
  • 你确定下午需要吗?

标签: ios swift dateformatter


【解决方案1】:

您可以删除pm 之间的非标准字符. 并转义时区周围的括号

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)

【讨论】:

  • 设置自定义上午和下午符号会更容易formatter.pmSymbol = "p.m."stackoverflow.com/a/31469237/2303865
  • @LeoDabus 是的,我知道,但这考虑到ampm
  • 考虑到这是一种自定义格式,它不应该改变
  • 使用NSDataDetector怎么样?我们不必使用下午。 & p.m 和括号...
  • 在操场上我可以将此字符串转换为日期对象,但在项目中我不能。此外,我在东部时间下午将它们全部删除,但日期字符串仍未转换为日期对象。
【解决方案2】:
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 的如果我对时区完全满意,请回答。但时区在以字符串形式表示时是如此不一致且令人惊讶的非标准化,因此我宁愿专用一种机制来获取它并确保它是有效的。

也就是说,这是我从哪里开始的一个相对粗略的例子——一个完成的版本会更加细致入微。在本例中,如果时区失败,则函数失败。

【讨论】:

    猜你喜欢
    • 2020-11-30
    • 2011-03-07
    • 2012-01-28
    • 1970-01-01
    • 2011-10-25
    • 2022-01-11
    • 2016-05-24
    • 2013-03-07
    相关资源
    最近更新 更多