7

如何将“2010-04-30T00:45:48.711127”解析为 NSDate?(并保持所有精度)

4

3 回答 3

4

你有你的工作为你完成。

NSDate将丢弃任何超过小数点后 3 位的值秒。您可以创建一个子类NSDate来保持该精度,但您还需要实现自己的解析和自定义格式化程序来输入和显示它,因为它所构建的NSDateFormatterandCFDateFormatter也会将精度截断到小数点后 3 位。取决于你在做什么,虽然这不应该那么难。

这是一个简单的子类(未实现NSCodingor 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用于生成其日期,因此目前仅限于整秒精度,但您可以将其用作起点,或许可以创建更精确的表示。

于 2010-05-09T07:24:28.757 回答
0

对于类似的情况,我将尝试使用这个 ISO 8601 解析器和解析器:http: //boredzo.org/iso8601parser/

于 2011-03-29T01:11:58.330 回答
-1

似乎 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"可能不是你想的那样。

于 2010-05-09T03:04:17.350 回答