Parse-datetime in mehreren Formaten
Habe ich erstellt eine API-Endpunkt. Der Anrufer kann rufen Sie die API mit POST
- Methode und übergeben die relevanten Parameter. In den Parametern gibt es ein parameter, der datetime
format.
Das problem ist, dass beim Aufruf dieser API kann der Aufrufer übergibt datetime
in 3 verschiedenen Formaten:
long int
- z.B. 1374755180- US-format - z.B. "7/25/2013 6:37:31 Uhr" (wie
string
) - Timestamp-format - z.B. "2013-07-25 14:26:00" (wie
string
)
Habe ich zum Parsen der datetime
Wert und wandelt es in ein DateTime
oder string
im Timestamp-format.
Habe ich versucht, mit DateTime.TryParse()
, DateTime.Parse()
, Convert.ToDateTime()
und Convert.ToDouble()
aber keiner von Ihnen arbeiten in der Gewissheit für mich.
Die erforderliche Leistung hat, um in en-GB
format.
Edit:
Hatte ich gedacht, um eine if-else if-else
block zur Verwendung mit TryParse
3 mal mit einer else
zu sagen, dass der string konnte nicht analysiert werden. Ist das die beste Lösung? Oder gibt es Lösungen, die besser als diese?
Bitte um Hilfe!!
Wie soll das helfen wenn ich nicht weiß, das format der Eingabe-string?
aber Sie wissen, Sie haben 3 Möglichkeiten für die Eingabe von Zeichenfolgen, enthält keine Leerzeichen noch irgendwelche Sonderzeichen, die andere hat "/" Trennzeichen, und der andere hat "-". Könnten Sie 3 Parser zu PREVALIDATE Sie das genaue format, aber es würde einfach genug sein, um zu testen, ob es numerisch ist, oder wenn es enthält die Trennzeichen, die Sie erwarten sind und dann versuchen, zu analysieren, mit dem richtigen format. Wenn es nicht analysieren, das input-Feld ist nicht gültig...
Es wird helfen, weil es nicht eine, dann die nächste, dann hoffentlich nicht. DateTime.Parse() (oder TryParse) sind wahrscheinlich etwas ähnliches intern. Versuchen mehrere Formate. Lassen Sie mich sehen, wenn ich eine Antwort zusammen.
InformationsquelleAutor Vivek Jain | 2013-07-25
Du musst angemeldet sein, um einen Kommentar abzugeben.
Sollten Sie überlegen, die eine Zeitzone.
1 nicht brauchen, aber #2 und #3 tun.
BEARBEITEN
Als Matt Johnson weist darauf hin, DateTime.TryParseExact akzeptiert ein array von format-strings.
2 & 3 könnte verdichtet werden.
Die Epoche der Konvertierung, habe ich mir aus einer anderen Frage.
(Eine Erweiterung Methode)
TryParseExact
kann akzeptieren ein array von Formaten. Und eine Zeitzone ist nicht erforderlich, dass gerade diese Formate haben.Kind == DateTimeKinds.Unspecified
.Oh, guter Punkt.
Ich bin nicht sicher, warum das Parsen nicht funktioniert für die timestamp-format, aber, deine Antwort hat mir geholfen, zu entscheiden, zu analysieren
long int
anders und die beiden anderen unterschiedlich. Danke!Ich wählte Ihre Antwort, denn es trat mein Geist in die richtige Richtung, und ich konnte die Lösung finden. Nochmals vielen Dank!
InformationsquelleAutor Randy James
Du suchst die
DateTime.ParseExact
(MSDN-Artikel)Die Sie verwenden würden, in einer situation wie dieser:
Dadurch können Sie hinzufügen, wie viele
DateTime
Formate, um diearray
wie Sie brauchen, und die Methode wird die Konvertierung ohne dieif
...else
Aussagen.Wenn Ihr ganze Zahl in Sekunden seit Unix-Epoche fügen Sie die Anzahl der Sekunden, die DateTime-der Epoche (01/01/1970) (.Net nicht out of the box " Methode, aber die Logik ist in Sekunden seit 'Epoche'):
Vom diese Frage.
Keine Probleme - froh, dass es geholfen hat. Vergessen Sie nicht, markieren Sie die Frage, was wurde am meisten für Ihr problem die Antwort (grüner Haken unterhalb der up-und down-vote Pfeile).
InformationsquelleAutor Darbio
Einen Weg, um mit diesem problem umzugehen, wäre die Einrichtung einer factory-Methode, die "versteht" verschiedene Formate und analysiert Sie entsprechend.
Können Sie erstellen Sie eine Kette von
if
-then
-else
s, um mit diesem problem umzugehen, aber Sie können auch eine "table-driven" Umsetzung: was Sie brauchen ist ein array von Delegierten, die einen string, und Ihnen sagen, zwei Dinge:DateTime
Hier ist eine Beispiel-Implementierung:
Nun die factory-Methode könnte wie folgt implementiert werden:
InformationsquelleAutor dasblinkenlight
Wenn die möglichen Formate fixiert sind, dann können Sie TryParseExact
Eine mögliche Lösung ist die Verwendung TryParse, wenn es nicht gelingt, die richtige Datum, dann fallback auf die bekannten Formaten und TryPraseExact
TryParse
hat den trick für mich. Danke!InformationsquelleAutor Shekhar_Pro
Ich Stand vor dem gleichen problem in einem Projekt, wo mein code läuft auf verschiedenen Umgebungen mit verschiedenen Kultur-Formate.
Google zeigte mir dieses Kleinod. Die Hilfsfunktion ist unverzichtbar, um auto-parse-datetime-richtig-unabhängig von Kultur-Formate
Beispiele:
Laut dem Autor, der code ist in der Lage Analyse der verschiedenen Fälle:
InformationsquelleAutor Korayem
Dank für Eure Antworten. Ich habe versucht, die Optionen vorgeschlagen, in paar Antworten und fand eine sehr einfache Methode, die für mich gearbeitet.
Früher habe ich zu verwenden versucht
TryParse
für alle 3 Formate, die nicht funktionierte.Irgendwie
TryParseExact
funktionierte nicht für das timestamp-format. Er arbeitete für das US-format. Das ist der Grund, ich hatte zu schreiben, meine eigenen.InformationsquelleAutor Vivek Jain
Wenn Sie
TryParseExact
nur Go-D und die Microsoft-Entwickler wissen, wie viele mögliche Datum-Zeit-Formate, es wird versuchen zu analysieren, bevor es aufgibt. Vielleicht eine bessere Lösung ist die Verwendung eine schnelle regex und dann einen entsprechenden parser. Ich habe versucht, die regex so einfach wie possibke, müssen Sie möglicherweise zu zwicken, ein wenigInformationsquelleAutor Juan Ayala