2010-09-13 11 views
5

Sto scrivendo una webapp abbastanza grande in asp.net/c# con MSSQL 2008 r2 che serve il database. Il programma deve convertire stringhe date/time (in formato data ISO) a DateTime dove vengono utilizzate e successivamente memorizzate come smalldatetime in sql.La conversione da e in data/ora aggiunge un'ora?

Quando le stringhe vengono convertite in datetimes, viene aggiunto misteriosamente al risultato un hour. Comprendo che, essendo nel Regno Unito, siamo soggetti all'ora legale (attualmente attiva) ma sicuramente il metodo datetime .convert lo capisce? Quando si converte di nuovo in una stringa, il risultato è come previsto.

Ho scritto un piccolo programma per illustrare il problema (anche comprese le date ISO non per la mia sanità mentale):

class Program 
{ 


    static void Main(string[] args) 
    { 
     //BB(); 
     //Dist(); 
     DateTime d1 = new DateTime(); 
     DateTime d2 = new DateTime(); 
     string d1s = "2010-09-13T09:30:01Z"; 
     string d2s = "2010-09-13 09:30:01"; 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("d1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     d1s = d1.ToString("u"); d2s = d2.ToString("u"); 

     Console.WriteLine("\nd1: {0}", d1s); 
     Console.WriteLine("d2: {0}", d2s); 

     d1 = Convert.ToDateTime(d1s); 
     d2 = Convert.ToDateTime(d2s); 

     Console.WriteLine("\nd1s:{0} d1:{1} ", d1s, d1); 
     Console.WriteLine("d2s:{0} d2:{1} ", d2s, d2); 

     Console.Read(); 
    } 
} 

Ecco i risultati che ottengo quando ho eseguito il programma:

d1s:2010-09-13T09:30:01Z d1:13/09/2010 10:30:01 
d2s:2010-09-13 09:30:01 d2:13/09/2010 09:30:01 

d1: 2010-09-13 10:30:01Z 
d2: 2010-09-13 09:30:01Z 

d1s:2010-09-13 10:30:01Z d1:13/09/2010 11:30:01 
d2s:2010-09-13 09:30:01Z d2:13/09/2010 10:30:01 
Done 

È questo il comportamento corretto? Sono un idiota? Mi sarei aspettato la conversione di datetime in stringa e quindi la stringa esatta di ritorno a datetime avrebbe restituito l'input originale. Se questo è il comportamento corretto, qualche idea su come ottenere un risultato coerente, ma usando ancora Convert.ToDateTime()?

Molte grazie.

risposta

11

La "Z" alla fine del datetime significa "Zulu" (equivalente di UTC/GMT). Di default, quando converti una stringa con quella alla fine, la convertirà in ora locale (+ 1 ora nel tuo caso).

Senza la 'Z' .NET assumerà che la data sia già nel formato corretto e non aggiunga l'ora.

Quando si formatta il datetime in una stringa, si utilizza la stringa di formato "U". Questo sta dicendo a .NET che è un tempo UTC e dovrebbe essere formattato in tale. Pertanto aggiunge la 'Z' alla fine. Quando lo converti in una data, viene aggiunta un'altra ora per renderla locale.

per chiarire:

d1: inizia come una stringa UTC -> ora locale (+ 1 ora) -> stringa UTC -> ora locale (1 ora)

d2: inizia come un locale stringa -> ora locale (nessuna modifica) -> stringa UTC -> ora locale (+ 1 ora)

+0

Ah, quindi l'eliminazione della "Z" risolverà le cose. Devo eseguire alcune operazioni di sostituzione delle stringhe in quanto questo è il formato in cui viene inserito. (Modifica - sì, sembra che sia stato corretto.) –

Problemi correlati