所以在我的应用程序中,我需要像IF LAG(CUST_ID,1)=CUST_ID AND (BALANCE - LAG(BALANCE,1))>0 THEN FLAG="FLAG=1"
一样处理日期,我认为第一部分代表1970年1月1日的秒数,第二部分是时区。
我不知道如何处理这样的数据并以我们在Xcode 7中使用Swift 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(
和)/
,然后在-
(或+
)之前拆分字符串来处理这种情况。