views:

87

answers:

3

Consider this code (prestuffed with an example):

DateTime dt1 = DateTime.Parse("7/30/2010 9:33:29.1234567 AM");
DateTime dt2 = DateTime.Parse("6/30/2010 9:33:00.7654321 AM");

TimeSpan ts = dt1 - dt2;

Console.WriteLine(string.Format( "{0:d.hh:mm:ss.ff}", ts ));

This is representative of a piece of code that I've had working since .NET 1.1 at least.

It worked fine in 1.1 through 3.5 with the following output (for these dummied up inputs):

30.00:00:28.3580246

But now I'm seeing that it dies in .NET 4 with the error message:

Input string was not in a correct format.

So it's as if .NET 4 has suddenly decided it doesn't like this format for time differences. Changing the line to, say

Console.WriteLine(string.Format( "{0}", ts.ToString("d.hh:mm:ss.ff") ));

has the same effect.

Now the thing I've noticed is that if I just do the default .ToString() I get the same output. I believe the thought process was that this was an insurance policy against the default format changing in a future version. But now it doesn't look like that's even an option.

Does anyone know why this changed and if I'm doing something wrong or if there's a best practices way to do what I'm trying to accomplish?

A: 

I've pasted your piece of code and it seems to be a culture problem :

with .NET 2 an FormatException is thrown too

If I specified the us culture (culture is fr-FR by default) , the code works :

DateTime dt1 = DateTime.Parse("7/30/2010 9:33:29.1234567 AM", CultureInfo.GetCultureInfo("en-US"));

You can also specified an Invariant culture to ignore the culture

DateTime dt1 = DateTime.Parse("7/30/2010 9:33:29.1234567 AM", CultureInfo.InvariantCulture);
Florian
I think you're on to something with the culture but, but it's not the DateTime lines that are giving me fits, it's the TimeSpan format string. Even if I specify the culture in the TimeSpan ToString and both of the DateTime.Parse methods, I'm still getting the same.
Schnapple
+4  A: 

There is a configuration switch to restore the old behaviour of TimeSpan.

Mitch Wheat
So basically that format string's been doing nothing all this time. Outstanding. Thanks.
Schnapple
A: 

An alternative to the configuration switch is a format change that is compatible with previous versions.

Console.WriteLine(string.Format( "{0:hh\\:mm\\:ss.ff}", ts )); 

This solution is detail here.

wilk