Link to home
Start Free TrialLog in
Avatar of jmpatton
jmpatton

asked on

Formatting TimeSpan in C#

How can I format a Date Difference in C# using timespan.subtract

Here is what I have so far, I need it to return in hh:mi format

If there is an easier way to do it other than timespan im open to it.  I just have to return this to the user in an hh:mi format.  Even (negative times) -hh:mi if the time returned is negative.

Thanks
DateTime startTime = new DateTime(); 
 DateTime endTime = new DateTime();
 TimeSpan conflictDuration = new TimeSpan();

startTime = 03/28/2011 11:45;
endTime =   03/28/2011 1:47;

conflictDuration = endTime.Subtract(startTime);

Open in new window

ASKER CERTIFIED SOLUTION
Avatar of p_davis
p_davis

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
Unfortunately the TimeSpan() class doesn't accept a format in ToString() so you have to manually extract the values and put them together yourself.  =\

Here's one way:
conflictDuration = endTime.Subtract(startTime);
string formatted = (conflictDuration.TotalMilliseconds < 0 ? "-" : "") + Math.Abs(conflictDuration.Hours).ToString("00") + ":" + Math.Abs(conflictDuration.Minutes).ToString("00");
MessageBox.Show(formatted);

Open in new window

Avatar of p_davis
p_davis

poo, i don't know what the heck i was thinking.
I've often wondered why they didn't implement a ToString() overload that accepts a format for the TimeSpan...it would make perfect sense to me!  =)
it would be hard for a span that was more than a day, i guess?
BTW, TimeSpan.ToString(format) is available in .NET 4:

    http://msdn.microsoft.com/en-us/library/dd992632.aspx

So, p_davis' answer is correct as long as it's .NET 4.

I hope this helps.
Woohoo!  Thanks for update wdosanjos.  =)

You have to escape the ":" though like this:
Dim dtA As DateTime = DateTime.Now
        Dim dtB As DateTime = dtA.AddDays(Math.PI)
        Dim ts As TimeSpan = dtB.Subtract(dtA)
        Label1.Text = ts.ToString("dd\:hh\:mm\:ss")

Open in new window


*This is different than the DateTime.ToString() method which is perfectly happy accepting an un-escaped colon!
what is this dim you speak of??? ;p
Hahaha...grrrr....I'm always forgetting what ZONE I'm in!  =)

In not as beautiful as VB.Net, the C# equivalent would be:   *wink*
private void button1_Click(object sender, EventArgs e)
        {
            DateTime dtA = DateTime.Now;
            DateTime dtB = dtA.AddDays(Math.PI);
            TimeSpan ts = dtB.Subtract(dtA);
            label1.Text = ts.ToString(@"dd\:hh\:mm\:ss");
        }

Open in new window

well defined space of a function embraced by beautiful curly brackets.....all is right with the world
// no comment;

code puns =)

don't hate!