Spesso mi capita di vedere persone alle prese con problemi di formato di date, in particolare nelle applicazioni web. Nello specifico ci sono cose che sconsiglio vivamente, come ad esempio memorizzare le date in un database in un campo varchar. I Campi DateTime e soprattutto il tipo di dato DateTime serve a gestire le date, per cui sempre meglio usare quello che usare stringhe.
Quando la conversione in stringa è inevitabile, come ad esempio quando dovete passare date tramite querystring, un altro errore comune è quello di usare il ToString() e poi il Parse o TryParse, il problema deriva dal fatto che in asp.net la cultura dell'UI può essere impostata in modo che sia la stessa della lingua del browser utilizzato, se convertite una data in stringa da un thread della ui, la salvate da qualche parte e poi magari la riprendete da un servizio che esegue task in background ecco che sorgono problemi, perché il servizio utilizzerà per default i formati della lingua impostata nella macchina. Ricordate quindi di convertire le date in stringa e viceversa sempre con lo stesso formato. La soluzione è utilizzare sempre uno stesso formato, cosa molto semplice se si ricorda che il ToString ha un metodo in overload che accetta un IFormatProvider
String converted;
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("IT-it");
converted = now.ToString();
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("EN-en");
DateTime parsed;
try {
parsed = DateTime.Parse(converted);
Console.WriteLine(parsed);
} catch (FormatException fex) {
Console.WriteLine("Impossibile convertire {0} in data", converted);
}
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("IT-it");
converted = now.ToString(CultureInfo.InvariantCulture);
System.Threading.Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("EN-en");
parsed = DateTime.Parse(converted, CultureInfo.InvariantCulture);
Console.WriteLine("{0:D}", parsed);
Console.ReadKey();
Nello snippet si fa vedere cosa succede se si converte una data in stringa e poi cambia la cultura del thread, la seconda parte dello snippet invece utilizza la cultura invariante, per cui qualsiasi sia la cultura corrente per il thread il formato non cambia e la data può essere convertita da e in una stringa senza problemi.
Alk.