Проанализируйте дату ISO8601 в Objective C (iPhone OS SDK)

Как я анализирую "2010-04-30T00:45:48.711127" в NSDate? (и поддержите всю точность),

7
задан bradley.ayers 9 May 2010 в 02:31
поделиться

2 ответа

Ваша работа вырезана за вас.

NSDate выбрасывает любые значения после трех десятичных знаков на секунды. Вы можете создать подкласс NSDate , чтобы сохранить эту точность, но вам также потребуется реализовать свой собственный синтаксический анализ и настраиваемые средства форматирования для ввода и отображения его, поскольку NSDateFormatter и CFDateFormatter , на котором он построен, также усекает точность после трех десятичных знаков. В зависимости от того, что вы делаете, это не должно быть так сложно.

Это простой подкласс (не реализующий NSCoding или NSCopying ), который сохранит всю точность, которую вы ему дадите.

@interface RMPreciseDate : NSDate {
    double secondsFromAbsoluteTime;
}

@end

@implementation RMPreciseDate

- (NSTimeInterval)timeIntervalSinceReferenceDate {
    return secondsFromAbsoluteTime;
}

- (id)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)secsToBeAdded {
    if (!(self = [super init]))
        return nil;

    secondsFromAbsoluteTime = secsToBeAdded;

    return self;
}

@end

Затем вы можете запросить -timeIntervalSince1970 , чтобы получить время эпохи UNIX.

Уже существует класс парсера даты / времени ISO8601 , но, поскольку он использует NSDateComponents для генерации даты, в настоящее время он ограничен точностью до секунды, но вы можете использовать это может быть отправной точкой для создания более точных представлений.

4
ответ дан 7 December 2019 в 16:40
поделиться

Похоже, что NSDate имеет только миллисекундную точность.

#import <Foundation/Foundation.h>

int main (int argc, const char * argv[]) {
    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];

    NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"yyyy-MM-dd'T'hh:mm:ss.SSSSSS"];

    NSDate *date = [dateFormatter dateFromString:@"2010-04-30T00:45:48.711127"];

    NSLog(@"%@", date);

    NSString *string = [dateFormatter stringFromDate:date];

    NSLog(@"%@", string);

    [pool drain];
    return 0;
}

Этот код дает следующий консольный вывод:

Program loaded.
run
[Switching to process 27202]
Running…
2010-05-08 20:02:46.342 TestNSDate[27202:a0f] 2010-04-30 00:45:48 -0700
2010-05-08 20:02:46.344 TestNSDate[27202:a0f] 2010-04-30T12:45:48.711000

Debugger stopped.
Program exited with status value:0.

Так что "2010-04-30T00:45:48.711127", превращающийся в "2010-04-30T00:45:48.711000", вероятно, не то, что вы имели в виду.

-1
ответ дан 7 December 2019 в 16:40
поделиться
Другие вопросы по тегам:

Похожие вопросы: