Wrox Programmer Forums

Need to download code?

View our list of code downloads.

Go Back   Wrox Programmer Forums > C# and C > C# 2005 > C# 2005
Password Reminder
Register
Register | FAQ | Members List | Calendar | Search | Today's Posts | Mark Forums Read
C# 2005 For discussion of Visual C# 2005.
Welcome to the p2p.wrox.com Forums.

You are currently viewing the C# 2005 section of the Wrox Programmer to Programmer discussions. This is a community of tens of thousands of software programmers and website developers including Wrox book authors and readers. As a guest, you can read any forum posting. By joining today you can post your own programming questions, respond to other developers’ questions, and eliminate the ads that are displayed to guests. Registration is fast, simple and absolutely free .
DRM-free e-books 300x50
 
 
Thread Tools Search this Thread Display Modes
  #1 (permalink)  
Old November 22nd, 2009, 03:51 PM
Authorized User
 
Join Date: May 2007
Location: Hyderabad, Andhra Pradesh, India.
Posts: 95
Thanks: 5
Thanked 0 Times in 0 Posts
Post Adding hours and minutes together

Hi All

I have a datatable which consist of one column namely LESSHRS. The time is coming like this 00:25,01:35,01:20 etc...
It is in HH:MM format.
e.g. 00:25 means 25 minutes less
01:35 means 1 hr 35 minutes less,etc.
I have to sum all these values and again i have to show in HH:MM format, i.e total less hrs.

well, i solved this by looping through datarows and again calculating it...
Here is my code
Code:
 
double TotalMnts = 0;


// Calculating less hrs
if (dtLessHrs.Rows.Count > 0)
{
for (int i = dtLessHrs.Rows.Count - 1; i >= 0; i--)
{
DataRow dr1 = dtLessHrs.Rows[i];
string chk = dr1["LESSHRS"].ToString();
string[] arr = chk.Split(':');
string Hrs = arr[0].ToString();
string Mnts = arr[1].ToString();
double a = double.Parse(Hrs) * 60;
double b = double.Parse(Mnts);
TotalMnts = TotalMnts + (a + b);
}
if (TotalMnts >= 60)
{
while (TotalMnts >= 60)
{
TotalMnts = TotalMnts / 60;
}
string[] min = TotalMnts.ToString("#0.00").Split('.');
lblTotalLessHrs.Text = "-" + min[0].ToString() + ":" + min[1].ToString();
lblTotalLessHrs.ForeColor = System.Drawing.Color.Blue;
lblTotalLessHrs.Font.Bold = true;
}
else
{
lblTotalLessHrs.Text = "-" + "00" + ":" + TotalMnts.ToString();
lblTotalLessHrs.ForeColor = System.Drawing.Color.Red;
lblTotalLessHrs.Font.Bold = true;
}
}
Can someone tell me a better way to do it. please explain by writing code for proper understanding.

-- Abhishek
  #2 (permalink)  
Old November 22nd, 2009, 05:24 PM
Friend of Wrox
 
Join Date: Jun 2003
Location: , , USA.
Posts: 1,093
Thanks: 1
Thanked 12 Times in 11 Posts
Default

When working with durations, you would be much better off storing them as an integral type rather than in some sort of string format. They will be much easier to perform calculations on.

The integral type would represent the duration as a total number of seconds.

For example, 2 hours, 46 minutes, and 39 seconds would equal 9999 seconds. Store the value 9999 in your database. Then do all your calculations working with integers or longs. Easy.

To get a string representation of your results, use the modulus operator like so:

Code:
int duration = 9999;
Console.WriteLine(String.Format("{0:00}:{1:00}:{2:00}", duration / 3600, duration / 60 % 60, duration % 60));
This code outputs:

02:46:39
  #3 (permalink)  
Old November 22nd, 2009, 11:08 PM
Friend of Wrox
 
Join Date: Jun 2003
Location: , , USA.
Posts: 1,093
Thanks: 1
Thanked 12 Times in 11 Posts
Default

Code:
staticvoid Main(string[] args)
{
   DataTable dtLessHrs = newDataTable();
   dtLessHrs.Columns.Add(newDataColumn("LESSHRS", typeof(int)));

for (int i = 1; i <= 10; i++)
   {
      DataRow row = dtLessHrs.NewRow();
      row[0] = newRandom().Next(1000, 10000);
      dtLessHrs.Rows.Add(row);
   }
 
   int totalSeconds = 0;
   for (int i = dtLessHrs.Rows.Count - 1; i >= 0; i--)
   {
      DataRow dr1 = dtLessHrs.Rows[i];
      totalSeconds += (int)(dr1["LESSHRS"]);
   }
   Console.WriteLine(String.Format("Total Less Hours = {0:00}:{1:00} (hours/minutes)", totalSeconds / 3600, (totalSeconds / 60 % 60)));
}
  #4 (permalink)  
Old November 23rd, 2009, 04:26 AM
Authorized User
 
Join Date: May 2007
Location: Hyderabad, Andhra Pradesh, India.
Posts: 95
Thanks: 5
Thanked 0 Times in 0 Posts
Default

Hi Bob

Thanks a lot for pointing me in the right direction. Well, there are times when one cant control what is coming from the database, the same thing applied to me here where i cant convert 01:56 form string into seconds in the retrieval query itself. So i decided to split the datatable into two more datatables having hours and minutes separately, then i summed it up and converted it into seconds.

Here is my modified code:

Code:
// Creating two tables separately
DataTable dtHrs = newDataTable();
DataTable dtMnts = newDataTable();
 
dtHrs.Columns.Add(newDataColumn("HOURS",Type.GetType("System.Int64")));
dtMnts.Columns.Add(newDataColumn("MINUTES",Type.GetType("System.Int64")));
for (int i = dtLessHrs.Rows.Count - 1; i >= 0; i--)
{
DataRow dr2 = dtLesshrs.Rows[i];
string chk1 = dr2["LESSHRS"].ToString();
string[] split = chk1.Split(':');
dtHrs.Rows.Add(Int64.Parse(split[0]));
dtMnts.Rows.Add(Int64.Parse(split[1]));
dtHrs.AcceptChanges();
dtMnts.AcceptChanges();
}
Int64 Hrs = (Int64)dtHrs.Compute("Sum(HOURS)", string.Empty);
Int64 HrsIntoSeconds = Hrs * 3600;
Int64 Mnts = (Int64)dtMnts.Compute("Sum(MINUTES)", string.Empty);
Int64 MntsIntoSeconds = Mnts * 60;
Int64 TotalSeconds = HrsIntoSeconds + MntsIntoSeconds;
lblTotalLessHrs.Text = String.Format("{0:00}:{1:00}",TotalSeconds/3600,TotalSeconds/60 % 60);
Any further suggestions which may reduce performance issues or may reduce lines of code are welcome.

Thanx a lot once again Bob and have a great day ahead.

-- Abhishek
  #5 (permalink)  
Old November 23rd, 2009, 06:36 AM
Friend of Wrox
 
Join Date: Jun 2003
Location: , , USA.
Posts: 1,093
Thanks: 1
Thanked 12 Times in 11 Posts
Default

You can getrid of 1 variable/line of code:

string chk1 = dr2["LESSHRS"].ToString();
string[] split = chk1.Split(':');

can be reduced to:

string[] split = dr2["LESSHRS"].ToString().Split(':');
  #6 (permalink)  
Old November 23rd, 2009, 11:02 PM
Friend of Wrox
 
Join Date: Jun 2003
Location: , , USA.
Posts: 1,093
Thanks: 1
Thanked 12 Times in 11 Posts
Default

Actually, I believe all you need is:

Code:
long totalMinutes = 0;
foreach (DataRow row in dtLessHrs.Rows) 
{
  string[] split = row[0].ToString().Split(':');
  totalMinutes += (Int64.Parse(split[0]) * 60) + (Int64.Parse(split[1]));
}
lblTotalLessHrs.Text(String.Format("Total Less Hours = {0:00}:{1:00} (hours/minutes)", 
totalMinutes / 60, (totalMinutes % 60)));
The Following User Says Thank You to Bob Bedell For This Useful Post:
abhishekkashyap27 (November 27th, 2009)
  #7 (permalink)  
Old November 27th, 2009, 03:25 PM
Authorized User
 
Join Date: May 2007
Location: Hyderabad, Andhra Pradesh, India.
Posts: 95
Thanks: 5
Thanked 0 Times in 0 Posts
Thumbs up

Yup, this was all i needed, code has got reduced by nearly 8 to 9 lines. Thanks Bob for your patience and effort.










-- Abhishek
 


Thread Tools Search this Thread
Search this Thread:

Advanced Search
Display Modes

Posting Rules
You may not post new threads
You may not post replies
You may not post attachments
You may not edit your posts

BB code is On
Smilies are On
[IMG] code is Off
HTML code is Off
Trackbacks are Off
Pingbacks are On
Refbacks are Off


Similar Threads
Thread Thread Starter Forum Replies Last Post
adding hours minutes and second Brendan Bartley Access 5 July 16th, 2009 09:35 AM
convert time to minutes stolte XSLT 3 November 21st, 2008 04:12 AM
Calculate time (minutes) between two times rtr1900 Classic ASP Basics 18 January 2nd, 2008 03:06 PM
Remoting timing out after 2 minutes BrainWave ASP.NET 2.0 Professional 0 August 13th, 2007 06:54 AM
Calculating hours and minutes between to dates timmaher Access VBA 4 May 10th, 2005 07:36 AM



All times are GMT -4. The time now is 11:27 AM.


Powered by vBulletin®
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.
© 2013 John Wiley & Sons, Inc.