Alkampfer's Place

Il blog di Gian Maria Ricci
posts - 659, comments - 871, trackbacks - 80

My Links

News

Gian Maria Ricci Mvp Logo CCSVI in Multiple Sclerosis

English Blog

Tag Cloud

Article Categories

Archives

Post Categories

Image Galleries

I miei siti

Siti utili

Attenzione ai formati delle date

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.

Print | posted on mercoledì 6 febbraio 2008 21:47 | Filed Under [ ASP.NET ]

Feedback

Gravatar

# re: Attenzione ai formati delle date

concordo al 100% - forse basterebbe usare la InvariantCulture come cultura standard per la comunicazione tre UI e backend. cosi eviti di chiamare sempre CreateSpecificCulture.
Inoltre occhio alla TimeZone - magari non e' un problema frequente in applicazioni semplici ma puo creare non pochi problemi - anche li consiglio conversione da/a UTC
in genere io consiglio formati + standard tipo qullo ISO yyyy-mm-ddThh:MM:ss.fffff
ad es. questo va bene anche in SQL ed e' anche un formato che va bene per XML

Ciao
Aldo
07/02/2008 10:13 | Aldo.NET
Gravatar

# re: Attenzione ai formati delle date

Il createSpecific culture lo ho messo nell'esempio per far vedere cosa succede quando si spostano dati con culture differenti.
:D solitamente uso sempre invariante poi a sql gli passo parametri in formato DateTime diretto per non avere problemi.
Alk.
07/02/2008 12:07 | Gian Maria
Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET