【问题标题】:Convert string with unknown format (any format) to date将未知格式(任何格式)的字符串转换为日期
【发布时间】:2015-12-12 06:37:08
【问题描述】:

我有包含日期​​字符串的数据。

通常它会在 'Jan. 3, 1966' 类型格式,但由于国际差异,可能并不总是如此。

我需要读取数据并将其转换为标准日期字符串('YYYY-MM-DD')。

基本上这是我目前所拥有的:

var dataString = 'Jan. 3, 1966'  
var dateFormatter = NSDateFormatter()  
dateFormatter.dateFormat = # I DON'T KNOW THE EXACT INPUT FORMAT !
let dateValue = dateFormatter.dateFromString(dataString)  

【问题讨论】:

  • 请添加一些代码 sn-ps 与您的问题示例和您可能尝试过的解决方案。
  • 您希望在代码中处理的其他可能的日期格式值是什么?
  • 我不知道所有可能的变化,但可能是“1966 年 1 月 3 日”或“1966 年 1 月 3 日”或“1966 年 1 月 3 日”。

标签: ios swift nsdate nsdateformatter


【解决方案1】:

Xcode 11.4 • Swift 5.2 或更高版本

您可以按如下方式使用 NSDataDetector:

extension String {
    var nsString: NSString { self as NSString }
    var length: Int { nsString.length }
    var nsRange: NSRange { .init(location: 0, length: length) }
    var detectDates: [Date]? {
        try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
                .matches(in: self, range: nsRange)
            .compactMap(\.date)
    }
}

extension Collection where Iterator.Element == String {
    var dates: [Date] { compactMap(\.detectDates).flatMap{$0}
    }
}

测试:

let dateStrings = ["January 3, 1966","Jan 3, 1966", "3 Jan 1966"]
for dateString in dateStrings {
    if let dateDetected = dateString.detectDates?.first {
        print(dateDetected)
        // 1966-01-03 14:00:00 +0000
        // 1966-01-03 14:00:00 +0000
        // 1966-01-03 14:00:00 +0000
    }
}


let dateStrings = ["January 3, 1966","Jan 3, 1966", "3 Jan 1966"]

for date in dateStrings.dates {
    print(date)
    // 1966-01-03 14:00:00 +0000
    // 1966-01-03 14:00:00 +0000
    // 1966-01-03 14:00:00 +0000
}

【讨论】:

  • 我认为你最好的选择可能是 NSDataDetector
  • 谢谢!你的解决方案很棒。
  • @LeoDabus + 1000 !!甚至像 1959 年 11 月 11 日这样的日期也有效。
  • 神一样的+1!还有救命稻草!
  • 这太神奇了!谢谢。
【解决方案2】:

在 swift 4、xcode 9 中测试

extension String {
        var detectDate: Date? {
            let detector = try? NSDataDetector(types: NSTextCheckingResult.CheckingType.date.rawValue)
            let matches = detector?.matches(in: self, options: [], range: NSMakeRange(0, self.utf16.count))
            return matches?.first?.date
        }
    }

测试:

print("2018-11-04T23:59:00+00:00".detectDate ?? "") // 2018-11-04 10:00:00 +0000

print("2018/11/4".detectDate ?? "") // 2018-11-04 10:00:00 +0000

【讨论】:

  • 这导致了一个错误,例如,4/8/2020 有时会转换为 4 August 而另一个时间被转换为 8 Apr ,因为它不知道哪个是月份,哪个是日期
猜你喜欢
  • 2018-08-30
  • 2020-11-19
  • 1970-01-01
  • 1970-01-01
  • 2020-11-20
  • 2013-12-28
  • 1970-01-01
相关资源
最近更新 更多