一尘不染

在iPhone上解析JSON日期

json

原谅我是我不熟悉ObjectiveC。

我从/ Date(xxxxxxxxxxxxx-xxxx)/格式的.NET
Web服务获取日期。我正在寻找有关如何最好地将其解析为NSDate对象的方向。我曾尝试在其上使用dateWithTimeIntervalSince1970,但它返回的日期是1969年,而我知道该日期是2006年。

寻找正确的方法来处理JSON日期的方向。

提前致谢!


阅读 287

收藏
2020-07-27

共1个答案

一尘不染

作为学习Objective-C的.NET程序员,当我尝试使用.Net WebService时,我遇到了同样的问题。

起初我还以为我将能够使用NSDateFormatter
…我发现它的符号一个很好的参考这里,但我很快意识到,我需要的数量从毫秒转换为秒。

我写了代码来做到这一点…我仍在学习Obj-C,但我不认为它应该这么难…

- (NSDate *) getJSONDate{
    NSString* header = @"/Date(";
    uint headerLength = [header length];

    NSString*  timestampString;

    NSScanner* scanner = [[NSScanner alloc] initWithString:self];
    [scanner setScanLocation:headerLength];
    [scanner scanUpToString:@")" intoString:&timestampString];

    NSCharacterSet* timezoneDelimiter = [NSCharacterSet characterSetWithCharactersInString:@"+-"];
    NSRange rangeOfTimezoneSymbol = [timestampString rangeOfCharacterFromSet:timezoneDelimiter];

    [scanner dealloc];

    if (rangeOfTimezoneSymbol.length!=0) {
        scanner = [[NSScanner alloc] initWithString:timestampString];

        NSRange rangeOfFirstNumber;
        rangeOfFirstNumber.location = 0;
        rangeOfFirstNumber.length = rangeOfTimezoneSymbol.location;

        NSRange rangeOfSecondNumber;
        rangeOfSecondNumber.location = rangeOfTimezoneSymbol.location + 1;
        rangeOfSecondNumber.length = [timestampString length] - rangeOfSecondNumber.location;

        NSString* firstNumberString = [timestampString substringWithRange:rangeOfFirstNumber];
        NSString* secondNumberString = [timestampString substringWithRange:rangeOfSecondNumber];

        unsigned long long firstNumber = [firstNumberString longLongValue];
        uint secondNumber = [secondNumberString intValue];

         NSTimeInterval interval = firstNumber/1000;

        return [NSDate dateWithTimeIntervalSince1970:interval];
    }

    unsigned long long firstNumber = [timestampString longLongValue];
    NSTimeInterval interval = firstNumber/1000;

    return [NSDate dateWithTimeIntervalSince1970:interval];
}

希望有人可以提供更好的Obj-C解决方案。如果不是这样,我可能会保留这种情况,或者正在寻找一种方法来更改.NET中的序列化格式

编辑:

关于JSON DateTime格式…如果您对服务有任何控制权,则最好将日期转换为DataContract对象中的字符串。

对我来说,格式化为RFC1123似乎是个好主意。因为我可能可以使用NSDateFormatter轻松地将其拾取。

引用里克·斯特拉尔的话

没有JavaScript日期文字,Microsoft设计了一种自定义日期格式,该格式本质上是一个标记字符串。格式是经过编码的字符串,其中包含标准的新Date(自1970年以来的毫秒)值。

2020-07-27