5

これは私が試したことです:

DateTime now = DateTime.Now;
long timeA = now.ToBinary();
long timeB = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond).ToBinary();

Debug.WriteLine("{0} {1}", timeA, timeB);

これは出力です:

-8588637543837682554 634734565017110000

timeAtimeBは本質的に同じものである必要がありますが、完全に異なる(負の)バイナリに変換されます。

なぜこれが起こるのですか?ToBinary()直接呼び出すとDateTime.Now異なる結果が得られるのはなぜですか?

編集:私の問題が誤解された(したがって反対票を投じられた)ので、私は実際の質問をよりよく表すように私の投稿を修正しました。問題はDateTime.Kindにあり、それが実際の問題であり、2つの連続するDateTime.Now呼び出しの小さな違いではありませんでした。

4

5 に答える 5

11

2つの値は異なりKind、種類も。によってシリアル化されToBinaryます。

DateTime.Nowhas Kind == DateTimeKind.Local、で作成するDateTimeはnew DateTime(...)hasKind == DateTimeKind.Unspecifiedです。new DateTime(...)別の種類が必要な場合は、別のオーバーロードを使用できます。

于 2012-05-24T09:59:49.933 に答える
6

それらは同じDateTime値ではないので、これは予想されます。

同じ値で作業するには、一度だけ呼び出してから再利用するDateTime必要があります。DateTime.Now

var now = DateTime.Now;
long timeA = now.ToBinary();
long timeB = new DateTime(now.Ticks, now.Kind).ToBinary();;

Console.WriteLine(timeA);
Console.WriteLine(timeB);
于 2012-05-24T09:58:11.520 に答える
3

まず、を使用DateTime.FromBinary()して同じDateTimeオブジェクトを再度(再)作成する必要があります。

しかし、これは、現地の時差によって引き起こされる元のオブジェクトとも異なる場合があります。これを詳細に説明しているこのMSDNの記事をご覧ください。

于 2012-05-24T10:02:57.877 に答える
2

わかりました、まず、2 つの DateTime の が異なりKindます。 DateTime.Nowは Kind Local で、2 番目は Kind Unspecified です。

var now = DateTime.Now;
var timeA = now.ToBinary();
var dateB = new DateTime(now.Year, now.Month, now.Day, now.Hour, now.Minute, now.Second, now.Millisecond, now.Kind);
var timeB = dateB.ToBinary();
Console.WriteLine(timeA);
Console.WriteLine(timeB);

これにより、異なる結果が生成されます。

-8588637530157241842
-8588637530157245808

ティックを使用すると正しい結果が得られますが、これはティックがミリ秒よりもさらに正確な 100 ナノ秒間隔を使用するためです。

ミリ秒は指定できる最小値ですが、最小の内部変数ではありません。

var dateB = new DateTime(now.Ticks, now.Kind);
于 2012-05-24T10:06:15.377 に答える
0

DateTimeの2つの呼び出しの間に、ミリ秒が経過すると、2つの値が異なります。

于 2012-05-24T09:59:39.607 に答える