今回は日付型データの比較を取り扱います。日付型データはその変数名を使って直接 If 文等で比較することが出来ます。 数値データの様に日付型データを比較演算子で結んで値の大小等が比較できます。
以下の例は2個の日付型データに 2019/02/01 と 2019/02/02 の異なる日付を設定し、等しいかどうかの判定を If 文で行っています。
簡単な日付型(Date)データの比較
Dim dateWK1 As Date = New DateTime(2019, 2, 1) '2019/02/01 Dim dateWK2 As Date = New DateTime(2019, 2, 2) '2019/02/02 '2個の日時の比較 If dateWK1 = dateWK2 Then Console.WriteLine("dateWK1 と dateWK2 は等しい") Else Console.WriteLine("dateWK1 と dateWK2 は異なる") End If Console.WriteLine("dateWK1:" & dateWK1.ToString("yyyy/MM/dd HH:mm:ss")) Console.WriteLine("dateWK2:" & dateWK2.ToString("yyyy/MM/dd HH:mm:ss"))
実行結果は当然、2個の日付型データが異なっていることが分かります。
dateWK1 と dateWK2 は異なる dateWK1:2019/02/01 00:00:00 dateWK2:2019/02/02 00:00:00
上の例では問題無く判定が行われましたが、以下の例を見て下さい。 上の例の様に、2個の日付型データは変数を Date として宣言し、 最初の変数に Now() 関数で現在日時を設定し、さらにその後10秒待った後で、2個目の変数に現在日時を設定しています。 その後、2個の変数を比較すると、やはり異なっているとの判定がされます。
2個の変数の中身を表示してやれば、最初の時刻から10秒経過した時刻が設定されていることが分かります。
これは当然と言えばそうなのですが、変数が Date 型だからと勘違いして、日付部分しか比較しないのかと考えると ミスが発生します。お恥ずかしい話、私自身も以前にはこれでバグを発生させたことがありました。
日付型(Date)データの比較
'現在日時を取得 Dim dateWK1 As Date = Now() '10秒待つ System.Threading.Thread.Sleep(10 * 1000) '現在日時を取得 Dim dateWK2 As Date = Now() '2個の日時の比較 If dateWK1 = dateWK2 Then Console.WriteLine("dateWK1 と dateWK2 は等しい") Else Console.WriteLine("dateWK1 と dateWK2 は異なる") End If Console.WriteLine("dateWK1:" & dateWK1.ToString("yyyy/MM/dd HH:mm:ss")) Console.WriteLine("dateWK2:" & dateWK2.ToString("yyyy/MM/dd HH:mm:ss")) '日付型データの比較関数 Console.WriteLine("Date.Compare(dateWK1, dateWK2):" & Date.Compare(dateWK1, dateWK2))
上記の処理を実行すると以下の様な表示が、「出力」ウインドウに表示されます。
dateWK1 と dateWK2 は異なる dateWK1:2019/02/06 18:16:49 dateWK2:2019/02/06 18:16:59 Date.Compare(dateWK1, dateWK2):-1
Date 型にはプロパティとして Date というものを持っているのでこれを使うと 純然たる日付のみのデータが取得できますので、日付のみの比較が正しく行えます。 以下のソースは If 文の部分を変更して実行してみました。
日付型(Date)データの日付のみの比較
'現在日時を取得 Dim dateWK1 As Date = Now() '10秒待つ System.Threading.Thread.Sleep(10 * 1000) '現在日時を取得 Dim dateWK2 As Date = Now() '2個の日時の比較 If dateWK1.Date = dateWK2.Date Then Console.WriteLine("dateWK1 と dateWK2 は等しい") Else Console.WriteLine("dateWK1 と dateWK2 は異なる") End If
上記の処理を実行すると以下の様な表示が、「出力」ウインドウに表示されます。
dateWK1 と dateWK2 は等しい
さらに日付型の Compare メソッドを使って比較処理ができます。
Date.Compare( para1, para2 ) ... 「-1, 0, 1」のInteger型の値を返します。 結果の値の意味は以下の通りです。 ・[-1] : para1 < para2 ・[ 0] : para1 = para2 ・[ 1] : para1 > para2
日付型の Compare メソッドでの比較
Dim date0 As New DateTime(2019, 8, 27, 10, 30, 0) Dim date1 As New DateTime(2019, 8, 26, 10, 10, 0) Dim date2 As New DateTime(2019, 8, 27, 10, 15, 0) Dim date3 As New DateTime(2019, 8, 28, 10, 20, 0) ' 日付のみで比較 Console.WriteLine("Compare(date1.Date, date0.Date) = {0}", Date.Compare(date1.Date, date0.Date)) Console.WriteLine("Compare(date2.Date, date0.Date) = {0}", Date.Compare(date2.Date, date0.Date)) Console.WriteLine("Compare(date3.Date, date0.Date) = {0}", Date.Compare(date3.Date, date0.Date)) ' 日付の時刻を含み比較 Console.WriteLine("Compare(date1, date0) = {0}", Date.Compare(date1, date0)) Console.WriteLine("Compare(date2, date0) = {0}", Date.Compare(date2, date0)) Console.WriteLine("Compare(date3, date0) = {0}", Date.Compare(date3, date0))
上記の処理を実行すると以下の様な表示が、「出力」ウインドウに表示されます。
Compare(date1.Date, date0.Date) = -1 Compare(date2.Date, date0.Date) = 0 Compare(date3.Date, date0.Date) = 1 Compare(date1, date0) = -1 Compare(date2, date0) = -1 Compare(date3, date0) = 1
DateTime型の CompareTo メソッドを使っても同様の結果が得られます。
DateTime型の CompareTo メソッドでの比較
Dim date0 As New DateTime(2019, 8, 27, 10, 30, 0) Dim date1 As New DateTime(2019, 8, 26, 10, 10, 0) Dim date2 As New DateTime(2019, 8, 27, 10, 15, 0) Dim date3 As New DateTime(2019, 8, 28, 10, 20, 0) ' さらにDateTime型のCompareToを利用 Console.WriteLine("date1.Date.CompareTo(date0.Date) = {0}", date1.Date.CompareTo(date0.Date)) Console.WriteLine("date2.Date.CompareTo(date0.Date) = {0}", date2.Date.CompareTo(date0.Date)) Console.WriteLine("date3.Date.CompareTo(date0.Date) = {0}", date3.Date.CompareTo(date0.Date))
関連する記事
⇒日付型データの使い方 :[Date,DateTime]⇒日付型データの使い方(月末、年末の日付取得)
コメント