「2010-04-30T00:45:48.711127」を NSDate に解析するにはどうすればよいですか? (そしてすべての精度を維持します)
3 に答える
あなたはあなたのためにあなたの仕事を切り取っています。
NSDateは、小数点以下 3 桁を超える値を秒単位で破棄します。その精度を保持するために のサブクラスを作成できますが、それをNSDate入力して表示するには、独自の解析とカスタム フォーマッタを実装する必要もあります。あなたが何をしているかにもよりますが、それはそれほど難しいことではありません。NSDateFormatterCFDateFormatter
これは単純なサブクラス ( 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
次に、-timeIntervalSince1970UNIX エポック時間を取得するように要求できます。
ISO8601 日付/時刻パーサー クラスは既に存在しますが、日付を生成するために使用しNSDateComponentsているため、現在は 1 秒の精度に制限されていますが、おそらくより正確な表現を作成するための出発点として使用できます。
同様の状況で、この ISO 8601 パーサーとアンパーサーを試してみます: http://boredzo.org/iso8601parser/
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"はおそらくあなたが考えていることではありません。