How to calculate positive difference between time from two DateTimes - vb.net

I am having two date time picker start time and end time.I have to calculate difference between time from this end time and start time.And also how to check am or pm for calculating time difference.
I have tried this by using timespan. It gives me right answer,but when I select time suppose as 12:58:02 in end time and 10:57:05 in start time, it gives me wrong answer like -599. I want to know how to convert this negative difference to positive.
I have tried with the following code:
Dim startTime As Date
Dim endTime As Date
startTime = Convert.ToDateTime(dtpOpStTime.Value)
endTime = Convert.ToDateTime(dtpOpETime.Value)
Dim diff As System.TimeSpan
diff = endTime - startTime
actualTime = Convert.ToString(Int32.Parse(diff.Hours.ToString()) * 60 + Int32.Parse(diff.Minutes.ToString()))
ucTime.TxtCode.Text = actualTime
my another issue is as follows:
I am having 4 date time picker,2 for showing start date and end date and 2 for start time and end time.so when i changed date timespan getting is wrong .so how to resolve this.
I have tey with the following code:
Dim span As TimeSpan = dtpOpEDate.Value - dtpOpStdate.Value
Dim span1 As TimeSpan = dtpOpETime.Value - dtpOpStTime.Value
Dim duration As TimeSpan = span.Duration()
Dim duration1 As TimeSpan = span1.Duration()
Dim durDay As Int32 = duration.Days
Dim durHr As Int32 = duration1.Hours
Dim durMin As Int32 = duration1.Minutes
Dim totalDur = durDay * 24 * 60 + durHr * 60 + durMin
actualTime = totalDur.ToString()
ucTime.TxtCode.Text = actualTime
Problem is through this I am getting wrong time difference ,when i change suppose start time 10:51:02 PM and end time to 3:51:04 AM and start date to 25-Mar-2014 and End date to 26-Mar-2014 then difference should be 5 hours though the day change but i am getting wrong difference

A difference between two DateTimes returns a TimeSpan object. You can either use the Subtract method of DateTime or even use -. You have to use the subtract the earlier date from the later date:
Dim span As TimeSpan = dtpEnd.Value - dtpStart.Value
You can use the Duration method to get an absolute timespan, then the order doesn't matter:
Dim duration As TimeSpan = (dtpStart.Value - dtpEnd.Value).Duration()
If you for example want the number of minutes between, use the TotalMinutes property:
Dim minutes As Int32 = CInt(duration.TotalMinutes)

Related

How to calculate time difference between two times in vb

I need to calculate time difference between two time
The shift Start time is 04:30:Pm to 12:30AM
The Employee IN time is 08:30 AM then it shows the error message time expired
What I have tried:
dtShifTime = Convert.ToDateTime("16:30").ToString("HH:mm")
Dim dtEntryTime As DateTime = Convert.ToDateTime("08:30").ToString("HH:mm")
If lblStartTime.Text <> "" And (dtLateTime < dtEntryTime) Then
MBox("Time Expired")
End IF
By calling ToString you convert the DateTime object into a String. And then you save it into a DateTime variable.
I don't know what you're trying to do, but to get the difference between two times you just subtract them.
Dim dtStart As DateTime = new DateTime(year:= 1, month := 1, day:= 1, hour:= 8, minute:= 30, second := 0)
Dim dtEnd As DateTime = new DateTime(year:= 1, month := 1, day:= 1, hour:= 20, minute:= 0, second := 0)
Dim tsDiff As TimeSpan = dtEnd - dtStart
Console.WriteLine(tsDiff.ToString())
I recommend you read the documentation for what you're trying to use.
DateTime and TimeSpan.
Instead of the constructor you can parse with DateTime.Parse(), ParseExact or TryParse if you definitely need to use a string as an input, which you should avoid if possible.
Aside from that you should do some basic searching and researching. For example this comes up as the first hit: Get time difference between two timespan in vb.net when searching "time difference vb.net"

Comparing Date and Time Values Taken from Now() Function

