Non è una novità ma è facile comunque ricaderci. Il DateTime ha il metodo ToShortTimeString che restituisce l'ora in formato stringa.
Tutto bene se non fosse per due nazioni: Faroe Islands e Italia. Già queste sono le uniche due nazioni che non si sono adeguate allo standard ISO 8601 che prevede i ":" come separatore. Altre nazioni come la Germania hanno da tempo fatto il salto, che comunque deve essere stato indolore visto che in pratica i due punti vengono usati ovunque, Italia compresa.
Qual'è il problema? Nonostante ufficialmente viviamo con il ".", in realtà la maggior parte di produttori software italiani usano solo ":" e quindi è frequente trovare PC che abbiano il separatore dell'ora customizzato su ":" e ovviamente regional settings italiani. In questa configurazione, pur avendo customizzato il separatore a ":", il CLR restituisce "." come separatore, sbagliando la rappresentazione a stringa.
Ecco un piccolo test in una applicazione console:
static void Main(string[] args)
{
DateTime now = DateTime.Now;
Console.WriteLine("Short \t{0}\t\r\nLong \t{1}\r\n", now.ToShortTimeString(), now.ToLongTimeString());
TestTimeFormat(System.Threading.Thread.CurrentThread.CurrentCulture);
TestTimeFormat(System.Threading.Thread.CurrentThread.CurrentUICulture);
Console.ReadLine();
}
static void TestTimeFormat(System.Globalization.CultureInfo ci)
{
System.Globalization.DateTimeFormatInfo dtfi = ci.DateTimeFormat;
string strTime = string.Format("Language \t{0}\r\nLongTimePattern \t{1}\r\nShortTimePattern\t{2}\r\nTimeSeparator \t{3}\r\n",
ci.DisplayName, dtfi.LongTimePattern, dtfi.ShortTimePattern, dtfi.TimeSeparator);
Console.WriteLine(strTime);
}
Il risultato è il seguente:
Short 16.37
Long 16:37:17
Language Italian (Italy)
LongTimePattern H:mm:ss
ShortTimePattern H.mm
TimeSeparator :
Grazie al carissimo Aldo, ho capito che il problema sta nel fatto che Windows non ha la concezione del ShortTimePattern e il CLR non usa il separatore dell'ora ma un formato legato allo standard che il paese (Italia) ha dichiarato di voler usare.
Il bug quindi c'è ma il workaround è semplice ed è quello di usare ToString("HH:mm"), ricordandosi che i ":" nella stringa di formattazione non stanno per ":" ma per il separatore che è stato specificato nel control panel. Quindi anche usando un separatore differente da ":", questo sistema funziona comunque.
Ma alla fine il vero punto è: perché lo standard ISO non è stato ratificato dall'Italia? L'accidia è un vizio capitale ...