2012-10-02 44 views
7

Estoy trabajando en una aplicación que se puede ver en muchos países del mundo. No hay muchos países que muestren horas, minutos y segundos con algo más que: como un separador, pero hay algunos y quiero asegurarme de que las horas estén formateadas correctamente para su región. DateTime es genial en esto pero TimeSpan no lo es. Estos fragmentos son de mi ventana inmediata en Visual Studio 2010 usando .Net 4 con mi región establecida en Malayalam (India). La llamada dateTime.Now también refleja cómo se muestra el tiempo en mi reloj, Microsoft Outlook y otras áreas.Formateo de TimeSpan en diferentes culturas

DateTime.Now.ToString() 
"02-10-12 17.00.58" 

http://msdn.microsoft.com/en-us/library/dd784379.aspx dice: "Si formatProvider es nulo, se utiliza el objeto DateTimeFormatInfo que se asocia con la cultura actual. Si el formato es una cadena de formato personalizado, el parámetro formatProvider se ignora." Es lógico que no necesite ni siquiera pasar el CultureInfo actual. El formato que quiero aquí es hh.mm.ss pero obvioulsy hh: mm: ss cuando en la mayoría de los otros idiomas, y si hay otras posibilidades, también debería reflejarlas automáticamente: básicamente TimeSpan debería ser culturalmente consciente, solo como DateTime es.

Sin embargo:

timeRemaining.ToString() 
"00:02:09" 
timeRemaining.ToString("c") 
"00:02:09" 
timeRemaining.ToString("c", CultureInfo.CurrentCulture) 
"00:02:09" 
timeRemaining.ToString("g") 
"0:02:09" 
timeRemaining.ToString("G") 
"0:00:02:09.0000000" 
timeRemaining.ToString("t") 
"00:02:09" 
timeRemaining.ToString("g", CultureInfo.CurrentCulture) 
"0:02:09" 
timeRemaining.ToString("g", CultureInfo.CurrentUICulture) 
"0:02:09" 
timeRemaining.ToString("G", CultureInfo.CurrentUICulture) 
"0:00:02:09.0000000" 
timeRemaining.ToString("G", CultureInfo.CurrentCulture) 
"0:00:02:09.0000000" 
timeRemaining.ToString("t", CultureInfo.CurrentCulture) 
"00:02:09" 

Busco una simple línea, solo a la salida de un lapso de tiempo de una manera cultura-Aware. Cualquier idea es apreciada.

Respuesta

4

Parece un error, puede informarlo en connect.microsoft.com. Mientras tanto, una solución alternativa es aprovechar el formato DateTime. De esta manera:

using System; 
using System.Globalization; 

class Program { 
    static void Main(string[] args) { 
     var ci = CultureInfo.GetCultureInfo("ml-IN"); 
     System.Threading.Thread.CurrentThread.CurrentCulture = ci; 
     var ts = new TimeSpan(0, 2, 9); 
     var dt = new DateTime(Math.Abs(ts.Ticks)); 
     Console.WriteLine(dt.ToString("HH:mm:ss")); 
     Console.ReadLine(); 
    } 
} 

Salida:

00.02.09

+0

Pero una solución mucho más simple si va a utilizar una cadena de formato es 'ts.ToString (" h '.' Mm '.' Ss ")'.Funciona desde .NET 4.0. Esto codifica el período del curso. Si desea utilizar el separador de tiempo de la cultura, léelo de 'CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator', colóquelo dentro de los apóstrofos y úselo junto con' h', 'mm' y' ss' en una cadena de formato para el 'TimeSpan'. –

+3

Es difícil ver cómo eso es "más simple". Ciertamente no será preciso con dicho código ignorando el formato de tiempo que el usuario especificó en el Panel de control. –

1

Esto es más como un comentario, pero necesita un poco de espacio, por lo que escribir como una respuesta.

Mientras que el formato de cadena de DateTime ha estado en .NET durante mucho tiempo, el formato de TimeSpan era nuevo en .NET 4.0 (Visual Studio 2010).

Un cultivo tiene un objeto DateTimeFormatInfo que es utilizado por DateTime e incluye información sobre si se debe utilizar de colon : o período de . o algo más entre horas, minutos y segundos. Ahora, TimeSpan no parece utilizar este objeto DateTimeFormatInfo, y no hay nada llamado "TimeSpanFormatInfo".

He aquí un ejemplo:

// we start from a non-read-only invariant culture 
Thread.CurrentThread.CurrentCulture = new CultureInfo(""); 

// change time separator of DateTime format info of the culture 
CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator = "<-->"; 

var dt = new DateTime(2013, 7, 8, 13, 14, 15); 
Console.WriteLine(dt); // writes "07/08/2013 13<-->14<-->15" 

var ts = new TimeSpan(13, 14, 15); 
Console.WriteLine(ts); // writes "13:14:15" 
1

Busco una simple línea, solo a la salida de un lapso de tiempo de una manera cultura-Aware.

entonces creo que es el mejor de la clase utilizando DateTime hacer el formato para usted:

string display = new DateTime(timespan.Ticks).ToLongTimeString(); 

Suponiendo que timespan sostiene una duración positiva entre 0 y 24 horas de duración.