Announcement

Collapse
No announcement yet.

Probleme mit DateTimeFormatInfo

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Probleme mit DateTimeFormatInfo

    Hallo,

    habe eine Anwendung geschrieben, die einen Zeitstempel mit Zehntelsekunden ausgibt. Dazu habe ich die CultureInfo.CurrentCulture (es sollen die länderspezifeschen Einstellungen berücksichtigt werden) geklont und die DateTimeFormatInfo.LongTimePattern - Eigenschaft geändert (in etwa wie im folgendem Codebeispiel).
    Code:
    static void Main(string[] args)
    {
    	Console.WriteLine("Change and Test CultureInfo");
    
    	ChangeAndTestCultureInfo(System.Globalization.CultureInfo.InvariantCulture);
    	ChangeAndTestCultureInfo(System.Globalization.CultureInfo.CurrentUICulture);
    	ChangeAndTestCultureInfo(new System.Globalization.CultureInfo("de-at"));
    	ChangeAndTestCultureInfo(new System.Globalization.CultureInfo("de-de"));
    	ChangeAndTestCultureInfo(new System.Globalization.CultureInfo("en-gb"));
    	ChangeAndTestCultureInfo(new System.Globalization.CultureInfo("en-us"));
    
    	Console.ReadLine();
    }
    
    static void ChangeAndTestCultureInfo(System.Globalization.CultureInfo ci)
    {
    	System.Globalization.CultureInfo ci_ch,ci_ro;
    
    	ci_ch = ci.Clone() as System.Globalization.CultureInfo;
    	ci_ch.DateTimeFormat.LongTimePattern = ci_ch.DateTimeFormat.LongTimePattern.Replace("ss","ss.f");
    	ci_ro = System.Globalization.CultureInfo.ReadOnly(ci_ch);
    
    	Console.WriteLine();
    	Console.WriteLine("or: {0}; {1}; {2}",
    		ci,ci.DateTimeFormat.LongTimePattern,DateTime.Now.ToString("G",ci));
    	Console.WriteLine("ch: {0}; {1}; {2}",
    		ci_ch,ci_ch.DateTimeFormat.LongTimePattern,DateTime.Now.ToString("G",ci_ch));
    	Console.WriteLine("ro: {0}; {1}; {2}",
    		ci_ro,ci_ro.DateTimeFormat.LongTimePattern,DateTime.Now.ToString("G",ci_ro));
    }
    Unter VS 2003 / Framework 1.1 hat die Ausgabe ohne Beanstandung funktioniert.
    Code:
    or: ; HH:mm:ss; 07/20/2007 08:22:25
    ch: ; HH:mm:ss.f; 07/20/2007 08:22:25.5
    ro: ; HH:mm:ss.f; 07/20/2007 08:22:25.5
    
    or: de-DE; HH:mm:ss; 20.07.2007 08:22:25
    ch: de-DE; HH:mm:ss.f; 20.07.2007 08:22:25.5
    ro: de-DE; HH:mm:ss.f; 20.07.2007 08:22:25.5
    
    or: de-AT; HH:mm:ss; 20.07.2007 08:22:25
    ch: de-AT; HH:mm:ss.f; 20.07.2007 08:22:25.5
    ro: de-AT; HH:mm:ss.f; 20.07.2007 08:22:25.5
    
    or: de-DE; HH:mm:ss; 20.07.2007 08:22:25
    ch: de-DE; HH:mm:ss.f; 20.07.2007 08:22:25.5
    ro: de-DE; HH:mm:ss.f; 20.07.2007 08:22:25.5
    
    or: en-GB; HH:mm:ss; 20/07/2007 08:22:25
    ch: en-GB; HH:mm:ss.f; 20/07/2007 08:22:25.5
    ro: en-GB; HH:mm:ss.f; 20/07/2007 08:22:25.5
    
    or: en-US; h:mm:ss tt; 7/20/2007 8:22:25 AM
    ch: en-US; h:mm:ss.f tt; 7/20/2007 8:22:25.5 AM
    ro: en-US; h:mm:ss.f tt; 7/20/2007 8:22:25.5 AM
    Unter VS 2005 / Framework 2.0 und nur bei der österreichischen Kultur lässt sich die Änderung nicht schreibschützen.
    Code:
    or: ; HH:mm:ss; 07/20/2007 08:23:07
    ch: ; HH:mm:ss.f; 07/20/2007 08:23:07.3
    ro: ; HH:mm:ss.f; 07/20/2007 08:23:07.3
    
    or: de-DE; HH:mm:ss; 20.07.2007 08:23:07
    ch: de-DE; HH:mm:ss.f; 20.07.2007 08:23:07.3
    ro: de-DE; HH:mm:ss.f; 20.07.2007 08:23:07.3
    
    or: de-AT; HH:mm:ss; 20.07.2007 08:23:07
    ch: de-AT; HH:mm:ss.f; 20.07.2007 08:23:07.3
    ro: de-AT; HH:mm:ss; 20.07.2007 08:23:07
    
    or: de-DE; HH:mm:ss; 20.07.2007 08:23:07
    ch: de-DE; HH:mm:ss.f; 20.07.2007 08:23:07.3
    ro: de-DE; HH:mm:ss.f; 20.07.2007 08:23:07.3
    
    or: en-GB; HH:mm:ss; 20/07/2007 08:23:07
    ch: en-GB; HH:mm:ss.f; 20/07/2007 08:23:07.3
    ro: en-GB; HH:mm:ss.f; 20/07/2007 08:23:07.3
    
    or: en-US; h:mm:ss tt; 7/20/2007 8:23:07 AM
    ch: en-US; h:mm:ss.f tt; 7/20/2007 8:23:07.3 AM
    ro: en-US; h:mm:ss.f tt; 7/20/2007 8:23:07.3 AM
    Gibt es hierfür eine plausible Erklärung? Ist in meinem Lösungsansatz ein Fehler bzw. gibt es einfachere/schönere Lösungen?

    Die einfachste Variante wäre, den schreibschutz nicht zu aktivieren (hätte aber schon gerne, das niemand diese spezielle Kultur ändern kann).

    Für eine Hilfestellung wäre ich sehr dankbar.

    lg, Wolfgang

  • #2
    Bei mir verhält er sich so bei der "de-de" Culture und der CurrentUICulture.
    Wenn ich meine Regionaleinstellungen(Systemsteuerung) auf "en-gb" ändere
    verhält sich diese so und "de-de" wieder so wie du es erwartest.


    Warum sich das so verhält? Keine Ahnung - hab nur das hier gefunden.
    http://blogs.msdn.com/michkap/archiv...14/531621.aspx


    Wofür soll das Readonly setzen überhaupt gut sein?
    Wer sollte den die Kopie einer Culture in deiner Anwendung ändern, außer du oder einer deiner Kollegen.
    Wenn du das verhindern willst kannst du dir ja eine Fassadenklasse schreiben die das nachträgliche verändern blockt.

    Comment


    • #3
      Hallo Ralf,

      danke für deine Unterstützung. Ich hätte mir zwar einen Fehler meinerseits gewünscht, aber was solls.

      Wofür soll das Readonly setzen überhaupt gut sein?
      Die Culture ist in einer dll und wird von anderen Anwendungen benützt. Sie sollte einen Vorschlag zur Ausgabe bieten. Und deshalb wollte ich sie schreibschützen wie die CurrentCulture. Aber wenn das so nicht geht, ...

      lg, Wolfgang

      Comment

      Working...
      X