日付検索で23:59:59まで選択する方法

タグの編集
投稿者 db  (社会人) 投稿日時 2017/8/7 15:07:29
visualstudio2012のwindowsフォーム作成であるプログラムを作成しています。
DateTimePickerを使用して何日(DateTimePicker1)~何日(DateTimePicker2)と日付検索ができるようにしています。
ですが、~何日(DateTimePicker2)の方でその日のyyyy/MM/dd 0:00:01以降のデータが表示できない状態になってしまっています。
DateTimePicker2でyyyy/MM/dd 23:59:59まで指定をしたいのですがどこにどう記述したらよろしいのでしょうか??
お願いします。
投稿者 (削除されました)  () 投稿日時 2017/8/7 15:45:00
(削除されました)
投稿者 魔界の仮面弁士  (社会人) 投稿日時 2017/8/7 15:47:06
> その日のyyyy/MM/dd 0:00:01以降のデータが表示できない状態になってしまっています。

こちらでは再現しません。
「そういう動作をするコード」をどこかに仕込んでしまってはいませんか?

Imports System.ComponentModel
Public Class Form1
    Private WithEvents Label1 As Label
    Private WithEvents Dtp1, Dtp2 As DateTimePicker

    Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
        Label1 = New Label() With {.Location = New Point(8, 8), .Text = "Label1", .AutoSize = True}
        Dtp1 = New DateTimePicker() With {.Location = New Point(8, 50)}
        Dtp2 = New DateTimePicker() With {.Location = New Point(8, 90)}

        Dtp1.Format = DateTimePickerFormat.Custom
        Dtp1.CustomFormat = "yyyy/MM/dd HH:mm:ss"

        Dtp2.Format = DateTimePickerFormat.Custom
        Dtp2.CustomFormat = "yyyy/MM/dd HH:mm:ss"

        Me.Controls.AddRange(New Control() {Label1, Dtp1, Dtp2})

        Dtp1.Value = New DateTime(2017, 8, 1)
        Dtp2.Value = New DateTime(2017, 8, 31, 23, 59, 59)
    End Sub

    Private Sub Dtp_ValueChanged(sender As Object, e As EventArgs) Handles Dtp1.ValueChanged, Dtp2.ValueChanged
        Label1.Text = Dtp1.Value.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & "から" & vbNewLine _
                    & Dtp2.Value.ToString("yyyy/MM/dd HH:mm:ss.fffffff") & "まで"
    End Sub

#Region "自・至を逆に入力させたくない場合"
    'Private Sub Dtp1_ValueChanged(sender As Object, e As EventArgs) Handles Dtp1.ValueChanged 
    '    Dtp2.MinDate = Dtp1.Value 
    'End Sub 
    'Private Sub Dtp2_ValueChanged(sender As Object, e As EventArgs) Handles Dtp2.ValueChanged 
    '    Dtp1.MaxDate = Dtp2.Value 
    'End Sub 
#End Region

#Region "自・至を逆に入力させても良いが、入力完了後に入れ替えさせる場合"
    Private Sub Dtp_Validating(sender As Object, e As CancelEventArgs) Handles Dtp1.Validating, Dtp2.Validating
        If Dtp1.Value > Dtp2.Value Then
            Dim swap = Dtp1.Value
            Dtp1.Value = Dtp2.Value
            Dtp2.Value = swap
        End If
    End Sub
#End Region

End Class



> 23:59:59まで指定をしたいのですが
23:59:59.0000000 までということですね。
DateTimePicker は、秒精度を超えるデータを扱えないのでご注意ください。

対象となる日付情報が秒未満の精度を持っていないのであれば良いのですが、
ミリ秒なども保持しているのであれば、
23:59:59.0000001 ~ 23:59:59.9999999 の期間の扱いについても
考慮しておく必要があるかもしれません。
投稿者 YuO  (社会人) 投稿日時 2017/8/8 13:15:06
DateTimePickerは入力のために使っており,その値を使って検索をしているのであれば,
検索する式を間違えているのだと思います。

単純に考えると,
・比較対象のデータが日付だけを持つ
  その日付が「開始日以降(起点含む) 終了日以前(終点含む)」である
・比較対象のデータが時刻も持つ
  その日時が「開始日の0時ちょうど以降(起点含む)終了日の翌日の0時ちょうど以前(終点含まない)」である
が条件になるはずです。
投稿者 shu  (社会人) 投稿日時 2017/8/8 15:14:52
DateTimePicker1.Value<DateTimePicker2.Value
として

DateTimePicker1.Value.Date ≦ 対象日時 < DateTimePicker2.Value.Date.AddDays(1)

の範囲で検索されるとよいかと思います。