Adding time to date

S

Saga

I need to add the time a a date, specifically, the current date.
This seemed easy enough, but I found that thi wasn't so.

As in input I get 3 or 4 digits representing the date. Valid
input string are:

"0344", "1102", "456"

The minutes are always 2 digits, but the hour can be either
1 or 2 digits.

What I did was first come up with a function to normalize
the input string which formats it hh:mm:

private function sSetTime(byval strTime as string) as integer

strTime = strTime.ToString("D4")

Return strTime.Substring(0, 2) & ":" & strTime.Substring(2, 2)

end function

Next is my date variable where I am going to keep the date
and time:

dim dteEnd as date = date.today()
dim strT as string = "345" 'For example
Now I add the time:

dteEnd = dteEnd.AddHours(
Convert.ToDouble(sSetTime(strT.Split(":".ToCharArray()).GetValue(0).ToString()))
)

And add the minutes

dteEnd = dteEnd.AddMinutes(
Convert.ToDouble(sSetTime(strT.Split(":".ToCharArray()).GetValue(1).ToString()))
)

Is there a better way to do this? <g>
Thanks, Saga
 
F

Family Tree Mike

I need to add the time a a date, specifically, the current date.
This seemed easy enough, but I found that thi wasn't so.

As in input I get 3 or 4 digits representing the date. Valid
input string are:

"0344", "1102", "456"

The minutes are always 2 digits, but the hour can be either
1 or 2 digits.

What I did was first come up with a function to normalize
the input string which formats it hh:mm:

private function sSetTime(byval strTime as string) as integer

strTime = strTime.ToString("D4")

Return strTime.Substring(0, 2)& ":"& strTime.Substring(2, 2)

end function

Next is my date variable where I am going to keep the date
and time:

dim dteEnd as date = date.today()
dim strT as string = "345" 'For example
Now I add the time:

dteEnd = dteEnd.AddHours(
Convert.ToDouble(sSetTime(strT.Split(":".ToCharArray()).GetValue(0).ToString()))
)

And add the minutes

dteEnd = dteEnd.AddMinutes(
Convert.ToDouble(sSetTime(strT.Split(":".ToCharArray()).GetValue(1).ToString()))
)

Is there a better way to do this?<g>
Thanks, Saga

"Better" is always debatable... Here is an example of a different approach:

Sub Main()
Dim s() As String = {"0324", "1234", "832"}
Dim hhmm As Integer

For Each s1 As String In s
hhmm = Integer.Parse(s1)

Dim h As Integer = hhmm \ 100
Dim m As Integer = hhmm Mod 100

Dim t As DateTime = DateTime.Today
t = t.AddHours(h).AddMinutes(m)
Console.WriteLine(t)
Next

Console.ReadKey()
End Sub
 
S

Saga

Thanks! This looks like a good approach. I can build a function
that will return the date with the time added and use that.
A question regarding your code. I noticed that you used
hhmm = Integer.Parse(s1)

I typically use CInt(). Is there any advantage to using the
integer parse method or disadvantage to uing cint()? Thanks
Saga
 
F

Family Tree Mike

Thanks! This looks like a good approach. I can build a function
that will return the date with the time added and use that.
A question regarding your code. I noticed that you used


I typically use CInt(). Is there any advantage to using the
integer parse method or disadvantage to uing cint()? Thanks
Saga

Just a personal preference, I believe. That said, I wrote that reply
quickly, and the following way would be better:

if (Integer.TryParse(s1, hhmm)) then
' do the datetime stuff
end if

TryParse returns true if the value in the string can be parsed as an
integer. This would handle if the string "Noon" was passed in,
returning false, so that it is skipped.
 
T

Tom Shelton

I need to add the time a a date, specifically, the current date.
This seemed easy enough, but I found that thi wasn't so.

As in input I get 3 or 4 digits representing the date. Valid
input string are:

"0344", "1102", "456"

The minutes are always 2 digits, but the hour can be either
1 or 2 digits.

What I did was first come up with a function to normalize
the input string which formats it hh:mm:

If you don't use a 24 hour clock here (HHmm), then your not ever going to be
able to distinguish between am and pm with out more information :). So, here
is what I have assuming 24 hour clock...

Option Explicit On
Option Strict On

Module Module1

Sub Main()
Dim str() As String = {"1146", "0344", "442", "601", "1302", "2359"}

Dim fmt As String = "MM/dd/yyyy HHmm"
For Each t As String In str
Dim cur As String = Date.Today.ToString("MM/dd/yyyy ") & String.Format("{0,4}", t).Replace(" ", "0")
Dim d As Date
Date.TryParseExact(cur, fmt, Nothing, Globalization.DateTimeStyles.None, d)
Console.WriteLine(d)
Next
End Sub

End Module
 
T

Tom Shelton

If you don't use a 24 hour clock here (HHmm), then your not ever going to be
able to distinguish between am and pm with out more information :). So, here
is what I have assuming 24 hour clock...

Option Explicit On
Option Strict On

Module Module1

Sub Main()
Dim str() As String = {"1146", "0344", "442", "601", "1302", "2359"}

Dim fmt As String = "MM/dd/yyyy HHmm"
For Each t As String In str
Dim cur As String = Date.Today.ToString("MM/dd/yyyy ") & String.Format("{0,4}", t).Replace(" ", "0")
Dim d As Date
Date.TryParseExact(cur, fmt, Nothing, Globalization.DateTimeStyles.None, d)
Console.WriteLine(d)
Next
End Sub

End Module

Technically - you should be checking the return value of TryParseExact. It
returns a Boolean value indicating if it was able to succesfully parse the
string as a date or not :)
 
S

Saga

Thanks again. Saga

Family Tree Mike said:
Just a personal preference, I believe. That said, I wrote that reply
quickly, and the following way would be better:

if (Integer.TryParse(s1, hhmm)) then
' do the datetime stuff
end if

TryParse returns true if the value in the string can be parsed as an
integer. This would handle if the string "Noon" was passed in, returning
false, so that it is skipped.
 
S

Saga

Thanks for your reply. You are correct in assuming that the
time data is in 24 hour format. Saga
 
S

Saga

Thanks for the addtional tip. In theory, all data has been
validated by the time it reaches this point, but I'll add this
extra validation step just to be on the safe side. Saga
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top