7

何年にもわたって、私は一日の終わりのさまざまな解釈に出くわしてきました。 しかし、日付と間隔を比較するとき、それを表現する正しい方法は何ですか?

23:59:59を好む人もいれば、 00:00:00を使用する人もいることがわかりました。ここ StackOverflow では、 24:00:00
の使用と表示に関連する質問の例をいくつか見つけましたが、この質問の範囲は、2 日を分割する方法を決定することに重点を置いています。

言い換えれば、私たちは 1 日がどこで終わり、どこで次の日が始まるかを決定する問題に関心があります。これは、最も基本的な時間間隔の比較や計算さえも必要とする多くのアプリケーションで共通の問題のようです。

上記の解釈を明確にするために、3 つの異なる解釈の下で 2014 年1月 1 日を表す 3 つの例を以下に示します。

  1. 準深夜:2014-01-01 00:00:00 - 2014-01-01 23:59:59
  2. ミッドナイトシャープ:2014-01-01 00:00:00 - 2014-01-02 00:00:00
  3. ミリタリー ミッドナイト:2014-01-01 00:00:00 - 2014-01-01 24:00:00

準真夜中の解釈が最も直感的なものだと私は感じていますが、時間を正しく指すにはかなりの量のボイラープレートが必要なようです. さらに、1 日の最後の 1 秒が正しく処理されない場合にエッジ ケースに遭遇するリスクや、これらのギャップをテストするために間隔の膨大なコレクションをスキャンするときにパフォーマンスに影響を与えるリスクがあります。

同様に、軍の真夜中の解釈も、その分割点の二重表現をセットアップするために定型文を必要とするようです。あまり考えないと、このアプローチを使用して多くの複雑さを考えることができません。

最後に、真夜中の鋭い解釈は、最も一貫性のある解釈の有力な候補のようです。真夜中準とは異なり、時刻を設定する定型文を必要とせず、演算子<<=>およびで自然に動作し>=ます。

2014-01-01 24:00:00PHP 言語がすでにとして解釈していることは注目に値します2014-01-02 00:00:00。これは、日付を真夜中のシャープな解釈に変換する効果があります。

ある解釈を別の解釈よりも使用することを正当化する、模範的な FLOSS ライブラリまたは標準の注目すべき先例はありますか?

4

5 に答える 5

5

00:00:00新しい一日の始まりです。

23:59:59は昔の最後の 1 秒ですが、まだ 1 秒あるので23:59:59.999、昔の最後のミリ秒です。まだ 1 日の終わりではありませんが、まだ 1 ミリ秒残っています。

それはあなたが何をする必要があるかによって異なります。真夜中前にイベントが発生したかどうかを確認したい場合 (たとえば、MySQL データベースにクエリを実行している場合)、<新しい日の開始時のオペレーターが実行します。

>=新しい日に何かが起こったかどうかを確認したい場合は、新しい日の始まりでなければなりません。00:00:00

于 2014-10-07T23:07:15.760 に答える
5

まず、数学から開区間と閉区間を思い出してみましょう。

  • 開区間には終点が含まれず、括弧で示されます。たとえば、(0,1)は 0 より大きく 1 より小さいことを意味します。
  • 閉区間には端点が含まれ、角かっこで示されます。たとえば、[0,1]は 0 以上 1 以下を意味します。

1 日が時間に始まることに異議を唱える人はいないと思います00:00:00.000000...。つまり、その時点より前の秒、ミリ秒、マイクロ秒などは前日になります。

この概念を、左閉右開区間を使用して表現します。そう:

2014 年 1 月 1 日が時をまたがる日["2014-01-01 00:00:00", "2014-01-02 00:00:00")

これは、真夜中のシャープが正しいことを意味します。00:00:00ただし、これには、翌日の直前の非常に小さな時間単位をすべて表すために、マシンに無限の解像度が必要になります。

デジタルシステムは無限の解像度を持つことができないため、準真夜中を認めざるを得なくなり、これは閉じた間隔になります. 正しいエンドポイントの正確な値は、システムの解像度によって異なります。

MikeWが言ったように:

2014 年 1 月 1 日が時をまたがる日
["2014-01-01 00:00:00", "2014-01-02 00:00:00"-system_resolution]

環境/言語/データ構造が 1 秒の解像度しか提供しない場合、1 日の最後の瞬間23:59:59です。1 ミリ秒の分解能の場合、それは23:59:59.999.

したがって、本質的には、準真夜中真夜中シャープの両方が正しいですが、準真夜中のエンドポイントは解像度によって異なります。


実際には、心配する必要はないと思います。DateTime言語が提供する のようなオブジェクト/API と、適切な条件演算子 (疑似コード) を使用するだけです。

if DateTime.Now() < DateTime("2000-01-01 00:00:00"):
    // Worry about Y2K bugs
于 2014-10-07T23:08:15.810 に答える
1

さて、「それを表す正しい方法は何ですか?」主観的な質問ですのでお答えできません。とはいえ、ほとんどの「時計」アプリとシステム時計は、上記の「準真夜中」として表現するため、ユーザーに時間を表現する際に一貫性を持たせたい場合は、おそらくそれを使用する必要があります.

ただし、時間をユーザーに直接表示せず、代わりに他の計算の一部として使用している場合は、アプリケーション固有である可能性があります。

このページこのページでは、時間がいかに問題であるか、およびアプリケーションによって主観的な「正確さ」がどのように得られるかについて、かなりの数の例を示しています。

于 2014-10-07T23:05:34.977 に答える
1

IMO、それは主に * 目前の問題に対して実際にどのような要件があるか、および * 自由に使用できるツール/言語での時間解決に帰着します。

結局のところ、抽象的な言葉で問題を考えすぎるのは非常に簡単です。

そうは言っても、私は個人的には厳密な未満 (<) 00:00:00 を好みます。

于 2014-10-07T23:07:49.360 に答える