0

アップデート 3 がおそらく最も関連性が高いことに注意してください

NSTimeIntervalを使用して nsdate オブジェクトを使用して管理対象オブジェクトのプロパティを設定していますsetValue:forKey:

値を取得しようとすると、実行時に奇妙なものが得られます

NSLog(@"[managedObject valueForKey:@\"startTime\"] : %@, [NSDate dateWithTimeIntervalSince1970:[managedObject startTime]]: %@",
[managedObject valueForKey:@"startTime"],[NSDate dateWithTimeIntervalSince1970:[managedObject startTime]]);

戻り値

[managedObject valueForKey:@"startTime"] : 2012-07-14 08:13:05 +0000,
[NSDate dateWithTimeIntervalSince1970:[managedObject startTime]]: 1981-07-14 08:13:05 +0000

更新 1
によって返される値[managedObject valueForKey:@"startTime"]は正しいです。ただし[NSDate dateWithTimeIntervalSince1970:[managedObject startTime]]、より強く型付けされるように、または同様のものを使用することをお勧めします。

[managedObject startTime]間違った値 =>を返すと思います363954111.000000
ただし、次のように設定します。

managedObject setValue:1342261311 forKey:@"startTime"

[managedObject valueForKey:@"startTime"]正しい NSDate オブジェクトを返すため、これが間違っているかどうかはわかりません。

更新 2
KVC と.構文によって返される double 値をログに記録しました。

managedObject.startTime = 363954111.000000
valueForKey timeIntervalSince1970 = 1342261311.000000

更新 3
わかりました、テストをセットアップしました。開始時間はこのように設定されentity.startTime = [[NSDate dateWithTimeIntervalSince1970:1342261311] timeIntervalSince1970];、終了時間はこのように設定されています[entity setValue:[NSDate dateWithTimeIntervalSince1970:1342261311] forKey:@"endTime"];

それらをログに書き込むと、これが得られますstart = 1342261311.000000, end = 363954111.000000

NSDate オブジェクトが正しくアンラップされているようですが、これを見た人はいますか?

4

4 に答える 4

2

ここでの問題は、valueForKey:がオブジェクト値で使用されることを意図しており、実際にはid.

便宜上、valueForKey:プリミティブ型 (integer や double など) をNSNumber対応する型にラップします。

2 つの異なる値が表示される理由は、 が をvalueForKey:返すためです。これは、基本的に が格納されているidメモリ内の位置へのポインタです。NSNumber次に、コードはこの任意のメモリアドレスを取得し、何らかの方法でそれを double として解釈し、それから を構築NSDateします。

startTime一方、アクセサ メソッドを直接呼び出すと、double何も苦労せずに が返されます。

を使用する場合はvalueForKey:、次のようにして実際の値を取得できます。

NSTimeInterval tiv = [[managedObject valueForKey:@"startTime"] doubleValue];

そしてそこから作業します。

コンパイラがこれについて警告を出さないことに、私は実際に少し驚いています。Apple の最新のコンパイラは、このような問題の検出に非常に長けています。

于 2012-07-14T10:22:46.013 に答える
1

時代の違いが問題でした。NSDate は 2001 年 1 月 1 日をエポックとして使用します。そのため、値を取得していたときは、UNIX エポック (1970 年) を使用していました。それが私に価値観の違いをもたらしました。

KVC が NSTimeInterval を NSDate オブジェクトでアンラップおよびラップする場合、NSDate 2001 エポックが使用されます。

したがって、使用する代わりに、値を取得するときdateWithTimeIntervalSince1970 に使用dateWithTimeIntervalSinceReferenceDateしました。

于 2012-07-15T06:48:47.803 に答える
0

startTime が (NSDate ではなく) NSTimeInterval である場合、double オブジェクトと NSDAte オブジェクトの 2 つの異なるものを比較しています。

[managedObject valueForKey:@"startTime"]プリミティブである NSTimeInterval を返します(ちなみに %f で出力する必要があります)。

[NSDate dateWithTimeIntervalSince1970:[managedObject startTime]]NSDate を返します。

本当に 2 つを比較したい場合は、 を使用[NSDate dateWithTimeIntervalSince1970:[managedObject valueForKey:@"startTime"]]して 2 つの NSDate オブジェクトを適切に比較する必要があります。

于 2012-07-14T09:46:25.387 に答える
0

NSTimeIntervaldouble の typdef です

typedef double NSTimeInterval;

スカラーをコア データに直接格納することはできませんが、スカラーを でラップするか、NSNumber または を使用する方が簡単な場合がありますNSDate

于 2012-07-14T08:47:52.287 に答える