4

日付をクライアントからサーバーに送信し、再度送信するときに@"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'"@"en_US_POSIX"ロケールの形式を使用して日付を JSON の文字列にフォーマットします。同じフォーマッタはNSDate、サーバーからクライアントに返される日付文字列からのインスタンスを提供します。

変換をテストするために、フォーマッタからの日付を検証するために使用する独立した日付を使用NSDateComponentsおよび生成しようとしています。NSCalendarただし、とNSDateから作成されたインスタンスは、 が提供するインスタンスとはわずかに異なります。私はなぜなのか理解していない。日付が異なれば、差異の数も異なります。さらに別の/質問をお詫びしますが、少し斬新だと思っていただければ幸いです。NSCalendarNSDateComponentsNSDateNSDateFormatterNSDateNSDateFormatter

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
dateFormatter.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
dateFormatter.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];
dateFormatter.dateFormat = @"yyyy-MM-dd'T'HH:mm:ss.SSS'Z'";
dateFormatter.calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];

NSMutableArray *valuesWithError = [NSMutableArray arrayWithCapacity:750];
NSMutableArray *valuesThatMatch = [NSMutableArray arrayWithCapacity:250];

for (NSInteger milliseconds = 0; milliseconds < 1000; milliseconds++) {
    NSString *dateString = [NSString stringWithFormat:@"2001-01-01T00:00:00.%03dZ", milliseconds];
    NSLog(@"%@", dateString);

    NSCalendar *calendar = [[NSCalendar alloc] initWithCalendarIdentifier:NSGregorianCalendar];
    calendar.locale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_US_POSIX"];
    calendar.timeZone = [NSTimeZone timeZoneForSecondsFromGMT:0];

    NSDateComponents *dc = [[NSDateComponents alloc] init];
    dc.year = 2001;
    dc.month = 1;
    dc.day = 1;
    dc.hour = 0;
    dc.minute = 0;
    dc.second = 0;

    NSDate *expectedDate = [calendar dateFromComponents:dc];

    NSTimeInterval baseInterval = [expectedDate timeIntervalSinceReferenceDate];
    double mulitplier = 0.001;
    NSTimeInterval millisecondsToAdd = milliseconds * mulitplier;
    baseInterval += millisecondsToAdd;

    expectedDate = [NSDate dateWithTimeIntervalSinceReferenceDate:baseInterval];

    NSDate *dateFromFormat = [dateFormatter dateFromString:dateString];

    NSTimeInterval expectedDateFromReferenceDate = [expectedDate timeIntervalSinceReferenceDate];
    NSTimeInterval dateFromFormatFromReferenceDate = [dateFromFormat timeIntervalSinceReferenceDate];

    NSTimeInterval differenceByTimeIntervalSubtraction = ABS(expectedDateFromReferenceDate - dateFromFormatFromReferenceDate);

    NSTimeInterval differenceByTimeIntervalFromDate = [expectedDate timeIntervalSinceDate:dateFromFormat];

    if (![expectedDate isEqualToDate:dateFromFormat]) {
        NSLog(@"Difference = %e", differenceByTimeIntervalSubtraction);
        [valuesWithError addObject:@(milliseconds)];
    } else {
        [valuesThatMatch addObject:@(milliseconds)];
    }
}
4

0 に答える 0