2011-10-24 4 views
7

Il mio sito è ospitato su server multipli in diverse localitàproblema DateTime quando cultura globale del server è diverso su server diversi

Ovunque alla Cultura del formato dei dati è diversi- usiamo formato mm/dd/yyyy ogni dove, ma in caso di alcuni server la cultura è impostata su dd/mm/yyyy, quindi il nostro sito Web genera un'eccezione Datetime.

+4

per la persona che ha votato per chiudere perché "è difficile dire ciò che viene chiesto qui": che cosa sta confondendo si? –

risposta

11

si dovrebbe essere specificare quale la cultura che si desidera utilizzare ogni volta che si converte una stringa in una data.

La cultura si dovrebbe utilizzare dipende da ciò che la cultura le date sono formattati come.Ad esempio, se tutte le date si sta parsing sono formattati come slovacca:

String s = "24. 10. 2011"; 

allora avete bisogno di analizzare la stringa come se fosse in Slovacca (Slovacchia) (sk-SK) cultura:

//Bad: 
d = DateTime.Parse(s); 

//Good: 
d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("sk-SK")); //Slovak (Slovakia) 

Se sono tutte le date in tagika (Tagikistan cirillico), allora avete bisogno di analizzare come tg-Cryl-Tj:

String s = "24.10.11" 

DateTime d = DateTime.Parse(s, CultureInfo.CreateSpecificCulture("tg-Cryl-Tj")); 

che porta alla domanda: che cosa formato della data stai usando? Non dovresti affidarti alle impostazioni locali del server, dovresti decidere quale formato desideri.

//Bad 
String s = d.ToString(); 

//Good 
String s = d.ToString(CultureInfo.CreateSpecificCulture("si-LK")); //Sinhala (Sri Lanka) 

//s = "2011-10-24 12:00:00 පෙ.ව." 

sospetto che preferiate fare tutto in inglese. Ma poi si deve decidere quale variante della lingua inglese:

  • en-AU (Inglese Austrailia): 24/10/2011
  • en-IA (Inglese India): 24-10-2011
  • en-ZA (inglese Sud Africa): 2011/10/24
  • en-US (Inglese Stati Uniti): 10/24/2011

ho il sospetto che tu preferisco inglese (India) (en-IA).


Ma se davvero non si può decidere quale cultura da usare per la conversione date in stringhe e viceversa, e le date non sono mai destinate ad essere mostrato a un utente, quindi è possibile utilizzare il invariante Cultura:

String s = "10/24/2011" //invariant culture formatted date 

d = DateTime.Parse(s, CultureInfo.InvariantCulture); //parse invariant culture date 

s = d.ToString(CultureInfo.InvariantCulture); //convert to invariant culture string 
+0

grazie per la meravigliosa spiegazione – Murtaza

+1

Non dovresti mai usare impostazioni di cultura dal dominio o dal sistema operativo. Se qualcuno lo sostituisce per qualsiasi motivo (come un'altra app non funziona correttamente) l'applicazione smette di funzionare. Se il formato è sempre lo stesso, è necessario utilizzare tryparseexact o parseexact. – Peter

+0

Per tutto questo, su Windows 10 è di default il formato data sk senza spazi. – Fanda

0

Mai fare affidamento sulle impostazioni locali predefinite del server. Per il vostro caso, questo significa:

  • Usa preparato dichiarazioni in cui si passa la data come oggetto (non formattato) data e non come (formattata) oggetto stringa. Non si dovrebbe mai usare le stringhe per rappresentare date nella vostra applicazione in ogni caso, come non è possibile eseguire funzioni specifiche di data su di loro (come l'aggiunta di 1 mese, ottenendo l'ultimo giorno della settimana corrente, ecc)

  • funzioni
  • Usa SQL come to_date e to_char ovunque (i nomi esatti dipendono vostro DBMS), se si realmente bisogno di utilizzare oggetti stringa nell'applicazione

+0

soluzione semplice e comprensiva, ma Ian Boyd ha spiegato perché dovremmo lavorare su questo Parsing. Grazie a tutti e due. – Murtaza

1

mai, mai, date memorizzare internamente come stringhe. Non nel database, non nella tua app.

Se è necessario spostare i valori di data tra i server, andare binario. O se davvero devi usare le stringhe, usa ToString(CultureInfo.InvariantCulture) - o semplicemente serializza la proprietà Ticks.

Inoltre, non passeranno le date come stringhe al database utilizzando SQL comandi che si costruisce utilizzando il codice. Utilizzare SqlParameter per questo, o ancora meglio, fare affidamento su alcuni O/R Mapper, come Entity Framework o Linq to SQL.

0

Se distribuito a un server che non è sotto il vostro controllo è di vitale importanza per assicurarsi che il codice non ha dipendenze hard-coded sulla cultura.

che molto probabilmente vuole cercare il codice per DateTime.Parse o simili. Abbiamo un set di metodi di estensione su DateTime che usiamo invece per forzare la cultura corretta.

Problemi correlati