2012-09-28 2 views
6

Nella mia applicazione ASP.NET uso il codice from here per trovare la data di costruzione dell'applicazione come UTC. Il valore UTC leggere dal file assembly viene formattato come segue:Perché lo stesso valore DateTime restituisce un tempo di visualizzazione diverso per utenti diversi?

//DateTime time  
return time.ToString("dd MMM yyyy HH:mm:ss"); 

Ora un utente apre la pagina servita da tale applicazione e vede

28 сен 2012 04:13:56 

e informa l'altro utente che apre la stessa pagina e vede

27 Sep 2012 12:14:32 

Entrambe le richieste sono serviti dalla stessa applicazione distribuita per pulire Windows Azure VM dallo stesso pacchetto, quindi è sicuramente esattamente lo stesso codice in esecuzione per entrambi gli utenti.

Chiaramente le stringhe sono formattate in modo diverso a causa della diversa localizzazione per le richieste da diversi utenti. Un utente vede il mese visualizzato come Sep e l'altro lo vede come сен (equivalente di Sep in russo).

Perché le ore differiscono? Sono anche regolati secondo un certo fuso orario che dipende dalla localizzazione?

+0

Beh, sì lo sono: il giorno e le ore sono diversi: ovviamente, quando sono le 4 di mattina del 28 settembre in Russia, è il 27 settembre da qualche altra parte (certamente nella parte occidentale della terra) ... ma che cos'è strano è che minuti/sec non dovrebbero cambiare – Kek

risposta

3

La spiegazione più ovvia è che i valori DateTime sono, infatti, diversi.

Il codice si è collegato utilizza GetCallingAssembly, e si dovrebbe notare che MSDN says che:

Se il metodo che chiama il metodo GetCallingAssembly è espansa in linea dal (JIT) just-in-time, o se chiamante è espansa in linea, il gruppo che viene restituito dalla GetCallingAssembly può differire in modo imprevisto

per eseguire il debug di questo, vorrei iniziare visualizzando time.Ticks e time.Kind: se questi sono identici, sai che è un problema di visualizzazione. Se sono diversi, devi vedere come stai generando il valore temporale.

+0

Sì, è tutto. Il codice che chiama la funzione che legge il timestamp era all'interno di .aspx che è precompilato sulla distribuzione effettiva. Quindi, a seconda che la chiamata sia in linea, sarà l'ora di compilazione o l'ora della precompilazione di ASP.NET. – sharptooth

+0

Ecco come disabilitare la funzione di inlining di una funzione specifica: http://stackoverflow.com/a/5169272/57428 – sharptooth