Christopher: .NET: DateTime.Parse

Hallo allerseits,

ich bin halb am verzweifeln. Und zwar geht es um die sprachabhaengige
Konvertierung eines Datumsformates, welches unter MySQL als
"DateTime"-Typ hinterlegt ist.
Es moechte mir einfach nicht gelingen.
Hier meine bisherigen Versuche. Jedes try/catch schlaegt fehl!

  
public static DateTime? Parse(string value)  
        {  
            int sucOneTime = -1;  
  
            DateTimeFormatInfo dtInfo = CultureInfo.CurrentCulture.DateTimeFormat;  
  
            // first  
            try  
            {  
                DateTime.Parse(value);  
                sucOneTime = 1;  
            }  
            catch (Exception) { }  
  
            // second  
            try  
            {  
                Convert.ToDateTime(value);  
                sucOneTime = 2;  
            }  
            catch (Exception) { }  
  
            // third  
            try  
            {  
                DateTime.Parse(value, dtInfo);  
                sucOneTime = 3;  
            }  
            catch (Exception) { }  
  
  
            // fourth  
            try  
            {  
                DateTime.Parse(value, CultureInfo.CurrentCulture);  
                sucOneTime = 4;  
            }  
            catch (Exception) { }  
  
            // fifth  
            try  
            {  
                Convert.ToDateTime(value, CultureInfo.CurrentCulture);  
                sucOneTime = 5;  
            }  
            catch (Exception) { }  
  
            // sixth  
            try  
            {  
                Convert.ToDateTime(value, dtInfo);  
                sucOneTime = 6;  
            }  
            catch (Exception) { }  
  
  
            if (sucOneTime <= 0)  
                throw new Exception("bla blub");  
  
  
            return null;  
        }  

Hat einer von euch vielleicht eine Idee wie ich das am besten
bewerkstelligen kann?

Besten Dank schonmal
Christopher

