Как я анализирую "2010-04-30T00:45:48.711127" в NSDate? (и поддержите всю точность),
Ваша работа вырезана за вас.
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
для генерации даты, в настоящее время он ограничен точностью до секунды, но вы можете использовать это может быть отправной точкой для создания более точных представлений.
Похоже, что 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"
, вероятно, не то, что вы имели в виду.