Comparing Times in vb.net - vb.net

I have four different DateTime boxes. Two boxes just displays the Date and the other two just Displays the time
If the current time is between midnight and six am I want the Date in the date box to be the day before.
I have it all, I'm just missing the part that compares the two.
Dim currentTime As DateTime = Now
'default date
If deMaxDate.Value = Nothing Then
deMaxDate.Value = Now
End If
If deMinDate.Value = Nothing Then
If currentTime.Hour < TimeOfDay.Hour Then
'THIS IF STATMENT IS WRONG - HOW CAN I CHECK IF ITS BETWEEN 12AM AND 6 HERE
deMinDate.Value = (Now - TimeSpan.FromDays(1))
Else
deMinDate.Value = Now
End If
End If
'default time
If teMaxTime.Value = Nothing Then
teMaxTime.Value = Now
End If
If teMinTime.Value = Nothing Then
teMinTime.Value = (Now - TimeSpan.FromHours(6))
End If
My comment by the third if statment is where I'm stuck at.
DateTime is a double datatype? Something like
if currentTime.Hour < TimeOfDay.Hour.Equals(6)
?

Your rule, if I understand this, is that you want to look at the current time. If the current time is between 12AM(0000) and 6AM(0600), then you want to use yesterday as the active date.
Dim current as DateTime = now()
Dim activeDate as DateTime = current
if current.Hour < 6 then
activeDate = current.AddDays(-1)
end if
Although, if you're not really interested in the hours part of the date except for this business rule, you could always just do date.AddHours(-6).

I do this in a similar situation where I want to check the current time is prior to 4 AM.
If (DateTime.Now.Hour < 4) Then
'do something
End If

Just use
If currentTime.Hour <= 6 Then
deMinDate.Value = Now.AddDays(-1)
Else
deMinDate.Value = Now
End If
or indeed...
If currentTime.Hour <= 6 Then
deMinDate.Value = Now.Date.AddDays(-1)
Else
deMinDate.Value = Now.Date
End If
if you don't want the time bit because .Now contains a time element as well as a date element.

Have a look at http://msdn.microsoft.com/en-us/library/5ata5aya.aspx. It might apply to your case

currentTime.Hour < TimeOfDay.Hour.Equals(6)
ended up being the answer

Related

Check if the day is between two given days using VBA in Excel

I've limited knowledge in coding with VBA in Excel and have run into a problem. I'm trying to write a code where it does something based on what day of the week it is.
I'm extracting the day of the week as string and then using a IF...ELSE bit. Code is attached below:
Sub Schedule()
Dim Today As String
Today = Format(Date, "dddd")
If Today >= "Monday" And Today <= "Thursday" Then
'code to do something
ElseIf Today = "Friday" Then
'code to do something
ElseIf Today >= "Saturday" And Today <= "Sunday" Then
'code to do something
End If
End Sub
Kindly advise.
A Select Case ... is fine for this - and do use constants, not magic numbers:
Sub Schedule()
Select Case Weekday(Date)
Case vbMonday To vbThursday
' Code to do something.
Case vbFriday
' Code to do something else.
Case vbSaturday, vbSunday
' Code to do some fun.
End Select
End Sub
Use WeekDay() to extract an integer representing the current day of the week:
Dim Today As VbDayOfWeek
Today = Weekday(Date)
If Today >= vbMonday And Today <= vbThursday Then
....
You cannot apply comparison operands (> or <) to strings so you will need to use the .WeekDay() function instead of formatting to string.
Here is the documentation: WeekDay please note the second optional parameter.
Here is the code:
Dim Today as Long
Today = WeekDay(Date)
If Today >= 2 And Today <= 5 Then
'do something
ElseIf Today = 6 Then
'do something
ElseIf Today = 7 Or Today = 1 Then
'do something
End If

Getting all the dates between two selected dates

Good afternoon, I'm new to programming and I'm working with VB.NET.
I need to get the difference between two dates and then list all the intermediate dates in listbox1. I tried the following code but it doesn't work.
Private Sub breaks()
Dim date1 As Date = DateTimePicker1.Value.ToString("dd/MM/yyyy")
Dim date2 As Date = DateTimePicker2.Value.ToString("dd/MM/yyyy")
While date1 <= date2
Dim result = date1
ListBox1.Items.Add(result)
Dim term = 1
date1 = DateTimePicker1.Value.AddDays(term)
End While
End Sub
The function is called within a button. When executed it only shows the sidebars but is blank.
The image shows start date 03/10/2020 and end date 03/16/2020, however the result (listbox) does not return anything.
I expected my result to come:
03/10/2020
03/11/2020
03/12/2020
03/14/2020
03/15/2020
03/16/2020
the interval between them.
Can anyone tell me what's wrong?
You can use some linq for a simple solution
ListBox1.DataSource =
Enumerable.Range(0, 2 + DateTimePicker2.Value.Subtract(DateTimePicker1.Value).Days).
Select(Function(offset) DateTimePicker1.Value.AddDays(offset)).
ToList()
It generates a list of numbers to act as the offset from the initial date, then adds them the specified number of times (different between the dates in days) to create all the dates. No loop required.
Credit to this answer
Edit:
This can also be similarly applied to a DataGridView, but in order to make a single column, we would need to select an anonymous type.
DataGridView1.DataSource =
Enumerable.Range(0, 2 + DateTimePicker2.Value.Subtract(DateTimePicker1.Value).Days).
Select(Function(offset) New With {.Date = DateTimePicker1.Value.AddDays(offset)}).
ToList()
You should avoid using strings for datetimes until they need to be text.
The variable date1 can be used for all the dates, like this:
Dim date1 As Date = DateTimePicker1.Value
Dim date2 As Date = DateTimePicker2.Value
While date1 <= date2
ListBox1.Items.Add(date1.ToString("MM/dd/yyyy"))
Dim term = 1
date1 = date1.AddDays(term)
End While
Also, you should make sure to set Option Strict On as the default for new projects, and set it for the current project.

