We have an application parsing date/time values in the following format:
2009-10-10 09:19:12.124
2009-10-10 12:13:14.852
2009-10-10 13:00:00
2009-10-10 15:23:32.022
One particular server all of the sudden (today) started failing to parse any times 13:00:00 or later. This particular client has five servers and only one has the problem. We have dozens of other clients with a total of hundreds of servers without the problem.
System.FormatException: String was not recognized as a valid DateTime.
at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)
at System.DateTime.Parse(String s, IFormatProvider provider)
at System.Convert.ToDateTime(String value, IFormatProvider provider)
at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)
at System.Convert.ToDateTime(Object value)
I ran a test using DateTime.Parse(s, CultureInfo.CurrentCulture) comapred to DateTime.Parse(s, CultureInfo.InvariantCulture) and the problem only shows up with CurrentCulture. However, CurrentCulture is "en-US" just like all the other servers and there's nothing different that I can find in regional or language settings.
Has anyone seen this before? Suggestions related to what I can look into?
EDIT: Thank you for the answers so far. However, I'm looking for suggestions on what configuration to look into that could have caused this to suddenly change behavior and stop working when it's worked for years and works on hundreds of other servers. I've already changed it for the next version, but I'm looking for a configuration change to fix this in the interim for the current installation.
If you know the format exactly, tell the application what it is - use DateTime.ParseExact
instead of just DateTime.Parse
. (And as others have said, specify the invariant culture as well, to take away any more variation.) That gives you much more control:
using System;
using System.Globalization;
class Test
{
static void Main()
{
Parse("2009-10-10 09:19:12.124");
Parse("2009-10-10 12:13:14.852");
Parse("2009-10-10 13:00:00");
Parse("2009-10-10 15:23:32.022");
}
static readonly string ShortFormat = "yyyy-MM-dd HH:mm:ss";
static readonly string LongFormat = "yyyy-MM-dd HH:mm:ss.fff";
static readonly string[] Formats = { ShortFormat, LongFormat };
static void Parse(string text)
{
// Adjust styles as per requirements
DateTime result = DateTime.ParseExact(text, Formats,
CultureInfo.InvariantCulture,
DateTimeStyles.AssumeUniversal);
Console.WriteLine(result);
}
}