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

Error:¿Qué está causando este comportamiento, en nuestro tipo C# DateTime?

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

Deseo saber lo que está sucediendo detrás de las escenas en las ToString(), etc para causar este comportamiento.

EDITAR Después de ver respuesta de Jon:

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

Resultado:

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

mismo resultado con el capital y pequeña 'o'. Estoy leyendo los documentos, pero aún no estoy claro.

+0

Adición 'CultureInfo.InvariantCulture' no ayudó: se produjo' esperado: 2011-10-31 12: 09: 51.928 Pero era: 2011-10-31 06: 39: 51.928 ' – Zasz

+0

Algunos de análisis lógica/a cadena lógica añadió 6 horas y 30 minutos al tiempo :( – Zasz

Respuesta

6

El valor por defecto es "G" - el formato de uso general, que tiene una fidelidad limitada. Si desea reproducir exactamente el , use el especificador de ida y vuelta, "O".

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

edité mi pregunta, incorporando tu idea, y el resultado es w Eird, todavía estoy desconcertado – Zasz

+1

@Zasz ¿por qué es el resultado extraño? Si * agrega * a la confusión que ha "esperado" y "real" al revés en su prueba ... ¿eso es todo lo que queremos decir aquí? –

+1

@Zasz intente también utilizar 'DateTime.Parse (s, null, DateTimeStyles.RoundtripKind)' –

9

Tener un vistazo a lo que produce dateTime.ToString() - que normalmente sólo es exacta a la segunda, aunque depende de los ajustes culturales. Si ToString() solo proporciona un resultado exacto a un segundo, no hay forma de que al analizar la cadena se pueda obtener más información ...

Puede usar la "o" standard format string para proporcionar una representación de cadena de acceso redondo. Por ejemplo, en el momento en que se produce algo así como:

2011-10-31T06:28:34.6425574Z 

EDIT: Es necesario analizar con el mismo especificador para obtener el mismo resultado de nuevo: especificador de formato

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

he editado mi respuesta, estoy en la India si eso ayuda – Zasz

+1

@Zasz:. Usted necesita decir a * * parse con ese especificador también .. . –

+1

1. Zasz, por favor lea el artículo de MSDN Jon vinculada a, especialmente la "o" y "u" formatos. No hay explicación detallada de cómo achevé ida y vuelta. –

Cuestiones relacionadas