我该如何将“2010-04-30T00:45:48.711127”解析为NSDate?(并保留所有精度)
NSDate
会将其舍去。你可以创建NSDate
的子类来保存这些精度,但是你还需要实现自己的解析和自定义格式化程序来输入和显示它,因为NSDateFormatter
和建立在其基础上的CFDateFormatter
也会在3位小数点后截断精度。不过,根据你的需求,这并不应该太难。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"
可能不是你想要的。