調査を行った後、時間を HH:MM の形式で格納するために変数に使用する必要があるメソッドまたはデータ型を見つけることができませんでした。「14:15: 10" ですが、時間を足したり引いたりする必要があるため、これは最善の方法ではないと思います。これdouble
を. 05.45
_05.60
私はJavaのドキュメントを調べましたが、まだそうですが、これを達成する方法が見つからないようです。最も近いのは次date
のような形式ですdd/mm/yyyy hh:mm:ss
Joda Timeを使用します。標準の Java 日付よりもはるかに優れた日付/時刻操作を提供します。内部 JDK クラスを使用する場合は、java.util.Dateを使用します。
Java 8 以降、Instant、ZonedDateTime、LocalDateTime などの日付と時刻に新しい API を使用できます。これにより、サードパーティ ライブラリの Joda 時間の使用が削除されます。また、計算がより簡単かつ正確になります。以下のアドバイスは少し古くなっていますが、まだいくつかの良い点があります。
—————</p>
絶対にすべきでないことは、それらを独自のカスタム形式で保存することです。Unix エポックを表す Long 値を格納します。
DateTime は、コンピュータにとって単なる数値にすぎません。この数値は、1970-01-01 00:00:00 UTC からの秒数 (またはミリ秒) を表します。この日付が普遍的に選択された理由を説明することは、この回答の範囲を超えていますが、Unix Epoch を検索するか、http://en.wikipedia.org/wiki/Unix_timeを読むことでこれを見つけることができます。
これは、DateTime 自体にタイムゾーン情報が保存されていないことも意味します。日付と時刻を考えるときは、この点に留意することが重要です。DateTime オブジェクトの比較などについては、ローカライズやタイムゾーンに関することは何も行われません。時間をフォーマットするとき、つまり人間が読めるようにするとき、または一日の始まりを取得するなどの操作の場合にのみ、タイムゾーンが機能します。
これは、20:11:15 のような時刻を文字列のような形式で保存してはならない理由でもあります。この情報はタイムゾーン情報なしでは意味がないからです。ここで 1 つの例を挙げます。サマータイムから外れたときなど、時計が 1 時間戻された瞬間を考えてみましょう。それはちょうど多くの国で起こりました。文字列 02:30 は何を表していますか? 1つ目か2つ目?
引き算などの計算は、数字と同じように簡単です。例: Date newDate = new Date(date1.getTime() - date2.getTime());
. または、日付に 1 時間を追加しますか?Date newDate = new Date(oldDate.getTime() + 1000 * 60 * 60);
より複雑なものが必要な場合は、すでに提案されているように、Joda 時間を使用することをお勧めします。しかし、ネイティブ ライブラリでもそれを行うことは完全に可能です。
日付/時刻について多くのことを教えてくれたリソースが 1 つあるとすれば、それはhttp://www.odi.ch/prog/design/datetime.phpでしょう。
Java にはjava.sql.Time
、時刻値を処理するための形式があります。インポートして変数を作成するだけです。
import java.sql.Time;
//now we can make time variables
Time myTime;
https://db.apache.org/derby/docs/10.4/ref/rrefsqlj21908.htmlで見ました
あなたのケースに適した答えは、あなたが何をしたいのかによって異なります。
これらはすべて重要であり、時間と日付を表す方法を決定する際の要素となります。
多くの日付計算 (日付間の日数の決定など) やタイムスタンプに基づく並べ替えが必要な場合は、浮動小数点日付形式の使用を検討してください。タイムスタンプに数値形式を使用する利点は、日付の計算と比較/並べ替え操作が簡単になることです。簡単な計算をするだけです。もう 1 つの利点は、float と long がプリミティブ データ型であることです。それらはシリアル化する必要がなく、すでに非常に軽量であり、それらを使用するために必要なものはすべて外部依存関係を必要としません。
タイムスタンプに数値形式を使用することの主な欠点は、人間に優しくないことです。ユーザーが対話できるようにするには、文字列形式との間で変換する必要があります。多くの場合、これは努力する価値があります。参照: Java Calendar API でユリウス日番号を使用するにはどうすればよいですか?
タイムスタンプをユリウス日番号 (JDN) または修正ユリウス日番号 (MJD) として保存することを検討することをお勧めします。どちらも、8 バイトの float を使用して、日付と時刻をミリ秒の精度で表します。これら両方の表示形式との間の変換アルゴリズムは、高度に標準化されています。これらは、数値日付を使用するすべての利点を提供します。さらに、それらは GMT/UTC に対してのみ定義されているため、タイムスタンプはすぐにすぐにタイム ゾーン全体でユニバーサル化できます (適切にローカライズする限り)。
完全なdate
オブジェクトが必要ない場合は、文字列に格納するのが最善の策ですがdate
、便利な便利なメソッドも多数含まれているため、個人的にはお勧めします。オブジェクトから全体として時間を取得しdate
、残りを無視することができます。
日付の「保存」に関しては、long
. これは、システムがそれをどのように認識し、すべての計算がどのように実行されるかです。はい、一部の人が指摘しているように、最終的には文字列を作成して人間が読み取れるようにする必要がありますが、人々が問題に遭遇するのは、フォーマットの観点から日付を考え始めるときです。フォーマットは読みやすさのためであり、計算のためではありません。 java.util.Date
問題をjava.util.Calendar
はらんでいます ( Effective Java、Bloch などはそれについて多くのことを述べています) が、便利な日付操作が必要な場合は依然として標準です。