在iPhone上解析JSON日期 [英] Parsing JSON dates on IPhone
问题描述
我正在从/ 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来取代它。
没有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:×tampString];
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屋!