I have a table that users can log their use of a laboratory instrument. For the most basic function of logging current use, I have an error check that goes through a column that references the start and end times of the instrument use.
Basically, I want to compare the current time and the end time of the instrument use with previously submitted reservations/current instrument use. If the code detects that the current user input would interfere with a reservation, it changes the string value of "strCheckTime" from "ok" to "error".
Then a If Then statement later on registers that and prompts the user with a message box.
The code is listed below.
So far, I have not gotten it to work. No matter what Now() returns and what reservations are currently present, it will run through the If Then statement and change the string value of "strCheckTime" from "ok" to "error".
Any help would be most welcome!
'Defines and sets variables for current use/reservation check
Dim shtInstrument As Worksheet
Set shtInstrument = Worksheets(strShtName)
shtInstrument.Activate
Dim intCountEntries As Integer
intCountEntries = shtInstrument.Cells(shtInstrument.Rows.Count, "B").End(xlUp).Row
Dim CurrentTime As Date
Dim StartDate As Date
Dim StartTime As Date
Dim EndDate As Date
Dim EndTime As Date
Dim rngStart As Range
Dim rngEnd As Range
Dim strCheckTime As String
strCheckTime = "Ok"
'Checks if desired instrument use falls in time frame of current use or reservation
For Each rngStart In shtInstrument.Range("H9:H" & intCountEntries)
StartDate = DateValue(rngStart.Value)
StartTime = TimeValue(rngStart.Value)
EndDate = DateValue(rngStart.Offset(0, 1).Value)
EndTime = TimeValue(rngStart.Offset(0, 1).Value)
If StartDate <= Date <= EndDate Then
If StartTime <= Now() <= EndTime Then
strCheckTime = "Error"
ElseIf StartTime <= CurrentTime + TimeSerial(0, txtSample.Text * txtTime.Text, 0) <= EndTime Then
strCheckTime = "Error"
Else
strCheckTime = "Ok"
End If
Else
'Do nothing
End If
Next rngStart
The problem is in this line:
If StartTime <= Now() <= EndTime Then
The function "Now()" returns the entire date, including the time. This value is inherently always greater than the StartTime variable which represents only a time.
The second problem (that you figured out and mentioned in a comment) is that you can't use the equality operators like this.
The statement:
If x <= y <= z
will be evaluated as such:
If (x <= y) <= z
So this will be evaluated to:
If (TRUE/FALSE) <= z Then
But TRUE = -1 and FALSE = 0 so as long as z is bigger than z (which in your case it always is), your function will return true. You need to split the statements (again, per your comment).
You need to use either:
If StartTime <= Time() AND Time() <= EndTime Then
or
If StartTime <= TimeValue(Now()) AND TimeValue(Now()) <= EndTime Then
Better yet, you don't need to use the Date and Time separately:
StartTime = [cell where date and time are located]
EndTime = [cell where date and time are located]
If StartTime <= Now() AND Now() <= EndTime Then 'both time variables are defined by both the date and time
Note that to figure out problems like this, it is best to use a line such as:
debug.print StartTime
debug.print Now()
debug.print EndTime
debug.print (StartTime <= Now() <= EndTime)
to pinpoint where the problem is.
One additional comment is that if you are using things such as the Time throughout code, the Time function is evaluated when the code runs. So if you have a procedure that takes a bunch of time and at the beginning you check the time vs something and then at the end you use the Time/Date function to get the time to record somewhere, these values will be different. The best way to prevent this is to create a variable at the beginning of the code (or wherever you want to check the time:
currTime = Now()
and then use this variable throughout your code. In this particular case, the difference will either be extremely negligible or nonexistent as the check is in the same line of code, but in other cases it could be an issue.
EDIT***To include the additional problem of not being able to use equalities like this.

Comparing Time And Date with this format HH.MM mm/dd/yyyy.

Is it possible to compare using The format of military time and Date like this HH.MM mm/dd/yyyy.
For Example:
1
08.25 06/10/2014 > 23.18 06/09/2014
Result is True because the day 10 is greater than day 09
2
23.25 06/10/2014 > 23.30 06/10/2014
Result is false because the mins 30 is greater than mins 25
3
24.25 06/10/2014 > 1.30 06/10/2014
Result is true because the hrs 24 is greater than hrs 1
The Priority is Year -> Month -> Day -> Hours -> mins.
Seems like you are allowed to have non-standard time like 24.25.
Then you can use the following strategy - extract date, add time, compare.
Public Shared Function ToDateTime(ByVal value As String) As DateTime
Dim m As Match = Regex.Match(value, "^(?<hours>\d{1,2})\.(?<minutes>\d{2}) (?<date>\d{2}/\d{2}/\d{4})$")
If Not m.Success Then
Throw New ArgumentException("value")
End If
Dim dateOnly As DateTime = DateTime.ParseExact(m.Groups.Item("date").Value, "dd\/MM\/yyyy", CultureInfo.InvariantCulture)
Dim hours As Integer = Integer.Parse(m.Groups.Item("hours").Value)
Dim minutes As Integer = Integer.Parse(m.Groups.Item("minutes").Value)
Return dateOnly.AddHours(hours).AddMinutes(minutes)
End Function
Usage:
Console.WriteLine(ToDateTime("08.25 06/10/2014") > ToDateTime("23.18 06/09/2014"))
Console.WriteLine(ToDateTime("23.25 06/10/2014") > ToDateTime("23.30 06/10/2014"))
Console.WriteLine(ToDateTime("24.25 06/10/2014") > ToDateTime("1.30 06/10/2014"))

Converting DateTime to an integer

How would you convert a randomly generated time into an integer, This is how I have formatted my time;
StartTime = FormatDateTime(Now, DateFormat.LongTime)
EndTime = FormatDateTime(Now, DateFormat.LongTime)
Diff = (EndTime - StartTime.Subtract(TimeSpan))
So for example Diff = "08:30:12"
I want to be able to convert that to "8.30" as in 8 hours and 30 minutes.
8.30 is not an Integer.
However, you can use the TimeSpan.Hours and TimeSpan.Minutes properties with String.Format if you want a string with the hours and the minutes parts:
String.Format("{0}.{1}", Diff.Hours, Diff.Minutes)
Demo
You say you want an integer representation of your Diff result.
Supposing that Diff is a TimeSpan structure, why not use simply?
Dim x as Integer
x = Convert.ToInt32(Diff.TotalMinutes)
Of course I assume that the difference is never so big to overflow the integer
You can do :
Dim d As Decimal
d = Diff.Hours + Diff.Minutes / 100D
100D gives a decimal that is needed for the division. Integer division 30/100 gives 0
You could use the DateTime.DiffDate function, which returns a long
dim date1 as DateTime = Now
dim date2 as DateTime = Now.AddSeconds(-30600) ' 8.5 hours ago
dim lHr as long = DateDiff(DateInterval.Hour, date1, date2) '=-8
dim lMn as long = DateDiff(DateInterval.Minute, date1, date2) '=-510
lHr = DateDiff(DateInterval.Hour, date2, date1) ' = +8
lMn = DateDiff(DateInterval.Minute, date2, date1) ' = +510
(there are other intervals, days, seconds etc. in DateDiff which would also come in handy) Note that there is no rounding up of your values. Makes number of minutes within hour easy
num_Minutes_Past_Hour = lMn - lHr * 60 ' = 30

Datediff() function not getting the expected result in VB.NET

I am using the following code in my project. I want to find the number of days by given the last date and now.
Dim BorrowDate As Date
Dim i As Integer
BorrowDate = Date.Parse(txtBorrowDate.Text)
i = DateDiff(DateInterval.Day, BorrowDate, DateTime.Now)
for example, when BorrowDate is "01/Jul/2011" then the result is 7 days which it should be 10 to now. Please help
Since you are using .Net you might try this
Dim BorrowDate As Date = Date.Parse(txtBorrowDate.Text)
Debug.WriteLine(BorrowDate.ToString)
Debug.WriteLine(DateTime.Now.ToString)
Dim ts As TimeSpan = DateTime.Now - BorrowDate
Dim numdays As Integer = CInt(ts.TotalDays)
Debug.WriteLine(numdays.ToString("n0"))
edit: Init the variables and show the dates.