IPhone에서의 JSON 날짜 해석
Objective C는 처음이라 죄송합니다.
로부터 날짜가 돌아오고 있습니다./Date(xxxxxxxxxxxx-xxxx)/ 형식의 NET 웹 서비스.이것을 NSDate 객체로 해석하는 최적의 방법을 찾고 있습니다.date With Time을 사용해 보았습니다.1970년부터 인터벌인데 1969년 날짜로 2006년 날짜로 되어 있어요.
JSON 날짜를 적절하게 처리할 수 있는 방법을 찾고 있습니다.
잘 부탁드립니다!
iOS 4.0+용으로 작성했습니다(NSRegular Expression을 사용하기 때문입니다).시간대 간격띄우기가 있거나 없는 날짜를 처리합니다.꽤 효과가 있는 것 같은데, 어떻게 생각해?
+ (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;
}
공식 JSON이 아니기 때문에 날짜 형식을 지원하지 않는 json-framework를 사용하는 것은 같은 처지였습니다.제 소스는 JSON을 사용하여 구축된 API입니다.그물. 이게 내가 생각해낸 거야.
- (NSDate*) getDateFromJSON:(NSString *)dateString
{
// Expect date in this format "/Date(1268123281843)/"
int startPos = [dateString rangeOfString:@"("].location+1;
int endPos = [dateString rangeOfString:@")"].location;
NSRange range = NSMakeRange(startPos,endPos-startPos);
unsigned long long milliseconds = [[dateString substringWithRange:range] longLongValue];
NSLog(@"%llu",milliseconds);
NSTimeInterval interval = milliseconds/1000;
return [NSDate dateWithTimeIntervalSince1970:interval];
}
저는 당신이 하는 날짜 형식의 첨부 부분을 가지고 있지 않기 때문에 위의 답변과 같이 대응하지 않았습니다.오류도 없고, 이 시점에서는 전혀 생소합니다.
NSRegularExpression을 사용한 스니펫은 실제로 매우 유용하다는 것을 알게 되었습니다. NSharecterSet을 사용하여 밀리초를 단축하는 다른 솔루션을 생각해 내기 전까지는 말이죠.
+ (NSDate*) dateFromJSONString:(NSString *)dateString
{
NSCharacterSet *charactersToRemove = [[ NSCharacterSet decimalDigitCharacterSet ] invertedSet ];
NSString* milliseconds = [dateString stringByTrimmingCharactersInSet:charactersToRemove];
if (milliseconds != nil && ![milliseconds isEqualToString:@"62135596800000"]) {
NSTimeInterval seconds = [milliseconds doubleValue] / 1000;
return [NSDate dateWithTimeIntervalSince1970:seconds];
}
return nil;
}
수동 문자열 처리를 대폭 줄이고 코드를 더욱 깔끔하게 만듭니다.
.NET 프로그래머로서 Objective-C를 학습하면서를 소비하려고 했을 때도 같은 문제가 있었습니다.넷 웹 서비스
처음에는 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:×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];
}
누군가 더 나은 Obj-C 솔루션을 제공할 수 있기를 바랍니다.그렇지 않은 경우는, 이것을 보관해 두거나, 의 시리얼화 형식을 변경하는 방법을 찾을 수 있습니다.그물
편집:
그 JSON Date Time 형식에 대해서...서비스를 제어할 수 있는 경우 날짜를 DataContract 개체의 문자열로 변환하는 것이 가장 좋습니다.
RFC1123에 준거한 포맷은 현재로선 좋은 생각인 것 같습니다.NSDateFormatter를 사용하면 쉽게 픽업할 수 있기 때문입니다.
JavaScript 날짜 리터럴은 없으며 Microsoft는 기본적으로 마크업된 문자열인 커스텀 날짜 형식을 개발했습니다.형식은 인코딩된 문자열로, 표준 새 날짜(1970년 이후 밀리초) 값을 포함합니다.
이론: MS는 1970년부터 JSON의 C# Date Time을 밀리초로 부호화했습니다.솔루션:
NSString*
dateAsString = @"/Date(1353720343336+0000)/";
dateAsString = [dateAsString stringByReplacingOccurrencesOfString:@"/Date("
withString:@""];
dateAsString = [dateAsString stringByReplacingOccurrencesOfString:@"+0000)/"
withString:@""];
unsigned long long milliseconds = [dateAsString longLongValue];
NSTimeInterval interval = milliseconds/1000;
NSDate* date = [NSDate dateWithTimeIntervalSince1970:interval];
이것이 내가 생각할 수 있는 가장 빠른 해결책이다.
-(NSString*)convertToUTCTime:(NSString*)strDate{
NSDate *currentDate = [NSDate date];
myDate = [commonDateFormatter dateFromString: strDate];
NSTimeInterval distanceBetweenDates = [currentDate timeIntervalSinceDate:myDate];
return [self stringFromTimeInterval:distanceBetweenDates];
} - (NSString *) string From Time간격:(NSTime)간격){ NSInterger ti = (NSInterger) 간격, NSInterger 분 = (ti / 60) % 60, NSInterger 시간 = (ti / 3600);
if (hours > 24) {
NSInteger days = hours/24;
if (days > 30) {
NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
[dateFormatter setDateFormat:@"EEE d MMM, h:mm a"];
//[dateFormatter setTimeZone:[NSTimeZone timeZoneWithName:@"IST"]];
NSString *daydate = [dateFormatter stringFromDate:myDate];
return daydate;
}
else{
return [NSString stringWithFormat:@" %2ldd",(long)days];
}
}else{
if (hours == 0 && minutes < 1) {
return [NSString stringWithFormat:@"Today"];
}
else if (hours == 0 && minutes < 60){
return [NSString stringWithFormat:@"%2ldm ",(long)minutes];
}
else{
return [NSString stringWithFormat:@" %2ldh",(long)hours];
}
}
}
언급URL : https://stackoverflow.com/questions/1757303/parsing-json-dates-on-iphone
'source' 카테고리의 다른 글
MongoDB를 사용하여 하위 문서의 배열을 필터링하는 방법 (0) | 2023.04.04 |
---|---|
false 체크 (0) | 2023.03.25 |
Go 구조를 JSON으로 변환하는 중 (0) | 2023.03.25 |
$.ajax 오류가 타임아웃인지 확인합니다. (0) | 2023.03.25 |
angular.js에 history.back()을 구현하는 방법 (0) | 2023.03.25 |