.NET (3.5) formats times using dots instead of colons as TimeSeparator for it-IT culture?
According to Wikipedia (and confirmed in an answer by Dario Solera), in Italy they format times using colons:
The 24-hour notation is used in writing with a colon as a separator. Example: 14:05. The minutes a开发者_Python百科re written with two digits; the hour numbers can be written with or without leading zero.
However, running the following code seems to output dots:
using System.Globalization;
Thread.CurrentThread.CurrentCulture = new CultureInfo("it-IT");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("it-IT");
// Outputs "11.08"
Console.WriteLine(DateTime.Now.ToShortTimeString());
// Outputs "."
Console.WriteLine(new CultureInfo("it-IT").DateTimeFormat.TimeSeparator);
Is this a framework bug? What's the best way to "fix" it? TimeSeparator
is settable - should we just overwrite it before assigning to Thread.CurrentThread.CurrentCulture
etc.?
I can guarantee in Italy we use colons to separate hour and minute digits, and we use the 24-hour format. Wikipedia is correct (at least this time).
Your problem is likely that you're not setting the Thread's UI culture. Something like this should work:
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo("it-IT");
This seems to be a .NET 3.5 issue. In .NET 4.0 the code you posted uses a colon as expected. Seems like a strange breaking change between the framework versions, but seems like upgrading to .NET 4 will solve the problem.
The hours/minutes separator (TimeSeparator
) in Italy seems to be a .
, not a :
.
You are specifically formatting for the Italian culture, so it follows that this is what will be used.
In a DateTime
format string, the :
is a place holder for this separator - if the culture defines .
or ,
or anything else as the separator, that's what will be substituted when formatting the DateTime
with that culture.
Following from the conversation under Oded's answer, this is probably what you should be using:
var culture = CultureInfo.GetCultureInfo("it-IT");
var stringValue = new TimeSpan(100, 100, 100, 100, 100).ToString(null, culture);
var timespan = TimeSpan.Parse(stringValue, culture);
// Another example
var culture = CultureInfo.GetCultureInfo("it-IT");
var stringValue = DateTime.Now.ToString(null, culture);
var dateTime = DateTime.Parse(stringValue, culture);
精彩评论