2011-10-31 14 views
5
[Test] 
public void Sadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString()))); 
} 

Respinti:Che cosa sta causando questo comportamento, nel nostro tipo C# DateTime?

Expected: 2011-10-31 06:12:44.000 
But was: 2011-10-31 06:12:44.350 

Vorrei sapere che cosa sta accadendo dietro le quinte in ToString() ecc per causare questo comportamento.

EDIT Dopo aver visto Risposta di Jon:

[Test] 
public void NewSadness() 
{ 
    var dateTime = DateTime.UtcNow; 
    Assert.That(dateTime, Is.EqualTo(DateTime.Parse(dateTime.ToString("o")))); 
} 

Risultato:

Expected: 2011-10-31 12:03:04.161 
But was: 2011-10-31 06:33:04.161 

Stesso risultato con il capitale e piccole 'o'. Sto leggendo i documenti, ma non sono ancora chiaro.

+0

Aggiunta 'CultureInfo.InvariantCulture' non ha aiutato: ha prodotto' previsto: 2011-10-31 12: 09: 51,928 Ma era: 2011-10-31 06: 39: 51,928 ' – Zasz

+0

Alcuni di analisi logica/stringa logica aggiunta 6 ore e 30 minuti al tempo :( – Zasz

risposta

6

L'impostazione predefinita è "G" - il formato per uso generico, che ha una fedeltà limitata. Se si desidera riprodurre esattamente la stessa cosa, utilizzare lo specificatore di roundtrip, "O".

string s = dateTime.ToString("O", CultureInfo.InvariantCulture); 
Assert.That(dateTime, Is.EqualTo(DateTime.ParseExact(
     s, "O", CultureInfo.InvariantCulture, DateTimeStyles.RoundtripKind))); 
+0

Ho modificato il mio domanda, incorporando la tua idea - e il risultato è w Eird, Im ancora perplesso – Zasz

+1

@Zasz perché il risultato è strano? Se * aggiunge * alla confusione che hai "previsto" e "effettivo" nel modo sbagliato nel tuo test ... è tutto ciò che intendiamo qui? –

+1

@Zasz prova anche a usare 'DateTime.Parse (s, null, DateTimeStyles.RoundtripKind)' –

9

Dai un'occhiata a ciò che produce dateTime.ToString() - in genere sarà solo accurato al secondo, anche se dipende dalle impostazioni culturali. Se ToString() restituisce solo un risultato preciso a un secondo, non è possibile che l'analisi della stringa possa fornire ulteriori informazioni ...

È possibile utilizzare la "o" standard format string per fornire una rappresentazione di stringa round-trippable. Per esempio, nel momento in cui produce qualcosa come:

2011-10-31T06:28:34.6425574Z 

EDIT: è necessario analizzare con lo stesso identificatore per ottenere lo stesso risultato di nuovo: identificatore di formato

string text = dateTime.ToString("o"); 
// Culture is irrelevant when using the "o" specifier 
DateTime parsed = DateTime.ParseExact(text, "o", null, 
             DateTimeStyles.RoundtripKind); 
+0

Ho modificato la mia risposta, sono in India se questo aiuta. – Zasz

+1

@Zasz: è necessario dirlo a * parse * con quello specificatore anche .. –

+1

+1. Zasz, per favore LEGGI l'articolo MSDN Jon collegato a, in particolare i formati "o" e "u" C'è una spiegazione dettagliata su come effettuare il roundtrip –

Problemi correlati