PS: Gab es nicht mal den Themenbereich "ASP"? Oder sind derartige
Fragen hier nicht mehr willkommen?

  1. public static DateTime? Parse(string value)

    => Wie schaut den dein Value den aus und wo kommt es den her???

    1. Hi,

      public static DateTime? Parse(string value)
      => Wie schaut den dein Value den aus und wo kommt es den her???

      Typisch, da vergisst man mal wieder das wichtigste Detail ;)

      Es stammt von einem DataTable und ist - abhaengig von der
      gewaehlten Sprache - zB 1/25/2007 2:00:31 PM.

      Allerdings habe ich jetzt eine temporaere Loesung erstellt.
      Da die Webanwendung lediglich fuenf Sprachen unterstuetzt
      versuche ich jedes Datum in die verfuegbaren Datumsformate
      zu casten. Angefangen beim Default-Datum.

        
      /// <summary>  
              /// Parses a string to a DateTime in consideration of a given DateTimeFormat  
              /// </summary>  
              /// <param name="value">the datetime value as string</param>  
              /// <param name="dtf">the localized DateTimeFormat</param>  
              /// <returns>DateTime if possible, otherwise null</returns>  
              public static DateTime? Parse(string value, DateTimeFormatInfo dtf)  
              {  
                  DateTime? ret = null;  
                  try  
                  {  
                      DateTime tmp = DateTime.Parse(value, dtf);  
                      ret = tmp;  
                  } catch(Exception) {}  
                  return ret;  
              }  
        
              /// <summary>  
              /// Tries to parse a given string representation of a DateTime to  
              /// a valid DateTime-object  
              /// </summary>  
              /// <param name="value">the value to parse</param>  
              /// <returns>DateTime represenation of $value if possible, otherwise null</returns>  
              public static DateTime? Parse(string value)  
              {  
                  DateTime? ret = null;  
        
                  ret = Parse(value, CultureInfo.GetCultureInfo("en-GB").DateTimeFormat);  
        
                  if (ret == null)  
                      ret = Parse(value, CultureInfo.GetCultureInfo("en-US").DateTimeFormat);  
        
                  if (ret == null)  
                      ret = Parse(value, CultureInfo.GetCultureInfo("de-DE").DateTimeFormat);  
        
                  if (ret == null)  
                      ret = Parse(value, CultureInfo.GetCultureInfo("en-IT").DateTimeFormat);  
        
                  if (ret == null)  
                      ret = Parse(value, CultureInfo.GetCultureInfo("fr-FR").DateTimeFormat);  
        
                  if (ret == null)  
                      ret = Parse(value, CultureInfo.GetCultureInfo("es-ES").DateTimeFormat);  
        
                  if(ret==null)  
                      ExceptionHandler.MailException("Can not convert '" + value + "' to a valid DateTime.", false);  
        
                  return ret;  
              }  
      
      
      1. Es stammt von einem DataTable und ist - abhaengig von der
        gewaehlten Sprache - zB 1/25/2007 2:00:31 PM.

        =>Wäre es den nicht einfacher das Datum unabhängig von der Sprache zu speichern und dann vorm anzeigen einfach zu formatieren???

        Möchtest du mit dem Datum noch arbeiten/was berechnen oder möchtest es nur anzeigen???

        1. Hi,

          =>Wäre es den nicht einfacher das Datum unabhängig von der Sprache zu speichern und dann vorm anzeigen einfach zu formatieren???

          Das tue ich ja, sicherlich.
          Doch konvertiert das DataTable das Datum automatisch hinsichtlich
          des aktuell eingestellten Locales.

          mfg

          1. Dann gib im DataSet eine fixe "locale" bzw. benutze DateTime und nicht eine string-Repräsentation des Datumswertes. Mit anderen Worten, du frickelst :)

            Cheers,
            Frank

            1. Hi,

              Dann gib im DataSet eine fixe "locale" bzw. benutze DateTime und nicht eine string-Repräsentation des Datumswertes. Mit anderen Worten, du frickelst :)

              OK, danke fuer eure Hilfe. Werde das heute auf die feine
              englsiche Art fixen ;-)

          2. Das tue ich ja, sicherlich.
            Doch konvertiert das DataTable das Datum automatisch hinsichtlich
            des aktuell eingestellten Locales.

            Morgen!!!

            Na dann kann es dir doch egal sein!!!

            Speichere das Datum doch einfach als (small)datetime und wenn du es ausgibst, machst einfach:

              
            ...  
            string strMyDate;  
              
            strMyDate = DeinDatumAlsDateTime.ToString(DeinDateFormat, DeineDateTimeFormatInfo)  
            ...  
            
            
  2. Hallo,

    ist der Input Wert für alle Sprachen immer im gleichen Format?
    Wer genau gibt ihnen diesen Wert? Warum ist er in mehreren Sprachen?
    DateTime ist normalerweise DateTime ... nur ToString(formatInfo) oder Parse(formatInfo) haben mit dem Thema Globalization zu tun. Warum bekommst du also einen String als Eingabe.

    Vielleicht solltest du dir auch mal anschauen, was in den Exceptions drin steht, die du schon immer abfängst. Evt ist es ein CAST problem von DateTime zu DateTime?  (DateTime? ist schliesslich eigentlich System.Nullable<System.DateTime>)

    Wenn du einen String nicht in ein DateTime-Objekt parsen kannst, solltest du eine spezielle Exception für genau diesen Grund bekommen, und nicht NULL (meine Meinung). DateTime ist bei default nicht NULLable. Nur DateTime?.

    Wenn du keine FormatInfo angiebst, dann probiert .net imho es mit alles Formaten der CurrentCulture selbst aus.

    Du könntest auch eine Liste von möglichen Kulturen erstellen und dann in einem Schleifchen abarbeiten, das erspart dir dieses hässliche if() ... if() ... if()

    PS: Gab es nicht mal den Themenbereich "ASP"? Oder sind derartige
    Fragen hier nicht mehr willkommen?

    Anscheinend nicht wirklich. Die Forumshoheiten haben befunden, dass man den Themenbereich "ASP" streichen muss um die Menge der möglichen zu signifikant reduzieren damit es für n00bs einfacher wird. Die Mehrheit der Forumsteilnehmer ist aber sowieso von der Anti-MS Fraktion ;)

    Ciao, Frank