Laden...

DateTime.ParseExact - unbekanntes Datumsformat

Erstellt von NiceMen vor 16 Jahren Letzter Beitrag vor 16 Jahren 1.576 Views
N
NiceMen Themenstarter:in
67 Beiträge seit 2006
vor 16 Jahren
DateTime.ParseExact - unbekanntes Datumsformat

Hallo Jungs und Mädels,

ich habe da mal ein eine kleine Frage an euch.

Ich habe eine Datenbankspalte Datum ( Typ: String ), welches vom Benutzer mit einem Datumsstempel gefüllt wird.
Z.B. 08.04.2008
04/08/2008
20080408
08042008
2008-04-08
08-04-2008
usw.

Nun würde ich gern mit
DateTime.ParseExact den jeweiligen String in ein gültiges DateTime Objekt konvertieren und diesen dann mit .ToString( "dd.MM.yyyy" ) ausgeben.

Solange ich das Format kenne funktioniert das ganze auch.
Wenn ich aber das Format nicht weiß, was mache ich dann.
Ein TryParse usw. möchte ich eigentlich nicht machen.

Gibt es soetwas wie

DateTime.ParseExact( myDate, string[] ich enthalte alle möglichen Datums-Formate, DateTimeStyle welches mit allen möglichen Formaten funktioniert )

Gelöschter Account
vor 16 Jahren

warum möchtest du kein tryparse nehmen? es wurde genau wegen solchen anforderungen eingeführt.

J
3.331 Beiträge seit 2006
vor 16 Jahren

Gibt es soetwas wie

Mir fehlt bei diesem Schlusssatz die richtige grammatikalische Formatierung (deshalb verstehe ich nicht, was Du damit sagen willst); aber das ist doch genau das, wonach Du suchst:

**DateTime.ParseExact-Methode (String, String[], IFormatProvider, DateTimeStyles) **
Konvertiert die angegebene Zeichenfolgenentsprechung einer Datums- und Uhrzeitangabe unter Verwendung des angegebenen Formatarrays, der kulturabhängigen Formatierungsinformationen und des Stils in die entsprechende DateTime. Das Format der Zeichenfolgenentsprechung muss mindestens einem der angegebenen Formate genau entsprechen.

Jürgen

N
NiceMen Themenstarter:in
67 Beiträge seit 2006
vor 16 Jahren

Hallo juetho,

DateTime.ParseExact-Methode (String, String[], IFormatProvider, DateTimeStyles)

Den ersten String habe ich.

Das Array String[] habe ich nicht!

So etwas wie [ "dd.MM.yyyy", "MM/dd/yyyy", usw. ]
habe ich nicht.

Ich weiß nicht, welches Format in der Datenbank stehen wird,
also brauche ich ein Array String[ alle möglichen Datumsformate ].

Es muss kulturunabhänig sein.

Ziel wäre, man nimmt eine String Array aus allen möglichen Datumsformaten der Welt,
sagt per DateTime.ParseExact erstelle mir aus dem String ein gültiges Datum und
Formatiere mir dieses gültige Datum dann mit .ToString( "dd.MM.yyyy" )

N
NiceMen Themenstarter:in
67 Beiträge seit 2006
vor 16 Jahren

Hallo JAck30lena,

Gegeben ist eine Stringwert der einen Datumstempel enthällt.
Dies ist Fakt. Entweder null oder Datum.

Also will ich nicht mit TryParse das Datum überprüfen, sondern ich möchte mir
ParseExact den String wieder in ein DateTime Objekt konvertieren zur Weiterverarbeitung.

Da ich aber nicht weiß, welches weltweite gültige Datumsformat der String ist,
kann ich nicht einfach sagen DateTime.ParseExact 🙁

Meine Idee wäre es durch alle CulturInfo() zu gehen, das jeweilige Format in Sring[] zu speichern und dann zu verwenden.

Frage ist nur, ob es das nicht schon gibt.


using System;
using System.Collections.Generic;
using System.Text;
using System.Globalization;

namespace ConsoleApplication1
{
	class Program
	{
		static void Main( string[] args )
		{

			string[] dateFormats = new string[ 116 ];

			int i = 0;

			foreach ( CultureInfo ci in CultureInfo.GetCultures( CultureTypes.InstalledWin32Cultures ) )
			{
				dateFormats[ i ] = ci.DateTimeFormat.ShortDatePattern;
				Console.WriteLine( ci.DateTimeFormat.ShortDatePattern );
				i++;
			}

		}

	}

}

ergibt




D
500 Beiträge seit 2007
vor 16 Jahren

Hi!

Wäre es nicht sinnvoll an der Wurzel des Übels zu arbeiten, d.h. es zu vermeiden einen Kultur behafteten string in der Datenbank zu speichern (Stichwort invariant culture)?

Gruß, DaMoe

N
NiceMen Themenstarter:in
67 Beiträge seit 2006
vor 16 Jahren

@DaMoe80

dein Wort in Admins Ohr 🙂

Leider habe ich darauf keinen Einfluss.

Ein Multikulti Unternehmen hat halt oft solche schlecht DB Designs 🙁

Vorerst muss ich damit Leben, dass ich eine Menge von Datumsformaten bekomme. Diese dann ordentlich anzuzeigen ist nun eine Herausforderung 🙂

Gelöschter Account
vor 16 Jahren
  1. tryparse überprüft nicht nur ob es geht. es gibt dir auch ein gültiges datetime wenn es geht.
  2. parseexakt nimmt wie juetho bereits beschrieben hat als zweites argument ein array von strings mit MÖGLICHEN formaten.
  3. kann man immernoch mit parse versuchen einfach zu parsen um zu schauen was dabei herauskommt.

also: wenn du nur bestimmte formate erlaben willst, dann nimm parseexakt (wie der name schon sagt)
wenn du einfach parsen möchtest, dann nimm tryparse und hoffe das er das format erkennt.

edit: meines erachtens solltest du dir folgende schlagwürter nochmal genauer ansehen:
ref/out
arrays in c#
DateTime

4.942 Beiträge seit 2008
vor 16 Jahren

Alle möglichen Formate einwandfrei auseinander zu halten ist schon mal nicht möglich, z.B.
en-gb: dd/mm/yyyy
en-us: mm/dd/yyyy

Du kannst zwar jetzt den String parsen (z.B. '01/04/2008'), aber ist das jetzt der 1.April oder der 4. Januar???

Gelöschter Account
vor 16 Jahren

was mir noch eingefallen ist:

Ich weiß nicht, welches Format in der Datenbank stehen wird

aber du kannst herausfinden welche culture die datenbank hat. diese brauchst du dann nur noch zu verwenden.

N
NiceMen Themenstarter:in
67 Beiträge seit 2006
vor 16 Jahren

Alle möglichen Formate einwandfrei auseinander zu halten ist schon mal nicht möglich, z.B.
en-gb: dd/mm/yyyy
en-us: mm/dd/yyyy

Du kannst zwar jetzt den String parsen (z.B. '01/04/2008'), aber ist das jetzt der 1.April oder der 4. Januar???

Super, dieses Zitat hat mir gefehlt, damit werde ich nun Morgen dem Admin seine Argumente um die Ohren hauen.

Es macht einfach keinen Sinn, mehrere Formate in die DB zu speichern.

Ein Format wie z.B.

yyyyMMddHHmmss reicht vollkommen aus.
Dann kann man per CultureInfo dem Client das Richtige Format anzeigen.
Und zwar nach dem Format, das auf dem System installiert ist.

Super danke noch mal