source

IPhone에서의 JSON 날짜 해석

gigabyte 2023. 3. 25. 11:21
반응형

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:&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 솔루션을 제공할 수 있기를 바랍니다.그렇지 않은 경우는, 이것을 보관해 두거나, 의 시리얼화 형식을 변경하는 방법을 찾을 수 있습니다.그물

편집:

그 JSON Date Time 형식에 대해서...서비스를 제어할 수 있는 경우 날짜를 DataContract 개체의 문자열로 변환하는 것이 가장 좋습니다.

RFC1123에 준거한 포맷은 현재로선 좋은 생각인 것 같습니다.NSDateFormatter를 사용하면 쉽게 픽업할 수 있기 때문입니다.

Rick Strahl에서 인용

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

반응형