2010-05-11 14 views
6

que trato de analizar una cadena que contiene milisegundos como esto:El análisis de un DateTime que contiene milisegundos falla para ciertas culturas. ¿Por qué?

string s = "11.05.2010 15:03:08.7718687"; // culture: de-CH 
DateTime d = DateTime.Parse(s); // works 

Sin embargo, por ejemplo, bajo la des-de locale, el separador decimal es una coma (no un punto). Así se convierte en el ejemplo:

string s = "11.05.2010 15:03:08,7718687"; // culture: de-DE (note the comma) 
DateTime d = DateTime.Parse(s); // throws a FormatException 

Es raro para mí que DateTime.Parse (s) se debe lanzar una FormatException ahora, ya que se supone que debe utilizar el CultureInfo.CurrentCulture para hacer el análisis. Incluso pasar CurrentCulture como un argumento explícitamente tampoco ayuda. ¿Alguien tiene una idea de por qué esto no funciona? ¿El análisis no tiene en cuenta el NumberFormatInfo.NumberDecimalSeparator?

+1

En los días anteriores al formato de segundo sub-segundo se estandarizó (ISO 8601: 2004 lo hizo), entonces no importaba lo que era el separador. Por lo tanto, los estándares generalmente no cubren lo que se debe usar como el punto decimal para los segundos tiempos. No está claro que la información del formato numérico sea correcta, pero no necesariamente hay una mejor alternativa. Hemos estado luchando con el tema recientemente (en un contexto completamente diferente, no en las plataformas de Windows), y aún no encontramos un buen sistema para ello. Además, la compatibilidad hacia atrás (in) nos está dando algunos dolores de cabeza. –

Respuesta

4

DateTimeFormatInfo se aplica al formato/fechas de análisis, no NumberFormatInfo. DateTimeFormatInfo no define un separador de "segundos/milisegundos" que puede ser sobrecargado por diferentes culturas.

Ninguno de los Standard Date and Time format strings muestra los milisegundos, excepto el de ida y vuelta, que no parece ser sensible a la cultura de todos modos. Por lo tanto, no debería aparecer una cadena en ese formato, a menos que su propio código lo esté generando. Si sabe que su código va a generar fechas en ese formato, puede proporcionar una cadena de formato personalizado que use la coma como separador entre segundos y milisegundos.

+2

De hecho, reflejar el método DateTime.Parse finalmente conduce a este fragmento de código: char ch2 = str.Value [str.Index]; if (ch2 == '.') { ParseFraction (ref str, out raw.fraction); } Lo que me permite creer que '.' siempre es la elección correcta y no hay estándares oficiales para un separador decimal por milisegundos (al menos no en el mundo .NET) ... – Dejan

Cuestiones relacionadas