0

Web サービスから受け取った日付文字列を解析したいと考えています。ただし、小数部分のある日付と小数部分のない日付を受け取ることがあります。また、日付の 10 進数の桁数が異なる場合もあります。

次の日付を取得したとします。

NSString *dateString = @"2013-07-22T220713.9911317-0400";

小数値を削除するにはどうすればよいですか? 私は最終的にしたい:

 @"2013-07-22T220713-0400";

したがって、10 進数を使用しない DateFormatter で処理できます。

4

2 に答える 2

0

@JeffCompton の提案に基づいて、私はこれをやってしまいました:

+ (NSDate *)dateFromISO8601:(NSString *)dateString {
    if (!dateString) return nil;
    if ([dateString hasSuffix:@"Z"]) {
        dateString = [[dateString substringToIndex:(dateString.length - 1)] stringByAppendingString:@"-0000"];
    }

    NSString *cleanDateString = dateString;

    NSArray *dateComponents = [dateString componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"."]];
    if ([dateComponents count] > 1){
        NSArray *timezoneComponents = [[dateComponents objectAtIndex:1] componentsSeparatedByCharactersInSet:[NSCharacterSet characterSetWithCharactersInString:@"-"]];

        if ([timezoneComponents count] > 1){
            cleanDateString = [NSString stringWithFormat:@"%@-%@", [dateComponents objectAtIndex:0], [timezoneComponents objectAtIndex:1]];
        }
    }

    dateString = [cleanDateString stringByReplacingOccurrencesOfString:@":" withString:@""];
    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    dateFormatter.dateFormat = @"yyyy-MM-d'T'HHmmssZZZ";

    NSDate *resultDate = [dateFormatter dateFromString:dateString];

    return resultDate;
}

これは一部のオープン ソース コードの変更ですが、元のコードへの参照を失いました。

すべての変更の理由は、HH、mm、および ss を区切る : なしで、10 進数の有無にかかわらず日付を取得できる API に接続しているためです。

于 2013-07-29T03:04:22.873 に答える
0

正規表現を使用して、10 進数とそれに続く数字の最初の出現に一致させ、それらを削除できます。

NSString *dateString = @"2013-07-22T220713.9911317-0400";

NSRegularExpression * regExp = [NSRegularExpression regularExpressionWithPattern:@"\\.[0-9]*" options:kNilOptions error:nil];

dateString = [dateString stringByReplacingCharactersInRange:[regExp rangeOfFirstMatchInString:dateString options:kNilOptions range:(NSRange){0, dateString.length}] withString:@""];
于 2013-07-29T02:16:39.640 に答える