2012-03-20 13 views
7

Tengo un objeto DateTime y quiero mostrar la hora, minuto, segundo y segundo fraccional como una cadena que está localizada para la cultura actual.¿Cómo puedo convertir un DateTime en una cadena con segundos fraccionarios localizados?

Hay dos problemas con esto.

El primer problema es que no hay un formato estándar DateTime que muestre los segundos fraccionarios. Básicamente quiero saber cómo obtener el formato long time DateTime pero con fracciones de segundo.

Podría, por supuesto, obtener DateTimeFormatInfo.LongTimePattern y anexar ".fff" a ella y pasarlo a la DateTime.ToString(), pero algunos de los formatos específicos de cultivo, específicamente los Estados Unidos, con el fin de AM/PM. Entonces no es tan simple.

El segundo problema es que DateTime.ToString() no parece localizar el separador decimal numérico. Si decidiera simplemente obligar a cada cultura a usar un formato de tiempo personalizado codificado, aún no creará una cadena localizada ya que el separador decimal de números no será específico de una cultura.

Para complicar aún más las cosas, algunas culturas tienen formatos de fecha y hora que utilizan períodos como parte de su formateo. Esto hace que sea difícil colocar un marcador de posición, por ejemplo, el punto y reemplazarlo con un separador decimal específico de cultivo.

Por ahora han recurrido a esta solución:

string format = string.Format("HH:mm:ss{0}fff", 
    CultureInfo.CurrentCulture.NumberFormat.NumberDecimalSeparator); 
string time = DateTime.Now.ToString(format); 

que creo que debería funcionar para todas las culturas que no tiene el mismo separador decimal como separador de hora, pero eso es una suposición.

De Nota: Aunque sería bueno tener una solución a ambos problemas, para mi aplicación específica Estoy más interesado en la localización de un formato de fecha y hora personalizado con fracciones de segundo que el uso de un formato de fecha y hora estándar.

+0

No creo que ninguna convención cultural incluya fracciones de segundos. Su enfoque se ve bien, pero me gustaría obtener el LongTimePattern y sustituirlo por 'ss' para superar el problema AM/PM frente a HH. –

Respuesta

6

El primer problema es que no hay un formato de fecha y hora estándar que muestre los segundos fraccionarios. Básicamente, quiero saber cómo obtener el formato DateTime de larga duración, pero con segundos fraccionarios.

Puede considerar tomar el formato de longitud y sólo la sustitución ": ss" con ": ss.fff", posiblemente usando el separador decimal específico de la cultura:

string longPattern = culture.DateTimeFormat.LongTimePattern; 
if (!longPattern.Contains(":ss")) 
{ 
    // ???? Throw an exception? Test this with all system cultures, but be aware 
    // that you might see custom ones... 
} 
// Only do it if the long pattern doesn't already contain .fff... although if 
// it does, you might want to replace it using the culture's decimal separator... 
if (!longPattern.Contains(".fff")) 
{ 
    longPattern = longPattern.Replace(":ss", 
     ":ss" + culture.NumberFormat.DecimalSeparator + "fff"); 
} 
string timeText = time.ToString(longPattern, culture); 

Para complicar más las cosas , algunas culturas tienen formatos de fecha y hora que usan períodos como parte de su formateo. Esto hace que sea difícil colocar un marcador de posición, por ejemplo, el punto y reemplazarlo con un separador decimal específico de cultivo. Aparte de eso, debería terminar poniendo el valor en el lugar correcto. ¿Definitivamente siempre quiere tres dígitos, incluso si el valor es un segundo exacto (o medio segundo, etc.)? Use .FFF si no.

Sospecho que es la razón por el separador decimal específico de la cultura no se utiliza. Me resulta extraño, de hecho, he hecho que Noda Time se comporten de la misma manera, aunque soy not convinced it's right.

En última instancia, una gran cantidad de temas como este son fundamentalmente problemático: si el cultivo tiene ninguna manera fija de representar "una vez con fracciones de segundo" y que ha conseguido para representar fracciones de segundo, entonces lo mejor que Voy a poder hacer es un poco complicado.

+0

¿Es seguro asumir que todas las culturas usan: ss y no: s? Aunque veo que esto manejaría eso lanzando una excepción. – jcmcbeth

+0

@jcmcbeth: Pase. Tal vez. Puede verificarlo con bastante facilidad para todas las culturas del * sistema *, pero eso no impide que a alguien se le ocurra su propia configuración de cultura loca. –

2

creo que esto le dará algo cercano a lo que usted requiere

var now = DateTime.Now; 
var seconds = now.TimeOfDay.TotalSeconds % 60; 
var timeText = string.Format(CultureInfo.GetCultureInfo("fr-FR"), 
          "{0:d} {0:hh:mm:}{1:00.000}", now, seconds); 

o simplemente utilizar

var timeText = string.Format(CultureInfo.CurrentCulture, 
          "{0:d} {0:hh:mm:}{1:00.000}", now, seconds); 

Por ejemplo

  • fr-FR: 20/03/2012 10: 20: 10,088
  • es-ES: 20/03/2012 10: 21: 08.724
  • es-: 3/20/2012 10: 21: 24,470
+0

Creo que esta solución es más elocuente que la que proporcioné para cadenas con formato personalizado. – jcmcbeth

-1

Generalmente puedo cambiar la cultura actual y hacer la operación que necesito.

System.Globalization.CultureInfo before = System.Threading.Thread.CurrentThread.CurrentCulture; 
try 
{ 
    System.Threading.Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); 

    string timestr = DateTime.Now.ToString(); 
} 
catch (Exception ex) 
{ 
    Console.WriteLine(ex.Message); 
} 
finally 
{ 
    System.Threading.Thread.CurrentThread.CurrentUICulture = before; 
} 
+1

1) ¿Cómo resuelve esto el problema? 2) ¿Por qué crees que es mejor que pasar la cultura como parámetro a 'ToString'? – CodesInChaos

+0

Creo que con este método elegiste la cultura y luego solo puedes enfocarte en el problema de formateo. Sí, puedes pasar la cultura dentro de ToString(), pero si tienes más operaciones de formateo para hacer, me gusta usar mi camino. Es solo una opinión diferente – pluka

+0

El problema es que DateTime.ToString() no localiza el separador decimal o tiene un formato estándar que muestra fracciones de segundo. – jcmcbeth

Cuestiones relacionadas