2012-10-02 4 views
7

Je travaille sur une application qui peut être vu dans de nombreux pays dans le monde. Il n'y a pas beaucoup de pays qui affichent des heures, minutes et secondes avec autre chose que: en tant que séparateur mais il y en a quelques-uns et je veux m'assurer que les heures sont correctement formatées pour leur région. DateTime est génial mais TimeSpan ne l'est pas. Ces extraits proviennent de ma fenêtre immédiate dans Visual Studio 2010 en utilisant .Net 4 avec ma région définie sur Malayalam (Inde). L'appel dateTime.Now reflète également comment l'heure est affichée sur mon horloge, Microsoft Outlook et d'autres zones.Mise en forme TimeSpan dans différentes cultures

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

http://msdn.microsoft.com/en-us/library/dd784379.aspx Says « Si formatProvider est nul, l'objet DateTimeFormatInfo qui est associé à la culture actuelle est utilisée. Si le format est une chaîne de format personnalisé, le paramètre formatProvider est ignoré. » Il va de soi que je ne devrais même pas passer dans le Current CultureInfo. Le format que je veux ici est hh.mm.ss mais hh: mm: ss quand dans la plupart des autres langues, et s'il y a d'autres possibilités, cela devrait automatiquement refléter ceux-là aussi - en gros TimeSpan devrait être culture-Aware, juste comme DateTime est.

Cependant:

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" 

Je suis à la recherche d'un simple, seule ligne à la sortie d'un timeSpan d'une manière de culture-Aware. Toutes les idées sont appréciées.

Répondre

4

Cela ressemble à un bug, vous pouvez le signaler à connect.microsoft.com. En attendant, une solution de contournement consiste à tirer parti de la mise en forme DateTime. Comme ceci:

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(); 
    } 
} 

Sortie:

00.02.09

+0

Mais une solution de contournement beaucoup plus simple si vous allez utiliser une chaîne de format est 'ts.ToString (" h '.' Mm '.' Ss ")'.Fonctionne depuis .NET 4.0. Ce dur-codes la période de cours. Si vous voulez utiliser le séparateur de temps de la culture, lisez-le dans 'CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator', placez-le dans apostrophes et utilisez-le avec' h', 'mm' et' ss' dans une chaîne de format pour le 'TimeSpan'. –

+3

Difficile de voir comment c'est "plus simple". Il ne sera certainement pas précis avec un tel code en ignorant les substitutions de format de temps que l'utilisateur spécifié dans le Panneau de configuration. –

1

Cela ressemble plus à un commentaire, mais a besoin d'un peu d'espace, donc je l'écrire comme une réponse.

Alors que la mise en forme de chaîne de DateTime a été dans .NET depuis très longtemps, la mise en forme de TimeSpan était nouveau dans .NET 4.0 (Visual Studio 2010).

Une culture a un objet DateTimeFormatInfo qui est utilisé par DateTime et comporte des informations sur l'opportunité d'utiliser du côlon ou de la période :. ou quelque chose d'autre entre les heures, minutes et secondes. Maintenant, TimeSpan ne semble pas utiliser cet objet DateTimeFormatInfo, et il n'y a rien appelé "TimeSpanFormatInfo".

Voici un exemple:

// 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

Je suis à la recherche d'un simple, seule ligne à la sortie d'un timeSpan d'une manière de culture-Aware.

Je pense que vous êtes mieux en utilisant la classe DateTime pour faire la mise en forme pour vous:

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

En supposant que timespan détient une durée positive entre 0 et 24 heures.