在iPhone上解析JSON日期 [英] Parsing JSON dates on IPhone

查看:132
本文介绍了在iPhone上解析JSON日期的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



我正在从/ Date(xxxxxxxxxxxxx-xxxx)/格式的.NET webservice中取回日期。我正在寻找一个关于如何最好地解析为NSDate对象的方向。我试过使用dateWithTimeIntervalSince1970,但它在1969年的一个日期回来,我知道是在2006年。



寻找适当的方向



提前感谢

解决方案

作为.NET程序员学习Objective-C,当我尝试使用.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 = [timampString 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来取代它。



Rick Strahl


没有JavaScript日期文字,微软设计了一个自定义日期格式这本质上是一个标记的字符串。格式是一个编码的字符串,包含标准的新日期(自1970年以来的毫秒)值。



Forgive me as I'm new to Objective C.

I am getting back dates from a .NET webservice in the /Date(xxxxxxxxxxxxx-xxxx)/ format. I'm looking for some direction on how to best parse this into an NSDate object. I've tried using dateWithTimeIntervalSince1970 on it but it comes back with a date in the year 1969 for a date I know is in 2006.

Looking for some direction on the proper way to handle JSON dates.

Thanks in advance!

解决方案

As a .NET programmer learning Objective-C I had the same problem when I tried to consume a .Net WebService.

At first I thought I would be able to use the NSDateFormatter... I found a really good reference for it's symbols here, but I quickly realized that I needed to convert the number from milliseconds to seconds.

I wrote the code to do it... I'm still learning Obj-C but I dont think It should've been this hard...

- (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];
}

Hopefully someone can provide a better Obj-C solution. If not I may keep this or look for a way to change the serialization format in .NET

EDIT:

About that JSON DateTime format... If you have any control on the service it would probably be best to convert the date to a string in your DataContract objects.

Formatting to RFC1123 seems like a good idea to me right now. As I can probably pick it up easily using a NSDateFormatter.

Quote from Rick Strahl

There's no JavaScript date literal and Microsoft engineered a custom date format that is essentially a marked up string. The format is a string that's encoded and contains the standard new Date(milliseconds since 1970) value.

这篇关于在iPhone上解析JSON日期的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