Link to home
Start Free TrialLog in
Avatar of javagair
javagairFlag for United States of America

asked on

make time out of string

I have a database filled with 24 hr clock times in string format.
9:00  12:13  17:42  you get the picture.
Is there an easy way to get the time between 9:00 and 17:42
I can think of ways to split the string around the colon and then figure the elapsed time, but is there and easy way of doing it?  Obviously one can't subtract, because of the silly 60 minutes.

suggestions?

gary
Avatar of chaau
chaau
Flag of Australia image

How about using System.DateTime for both times, and then subtract them. The Result will be a System.TimeSpan.

Here is a small example:
String dateStub = "2014-01-01 "
String strtime1 = "9:00"
String strtime2 = "17:00"
DateTime time1 = DateTime.ParseExact(dateStub + strtime1, "yyyy-MM-dd hh:mm", enUS, DateTimeStyles.None)
DateTime time2 = DateTime.ParseExact(dateStub + strtime2, "yyyy-MM-dd hh:mm", enUS, DateTimeStyles.None)
TimeSpan diff = time2 - time1
' then use diff.Hours and diff.Minutes to get the time difference

Open in new window

Avatar of javagair

ASKER

so you are just adding a random date to the time and then using the timespan to look only at the times?
good thinking I will try it

thanks

gary
the enUs is giving me a problem
imported systems.globalization which gave me the DateTimeStyles but enUS still has an error

gary
You can use null in place of enUS, like this:
DateTime time2 = DateTime.ParseExact(dateStub + strtime2, "yyyy-MM-dd hh:mm", null, DateTimeStyles.None)

Open in new window

If you put null in the expression, compiler says null is not defined, use system.dbnull which if you do compiler says type system can not be used in expression.
Null was defined in the old Vb, why not now?

datestub = "#2014-01-01 "    'I added the # seems to want one also tried it without the #
Dim cultures() As CultureInfo = {New CultureInfo("en-US")}
savestart = String.Copy(DataGridView1.Item(1, i).Value())  ' this is 8:00
Dim time1, time2, time3, time4 As DateTime  ' time1 defaults to #12:00 AM#

put in a break  on the next statement and run
 time1 = DateTime.ParseExact(datestub & savestart & " AM#", "yyyy-MM-dd hh:mm", cultures(0), DateTimeStyles.None)

so datestub is #2014-01-01 savestart is 8:00  
we end up with #2104-01-01 8:00 AM# or the same with the # and the AM removed.
I get the same message string is in wrong format.

gary
Sorry, it is VB. You need to use Nothing instead of Null.

Anyway, try this (do not use hashes):
DateTime time2 = DateTime.ParseExact(dateStub + strtime2, "yyyy-MM-dd h:mm", CultureInfo.InvariantCulture)

Open in new window

The main thing here is a single "h" in the time format and "CultureInfo.InvariantCulture"
okay almost got it to work.
anytime greater than 12:00 give the invalid datetime error again.
if I change all times to less than 12 then everything is okay.
So it still does not understand Military time, 24 hr clock

thanks for everything

gary
ASKER CERTIFIED SOLUTION
Avatar of chaau
chaau
Flag of Australia image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial
thanks
should have noticed that.

works great.

gary