posts - 644, comments - 2003, trackbacks - 137

My Links

News

Raffaele Rialdi website

Su questo sito si trovano i miei articoli, esempi, snippet, tools, etc.

Archives

Post Categories

Image Galleries

Blogs

Links

Occhio al bug del metodo DateTime.ToShortTimeString

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 ...

Print | posted on mercoledì 31 gennaio 2007 12:00 |

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET