如何将日期转换为\ / Date(1440156888750-0700)\ /以及Swift可以处理的内容?

时间:2015-10-16 08:36:44

标签: ios xcode swift date

所以在我的应用程序中,我需要像IF LAG(CUST_ID,1)=CUST_ID AND (BALANCE - LAG(BALANCE,1))>0 THEN FLAG="FLAG=1" 一样处理日期,我认为第一部分代表1970年1月1日的秒数,第二部分是时区。 我不知道如何处理这样的数据并以我们在Xcode 7中使用Swift 2理解的方式显示它?

2 个答案:

答案 0 :(得分:7)

(此答案的先前版本实际上是错误的,它没有正确处理时区。)

根据Stand-Alone JSON Serialization

  

DateTime值以“/ Date(700000 + 0500)/”的形式显示为JSON字符串,其中第一个数字(在提供的示例中为700000)是GMT时区中的毫秒数,常规(非夏令时)1970年1月1日午夜以来的时间。这个数字可能是负数,表示较早的时间。示例中由“+0500”组成的部分是可选的,表示时间属于Local类型 - 也就是说,应该在反序列化时转换为本地时区。如果不存在,则将时间反序列化为Utc。

表示实际数字(本例中为“0500”)及其符号(+或 - )。

Use JSON.NET to parse json date of format Date(epochTime-offset)

  

...在[螺旋格式] [1]中,时间戳部分仍然仅基于UTC。偏移量是额外的信息。它不会更改时间戳。您可以给出不同的偏移量,或者完全省略它,它仍然是同一时刻。

\/Date(1440156888750-0700)\/中的第一个数字是 自格林威治标准时间1970年1月1日“时代”以来的毫秒和时间 区域部分-0700必须简单地忽略。

以下是检查Date Swift 5 扩展方法 具有正则表达式的字符串的有效性 (同时接受或不接受\/Date(...)\//Date(...)/ 时区规范)并转换给定的数量 毫秒到Date

extension Date {
    init?(jsonDate: String) {

        let pattern = #"\\?/Date\((\d+)([+-]\d{4})?\)\\?/"#
        let regex = try! NSRegularExpression(pattern: pattern)
        guard let match = regex.firstMatch(in: jsonDate, range: NSRange(jsonDate.startIndex..., in: jsonDate)) else {
            return nil
        }

        // Extract milliseconds:
        let dateString = jsonDate[Range(match.range(at: 1), in: jsonDate)!]
        // Convert to UNIX timestamp in seconds:
        let timeStamp = Double(dateString)! / 1000.0
        // Create Date from timestamp:
        self.init(timeIntervalSince1970: timeStamp)
    }
}

示例:

let jsonDate = "\\/Date(1440156888750-0700)\\/"
print("JSON Date:", jsonDate)

if let theDate = Date(jsonDate: jsonDate) {
    print("Date:", theDate)
} else {
    print("wrong format")
}

输出:

JSON Date: \/Date(1440156888750-0700)\/
Date: 2015-08-21 11:34:48 +0000

(可以在编辑历史中找到Swift 3和Swift 4的版本。)

答案 1 :(得分:2)

经过一些实验,我想出了以下解决方案:

let dx = "/Date(1440156888750-0700)/"
let timestamp = (dx as NSString).substringWithRange(NSRange(location: 6,length: 13))
let timezone = (dx as NSString).substringWithRange(NSRange(location: 19,length: 5))
let dateIntermediate = NSDate(timeIntervalSince1970: Double(timestamp)! / 1000)

let outp = NSDateFormatter()
outp.dateFormat = "dd.MM.yyyy hh:mm::ssSSS"
outp.timeZone = NSTimeZone(forSecondsFromGMT: 0)

let input = outp.stringFromDate(dateIntermediate) + " " + timezone
let inp = NSDateFormatter()
inp.dateFormat = "dd.MM.yyyy hh:mm::ssSSS Z"

let finalDate = inp.dateFromString(input)
print(finalDate)

让我解释一下:

  • 我们从原始字符串中提取毫秒时间戳和时区
  • 我们从时间戳创建一个日期,以便能够将其拆分为不同的组件
  • 我们以更标准的方式输出该日期(而不是时间戳)并将先前提取的时区附加到该字符串
  • 然后我们读取该字符串并再次从中解析日期

注意
正如@ Phoen1xUK所提到的,时间戳可能的长度不同于13位。您可以通过剥离/Date()/,然后在-(或+)之前拆分字符串来处理这种情况。