使用 DateFormatter 解析深奥的日期字符串

Posted

技术标签:

【中文标题】使用 DateFormatter 解析深奥的日期字符串【英文标题】:Using DateFormatter to parse an esoteric date string 【发布时间】:2017-03-01 01:59:28 【问题描述】:

我想使用 Foundation 的 DateFormatter 来解析格式相当奇怪的日期字符串 /Date(1488335133000+0100)/(代表 2017-03-01 03:25:33)。据我所知,这将日期描述为自 1970 年以来的毫秒数,并指定了 GMT+1 时区。

但是,我找不到将毫秒或秒的格式字符串指定为 unix 时间戳的方法。这甚至可能吗?

如果不可能,正确解析此日期的最佳选择是什么?我目前正在尝试拆分字符串,直到获得毫秒和时区,将毫秒除以 1000 并通过Date(timeIntervalSince1970: seconds) 创建一个新的日期对象。不太确定时区应该如何发挥作用。

【问题讨论】:

【参考方案1】:

DateFormatter 无法处理。使用NSRegularExpression 拆开组件:

let str = "/Date(1488335133000+0100)/"

let regex = try! NSRegularExpression(pattern: "/Date\\((\\d+)(\\+|-)(\\d2)(\\d2)\\)/", options: [])
if let match = regex.firstMatch(in: str, options: [], range: NSMakeRange(0, str.characters.count)) 
    let nsstr = str as NSString
    let millisecond = Double(nsstr.substring(with: match.rangeAt(1)))!
    let sign        = nsstr.substring(with: match.rangeAt(2))
    let hour        = Double(nsstr.substring(with: match.rangeAt(3)))!
    let minute      = Double(nsstr.substring(with: match.rangeAt(4)))!

    let offset = (sign == "+" ? 1 : -1) * (hour * 3600.0 + minute * 60.0)
    let date   = Date(timeIntervalSince1970: millisecond / 1000 + offset)

    print(date)

【讨论】:

抱歉,我花了一些时间才回到这里。非常感谢您的帮助,使用正则表达式来匹配它比我以前尝试过的要干净得多。谢谢!

以上是关于使用 DateFormatter 解析深奥的日期字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何使用包含友好日期和月份的 DateFormatter 格式化日期

使用 DateFormatter().date(from: String) 时返回的日期格式化程序

字符串到日期的转换有时会使用 DateFormatter 返回 nil

Dateformatter 返回零日期

DateFormatter 不转换特定日期 (Swift)

在 iphone 中找不到正确的日期格式化程序 (DateFormatter)