2016-11-08 7 views
0

私のコードは次のとおりです。何か私のタイムスパンのコードで間違っている

Private Sub tbRcvrDepartTime_textchanged(sender As Object, e As EventArgs) Handles tbRcvrDepartTime.TextChanged 

    'Converts the 90 Receiver Arrival & Departures Date & Times to a string for comparison 
    Dim raTime As String = tbRcvrArriveTime.Text   'Takes the Time only String and converts to string 
    Dim raDate As String = dpRcvrArriveDate.Text   'Takes the DateTimePicker and converts date to string 
    Dim raDateString = String.Concat(raDate, " ", raTime) 'Puts together the Date & Time into one continuous string 
    'Dim raDateFormat As String = "MM-dd-yyyy HH:mm"   'Sets the String to Date style Format 
    Dim raResultDate As Date = CDate(raDateString)   'Finalizes the String for use in below comparison 

    Dim rdTime As String = tbRcvrDepartTime.Text   'Takes the Time only String and converts to string 
    Dim rdDate As String = dpRcvrDepartDate.Text   'Takes the DateTimePicker and converts date to string 
    Dim rdDateString = String.Concat(rdDate, " ", rdTime) 'Puts together the Date & Time into one continuous string 
    'Dim rdDateFormat As String = "MM-dd-yyyy HH:mm"   'Sets the String to Date Format 
    Dim rdResultDate As Date = CDate(rdDateString)   'Finalizes the String for use in below comparison 

    'Checks to see if 2 or more hours have elapsed since Receiver Arrival/Departure Date & Time 
    Dim elapsedR As TimeSpan = rdResultDate.Subtract(raResultDate) 
    tbRcvrDepartTime.BackColor = If(elapsedR.TotalMinutes > 120, Color.LightPink, Color.White) 
End Sub 

両方raTime & rdTimeは別々のテキストボックスです。 両方ともraDate & rdDateはdatetimepickersです。

最初にコード "live"を実行すると、最初に見た最初のレコードが正しく表示されます。一度私が別のレコードに移動すると、これは窓から出て行きます... 120分を超えるとバックカラーを適切な色に変えないランダムな結果が得られます。それ以外の場合は、120分経過したときにバックカラーを変更します(<)。ときどきバックカラーを変更したり、色を変えたりしてはいけません。私はもともとTotalHoursを使ってこれをやってみましたが、同じ結果が出ました。これはランダムであり、一貫性がありません。私は2日間この作業をしましたが、結果に違いはありません。私の考えは、それぞれの新しいレコードがロードされたときにrdResultDate & raResultDate情報を "リフレッシュ"する方法が必要であるということですが、私のコード知識でこれを行うことはできません。

raDate:11/01/2016とraTime:23:46と rdDate:11/02/2016とrdTime:03:00 - 新しい日付が存在する場合は、このコードで考慮する必要があります。これは2時間(または120分)を超え、「真」と読まれ、2時間(120分)を超えるようにバックカラーを変更する必要があります。 raDate:2016年11月1日とraTime:23:46と
rdDate:2016年11月2日とrdTime:1時00分、この2時間(または120を超えない、以下が真であった場合は

分)、「偽」と読み替えてバックカラーを変更しないでください。

答えて

0

このコードのすべて:それは直接あなたの問題に対処しますが、それはコメントを少しすぎた

Dim elapsedR As TimeSpan = rdResultDate.Subtract(raResultDate) 
tbRcvrDepartTime.BackColor = If(elapsedR.TotalMinutes > 120, Color.LightPink, Color.White) 

わからない場合:

Dim Detention90 As String 

Try 
    If elapsedR.TotalMinutes > 120 Then 
     Detention90 = "True" 
    Else 
     Detention90 = "False" 
    End If 

    Select Case Detention90.ToString 
     Case = "True" : tbRcvrDepartTime.BackColor = Color.LightPink 
     Case Else : tbRcvrDepartTime.BackColor = Color.White 
    End Select 

Catch ex As Exception 
    'If a problem occurs, show Error message box 
    MessageBox.Show("Receiver Arrive Time & Depart Time Elapsed error" & vbCrLf & "Lines 1424-1434") 
End Try 

はちょうどこのまで凝縮私はこの方法で圧縮コードが難しいバグを追跡するのに非常に有益であることがわかっています。

この場合、主な問題はdatetime値を解析していると思われます。指定した入力文字列から期待するDateTime値を解析しているとは限りません。具体的には、書式文字列変数raDateFormatrdDateFormatがありますが、Date.Parse()を呼び出すと、これらの書式変数がでない場合はとなり、スレッド、プロセス、またはシステムのデフォルトの日付書式に従います。あなたがUSスタイルのm/d/yではなく英国のようにd/m/yオーダを使用しているシステムを使用していると、いくつかの奇妙な結果に終わるでしょう。おそらくDateTime.ParseExact()が必要です。

+0

ParseExactを試してみましたが、決してそれを好きではありませんでした。私はrdDateFormatとraDateFormat変数を無効にしましたが、これは解決するが運がないことを望んでいます。私は提案された変更を反映するために元のmsgのコードを更新しました。私はまだバックグラウンドのランダムなカラーリングを思いついているので、elapsedR変数は正しくないようです - たとえ私がデバッグでそれを実行しても、フォーマットは正しいと思われます。 –

関連する問題