How to make an if else syntax with datetime (time only)

Need your help guys, how can I make an if else with time? I just need to make the time and minutes to round off.
for example: I put 9:23 in a textbox
if textbox1.text >= 9:00 And textbox1.text <= 9:30
textbox1.text = 9:00
end if
It will round off to 9:00, I just need the syntax on how the time will round off. Thank you 3000
Try this.
Dim datetime As DateTime = Convert.ToDateTime(textbox1.text)
Dim timeininteger As Integer = CInt(datetime.ToString("mm"))
If timeininteger >= 0 And timeininteger <= 30 Then
textbox1.text = datetime.ToString("HH:" & "00")
End If
Ok, so you see, 9:30 isn't time. Not to a computer, at least. It's a string. So you'll need to format it until it's time.
I notice that you didn't specify AM or PM, so I'll assume that you're using a 24h time format. Here we go:
'Convert the text from the TextBox1 to DateTime
Dim time As DateTime = Convert.ToDateTime(textbox1.text)
'Here's the result:
MessageBox.Show(time.ToShortTimeString)
'You can get only one component of a DateTime:
MessageBox.Show(time.Hour.ToString)
'So, yeah, you can totally do math with time now! Look:
If time.Minute > 30 Then
MessageBox.Show((time.Hour + 1).ToString)
End If
Now that you master time, use your newfound powers for the greater good!

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.

Dates in For Loop in vb.net

In vb.net I have two data values as shown below:
Dim startp as datetime
Dim endp as datetime
I have a function called ProcessData(soemdate) which processes dataporting.
In VB.net is there a way I can do something like
For each day between startp and endp
ProcessData(soemdate)
Next
Thanks
Here is another way to do this.
Dim startP As DateTime = New DateTime(2009, 1, 1)
Dim endP As DateTime = New DateTime(2009, 2, 1)
Dim CurrD As DateTime = startP
While (CurrD <= endP)
ProcessData(CurrD)
Console.WriteLine(CurrD.ToShortDateString)
CurrD = CurrD.AddDays(1)
End While
For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days) _
.Select(Function(i) startp.AddDays(i))
ProcessData(Day)
Next Day
Adding to Joel Coehoorn's answer which I personally think should be the accepted answer as I always try to avoid While loops no matter how safe they may appear. For...Each is a much safer approach although the enumerable isn't very pretty in-line. You can however move it to a function to keep things more readable, plus you can re-use as needed.
For Each Day As DateTime In DateRange(StartDate, EndDate)
ProcessData(Day)
Console.WriteLine(Day.ToShortDateString)
Next
Public Shared Function DateRange(Start As DateTime, Thru As DateTime) As IEnumerable(Of Date)
Return Enumerable.Range(0, (Thru.Date - Start.Date).Days + 1).Select(Function(i) Start.AddDays(i))
End Function
I also added 1 to Enumerable range since as Joel had it, it wouldn't return the end date and in my situation I needed it to return all dates in the range including the start and end days.
Enumerable.Range is a sort of loop in itself that adds i days to the startdate advancing i with each call from in this case 0 to the difference between start and end days + 1. So the first time it's called you get the result of Start.AddDays(0), next you'll get Start.AddDays(1) and so on until the range is complete.
You can easily loop through each day if you convert your dates to OLE Automation Date OADate where the left portion represents the day and the right portion represents the time.
For example #06/19/2018#.ToOADate converts to 43270.0
For loopDate As Double = #06/19/2018#.ToOADate To #07/01/2018#.ToOADate
Dim thisDate As Date = DateTime.FromOADate(loopDate)
' Do your stuff here e.g. ProcessData(thisDate)
Next
Yes, you can use an accumulator date:
Dim Accumulator as DateTime
Accumulator = startp
While (Accumulator <= endp)
Accumulator = Accumulator.AddDays(1)
End While
Not tested, and I'm a C# programmer, so be easy if my syntax is wrong.
For those that come looking later, I had to add a +1 to the Range endpoint to get this to work for when the start and end were the same. Here is the code I used.
For Each Day As DateTime in Enumerable.Range(0, (endp - startp).Days + 1) .Select(Function(i) startp.AddDays(i))
'Do work here
Next Day
Set a calendar table with all dates and query values from there.
SQL:
Select Date as MyDate from tblCalendar Where Date >= StartDt And Date <= EndDate
.NET:
While Reader.read
process(MyDate)
End While