日付と時刻を表すための最小バイト数はどれくらいですか?

byte c# date datetime time
日付と時刻を表すための最小バイト数はどれくらいですか?

TCP / IPを介して、現在のオペレーティングシステムの日付と時刻をマイクロ秒の精度でパーティーAからパーティーBに転送する必要があります。

  • これを表すために使用できる最小バイト数は何ですか
    精度を犠牲にすることなく?

  • そして、C#を使用して日付と時刻をバイト形式に変換する方法は?

  2  0


ベストアンサー

ビットの最小数は、一定の時点からマイクロ秒を使用することです。 ただし、これを行うと、将来のある時点でタイムスタンプがオーバーフローします。

たとえば、昨日などの特定の時点を選択した場合。 昨日から来週中旬までの時間をエンコードするには5バイトで十分です。

しかし、これは不必要に複雑に思えます。 `DateTime.Tick`は8バイトのスペースのみを使用します。 マイクロ秒の1/10の精度であり、記録されたすべての人の歴史にまたがり、定義された時点(1月1日1年)を参照します。最も重要なのは、その_標準_

9


DateTime.Tickは、日時のバイナリ形式表現です

1


どうやらDateTime.Ticksは、0001年からナノ秒レベルまでの時間を表すことができます。 上記のポスターによると、8バイトのスペースが必要です。

ただし、0000年から9999年までのすべてのマイクロ秒の最小表示を取得するには、次のように計算できます。

9999年* 365日* 24時間* 60分* 60秒* 1000000マイクロ秒
= 525547400000

ln(上記の数値)/ ln(2)= 52.22274 .. -53ビット

53ビット= 6.5バイト。

そのため、非標準の表現を使用してバイトを保存できます(基本的には、ナノ秒を表す必要がないため保存できます)。

変換ルーチンの作成は非常に簡単です。 各日付、時刻、ミリ秒を、0000年の始まりから9999年の間に適切なミリ秒に変換するだけです。 日付時刻を再び取得するには、逆の計算を行うだけです。 簡単に理解できるはずです。

ただし、作業、潜在的なバグ、非標準化、メンテナンス、ドキュメントなどに値する1バイトを節約することは非常に疑問です。 etc.

1


*常に*マイクロ秒を含む場合は、既に説明したように固定バイト数を使用することもできますが、これが*汎用*シリアル化である場合は、多くの通常の値に日付または時間があるという事実を活用することができます値。 protobuf-netの場合、スケール(日、時間、分、秒、ミリ秒、またはティック)をマークし、指定された時間と任意のエポック(1970年1月1日)の間の[何でも]の整数を送信します。 これをさらに最小限に抑えるために、整数は可変長エンコーディングで渡され、最も一般的な値を非常に便利に渡すことができます。 これにより、日付値などを最小限のバイト数で送信できます。

1


ラリー・ワタナベの答えに問題があります。

実際、_single_バイトを使用してマイクロ秒単位で時間を表すことができます。 エポックの開始から255マイクロ秒以内の時間しか表すことができません。これは、他の要件によっては重要な制限となる場合もあれば、そうでない場合もあります。

1


回答:無限のバイト数。

理由:ジョン・クノラーの答えをご覧ください。 基本的に、有限数のビットを選択した場合、有限数の時点のみを表すことができます。 時間は過去と未来に無限に広がるため、時間内にいくつかの(実際には無限の数の)インスタンスを表すことはできません。

これは良いインタビューの質問でしょう:)

0


タイトルとURLをコピーしました