【问题标题】:Convert .NET JSON date to NSDate (Swift)将 .NET JSON 日期转换为 NSDate (Swift)
【发布时间】:2015-08-07 09:22:31
【问题描述】:

您好,我知道同样的问题已经被问过好几次了,我已经浏览了几个链接 Link 1Link 2Link 3Link 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


【解决方案1】:

在此处检查您的代码生成的结果:

【讨论】:

  • 非常感谢您的澄清,但为什么 println 会返回 UTC 时间?
  • 你是对的,但我需要这个函数来返回 2015 年 6 月 19 日,但它会返回 2015 年 8 月 18 日.. 任何建议。
  • Xcode 调试器以 UTC 格式打印 NSDate,这是默认格式
  • 但在我的申请中我需要 2015 年 6 月 19 日,所以我该怎么办?
  • 你想要你的本地时区是什么时区?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-28
  • 1970-01-01
  • 1970-01-01
  • 2010-12-24
  • 1970-01-01
  • 2011-05-18
相关资源
最近更新 更多