【发布时间】:2015-08-07 09:22:31
【问题描述】:
您好,我知道同样的问题已经被问过好几次了,我已经浏览了几个链接 Link 1、Link 2、Link 3 和 Link 4 等等。
但我仍然没有获得成功,所有解决方案都在 ObjC 中,我需要在 Swift 中执行。假设我的输入是 /Date(1434668400000+0100)/ 预期输出 19/06/2015。
我尝试了下面的代码并将其从 ObjC 转换为 Swift。
Objective-C
+ (NSDate *)mfDateFromDotNetJSONString:(NSString *)string {
static NSRegularExpression *dateRegEx = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
dateRegEx = [[NSRegularExpression alloc] initWithPattern:@"^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$" options:NSRegularExpressionCaseInsensitive error:nil];
});
NSTextCheckingResult *regexResult = [dateRegEx firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
if (regexResult) {
// milliseconds
NSTimeInterval seconds = [[string substringWithRange:[regexResult rangeAtIndex:1]] doubleValue] / 1000.0;
// timezone offset
if ([regexResult rangeAtIndex:2].location != NSNotFound) {
NSString *sign = [string substringWithRange:[regexResult rangeAtIndex:2]];
// hours
seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:3]]] doubleValue] * 60.0 * 60.0;
// minutes
seconds += [[NSString stringWithFormat:@"%@%@", sign, [string substringWithRange:[regexResult rangeAtIndex:4]]] doubleValue] * 60.0;
}
return [NSDate dateWithTimeIntervalSince1970:seconds];
}
return nil;
}
斯威夫特
func dateFromJSON(string: NSString) -> NSDate {
var dateRegEx: NSRegularExpression!
var onceToken: dispatch_once_t = 0
dispatch_once(&onceToken) {
dateRegEx = NSRegularExpression(pattern: "^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$", options: NSRegularExpressionOptions.CaseInsensitive, error: nil)!
}
var regexResult: NSTextCheckingResult = dateRegEx.firstMatchInString(string as String, options: NSMatchingOptions.allZeros, range: NSMakeRange(0, string.length))!
var seconds: NSTimeInterval = (string.substringWithRange(regexResult.rangeAtIndex(1)) as NSString).doubleValue / 1000.0
if regexResult.rangeAtIndex(2).location != NSNotFound {
var sign: NSString = string.substringWithRange(regexResult.rangeAtIndex(2))
seconds += NSString(format: "\(sign)", string.substringWithRange(regexResult.rangeAtIndex(3)) as NSString).doubleValue * 60.0*60.0
seconds += NSString(format: "\(sign)", string.substringWithRange(regexResult.rangeAtIndex(4)) as NSString).doubleValue * 60.0*60.0
}
return NSDate(timeIntervalSince1970: seconds)
}
当我调用函数时
var date = dateFromJSON("/Date(1434668400000+0100)/")
println("Date: \(date)")
输出是
Date: 2015-06-18 23:00:00 +0000
我不明白为什么我会得到 1 天的差价。可能是我在将 ObjC 转换为 Swift 时做错了什么,或者可能是其他原因。
任何帮助将不胜感激。
【问题讨论】:
-
我检查了您的代码及其给出的正确日期,甚至您示例中的
timestamp:1434668400在 GMT 中也是2015-06-18 23:00:00 -
输出时间是格林威治标准时间你是在和你的本地时间比较吗?
-
@HamzaAnsari 我需要 UTC 格式
-
这里的输出是 UTC 和它的正确时间根据你的字符串日期
-
在 Swift 中,不必使用 GCD 将变量创建为单例,只需使用
let关键字let dateRegEx: NSRegularExpression = NSRegularExpression(pattern: "^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$", options: NSRegularExpressionOptions.CaseInsensitive, error: nil)!声明变量,或者 - 如果您真的需要单例 - 懒惰地初始化变量:var dateRegEx: NSRegularExpression = { return NSRegularExpression(pattern: "^\\/date\\((-?\\d++)(?:([+-])(\\d{2})(\\d{2}))?\\)\\/$", options: NSRegularExpressionOptions.CaseInsensitive, error: nil)! }()
标签: objective-c swift date json.net