2012-10-02 10 views
7

Ich arbeite an einer App, die in vielen Ländern der Welt gesehen werden kann. Es gibt nicht viele Länder, die Stunden, Minuten und Sekunden mit etwas anderem als: als Trennzeichen zeigen, aber es gibt ein paar und ich möchte sicherstellen, dass die Zeiten für ihre Region korrekt formatiert sind. DateTime ist großartig, aber TimeSpan ist es nicht. Diese Snippets stammen aus meinem unmittelbaren Fenster in Visual Studio 2010 mit .Net 4 mit meiner Region in Malayalam (Indien). Der Aufruf von dateTime.Now gibt außerdem an, wie die Uhrzeit auf meiner Uhr, in Microsoft Outlook und anderen Bereichen angezeigt wird. Formatieren TimeSpan in verschiedenen Kulturen

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

http://msdn.microsoft.com/en-us/library/dd784379.aspx sagt: „Wenn format null ist, das Datetime Objekt, das mit der aktuellen Kultur zugeordnet ist, wird verwendet. Wenn Format ein benutzerdefinierten Format-String ist, der format Parameter ignoriert.“ Es liegt nahe, dass ich die Current CultureInfo nicht einmal weitergeben muss. Das Format, das ich hier möchte, ist hh.mm.ss, aber natürlich hh: mm: ss in den meisten anderen Sprachen, und wenn es andere Möglichkeiten gibt, sollte es automatisch auch diese reflektieren - im Grunde sollte TimeSpan kulturbewusst sein wie DateTime ist.

jedoch:

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" 

Ich bin für eine einfache, einzelne Leitung zur Ausgabe einer Zeitspanne in einer Kultur-Aware Weise suchen. Irgendwelche Ideen werden geschätzt.

Antwort

4

Sieht aus wie ein Fehler, können Sie es auf connect.microsoft.com melden. In der Zwischenzeit können Sie die DateTime-Formatierung umgehen. Wie folgt aus:

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

Ausgang:

00.02.09

+0

Aber eine viel einfachere Problemumgehung, wenn Sie eine Formatzeichenfolge verwenden, ist 'ts.ToString (" h '.' Mm '.' Ss ")'.Funktioniert seit .NET 4.0. Dies codiert die Zeit natürlich. Wenn Sie das Zeittrennzeichen der Kultur verwenden möchten, lesen Sie es aus 'CultureInfo.CurrentCulture.DateTimeFormat.TimeSeparator', setzen Sie es in Apostrophe und verwenden Sie es zusammen mit' h', 'mm' und' ss' in einer Formatzeichenfolge für die 'Zeitspanne'. –

+3

Schwer zu sehen, wie das "einfacher" ist. Es ist sicherlich nicht korrekt mit solchen Code ignoriert das Zeitformat überschreibt, dass der Benutzer in der Systemsteuerung angegeben. –

1

Dies ist mehr wie ein Kommentar, aber etwas Platz braucht, so schreibe ich es als eine Antwort.

Während String-Formatierung von DateTime in .NET für eine sehr lange Zeit gewesen ist, war die Formatierung von TimeSpan neu in .NET 4.0 (Visual Studio 2010).

Eine Kultur hat ein DateTimeFormatInfo Objekt, das von DateTime verwendet wird und Informationen darüber, ob Kolon : oder Zeit nicht benutzen . oder etwas anderes zwischen Stunden, Minuten und Sekunden. Jetzt scheint TimeSpan dieses DateTimeFormatInfo Objekt nicht zu verwenden, und es gibt nichts, das als "TimeSpanFormatInfo" bezeichnet wird.

Hier ist ein Beispiel:

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

Ich bin für eine einfache, einzelne Leitung zur Ausgabe einer Zeitspanne in einer Kultur-Aware Weise suchen.

Dann denke ich Sie am besten sind die DateTime Klasse aus mit der Formatierung für Sie tun:

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

Unter der Annahme, dass timespan eine positive Dauer zwischen 0 und 24 Stunden lang hält.