@dban Warum eine Antwort von @CMSnicht als Antwort markiert? Es kann einen Grund geben - ich bin neugierig.
Nam
5
@nam Benutzer hat sein Konto gelöscht oder wurde gesperrt, kann weder darauf klicken noch Reputation / Medaillen sehen. Leider können wir ihm nur ein paar Daumen hoch geben.
YumeYume
Antworten:
753
Da Sie eine 24-Stunden-Zeit verarbeiten und der Sekundenbruch durch ein Komma getrennt ist, empfehle ich, ein benutzerdefiniertes Format anzugeben:
Gute Augen. Ich habe das Komma im OP nicht gesehen.
lc.
(Ich denke, Sie wollten ein Komma in den Datums- und Formatzeichenfolgen verwenden, oder?)
lc.
1
Aufgrund der Einstellung für das europäische Gebietsschema des OP ist dies nur ein Komma. Wenn Sie diesen Code mit einem US.Locale auf einen anderen Server übertragen, sind die Brüche eines Abschnitts eine Dezimalstelle und kein Komma in der gespeicherten Zeichenfolge, und Ihre Lösung wird dies tun brechen. Stellen Sie sicher, dass Sie eine Überprüfung für den Typ der eingehenden Datums- / Uhrzeitzeichenfolge für das richtige Gebietsschema hinzufügen, bevor Sie den richtigen Parser anwenden. Ich bin überrascht, dass Microsoft diesen Code noch nicht irgendwo anders in der CLR oder C # .net
vorgefertigt hat
Konvertierung in Datums- / Uhrzeitzeichenfolge nicht möglich MyString = "22.06.1916 15:20:14";
Vinod Kumar
24-Stunden-Zeit und Komma als Dezimaltrennzeichen sind kein benutzerdefiniertes Gebietsschema. Es sollte nicht speziell behandelt werden müssen.
Jpaugh
248
Sie haben hierfür grundsätzlich zwei Möglichkeiten. DateTime.Parse()und DateTime.ParseExact().
Die erste ist in Bezug auf die Syntax sehr nachsichtig und analysiert Daten in vielen verschiedenen Formaten. Es ist gut für Benutzereingaben geeignet, die in verschiedenen Formaten vorliegen können.
Mit ParseExact können Sie das genaue Format Ihrer Datumszeichenfolge angeben, die zum Parsen verwendet werden soll. Es ist gut, dies zu verwenden, wenn Ihre Zeichenfolge immer das gleiche Format hat. Auf diese Weise können Sie leicht Abweichungen von den erwarteten Daten erkennen.
Sie können Benutzereingaben wie folgt analysieren:
"d"steht für das kurze Datumsmuster (siehe MSDN für weitere Informationen ) und nullgibt an, dass die aktuelle Kultur zum Parsen der Zeichenfolge verwendet werden soll.
Niemand scheint eine Erweiterungsmethode implementiert zu haben. Mit Hilfe der Antwort von @ CMS :
Ein funktionierendes und verbessertes Beispiel für eine vollständige Quelle finden Sie hier: Gist Link
namespace ExtensionMethods{
using System;
using System.Globalization;publicstaticclassDateTimeExtensions{publicstaticDateTimeToDateTime(thisstring s,string format ="ddMMyyyy",string cultureString ="tr-TR"){try{var r =DateTime.ParseExact(
s: s,
format: format,
provider:CultureInfo.GetCultureInfo(cultureString));return r;}catch(FormatException){throw;}catch(CultureNotFoundException){throw;// Given Culture is not supported culture}}publicstaticDateTimeToDateTime(thisstring s,string format,CultureInfo culture){try{var r =DateTime.ParseExact(s: s, format: format,
provider: culture);return r;}catch(FormatException){throw;}catch(CultureNotFoundException){throw;// Given Culture is not supported culture}}}}
namespace SO {
using ExtensionMethods;
using System;
using System.Globalization;classProgram{staticvoidMain(string[] args){var mydate ="29021996";var date = mydate.ToDateTime(format:"ddMMyyyy");// {29.02.1996 00:00:00}
mydate ="2016 3";
date = mydate.ToDateTime("yyyy M");// {01.03.2016 00:00:00}
mydate ="2016 12";
date = mydate.ToDateTime("yyyy d");// {12.01.2016 00:00:00}
mydate ="2016/31/05 13:33";
date = mydate.ToDateTime("yyyy/d/M HH:mm");// {31.05.2016 13:33:00}
mydate ="2016/31 Ocak";
date = mydate.ToDateTime("yyyy/d MMMM");// {31.01.2016 00:00:00}
mydate ="2016/31 January";
date = mydate.ToDateTime("yyyy/d MMMM", cultureString:"en-US");// {31.01.2016 00:00:00}
mydate ="11/شعبان/1437";
date = mydate.ToDateTime(
culture:CultureInfo.GetCultureInfo("ar-SA"),
format:"dd/MMMM/yyyy");// Weird :) I supposed dd/yyyy/MMMM but that did not work !?$^&*System.Diagnostics.Debug.Assert(
date.Equals(newDateTime(year:2016, month:5, day:18)));}}}
Nobody seems to implemented an extension methodvielleicht weil nicht benötigt ...
Yousha Aleayoub
Manchmal entspricht die Standardbibliothek nicht unseren Anforderungen. Und deshalb brauchen / verwenden Sie Hilfsbibliotheken. Die Verwendung der Erweiterungsmethode oder der fließenden API bevorzugt FP gegenüber OOP oder umgekehrt. Weder richtig noch falsch. Es ist die Wahl. @ YoushaAleayoub
Guneysus
23
Ich habe verschiedene Möglichkeiten ausprobiert. Was für mich funktioniert hat, war Folgendes:
string input;DateTime db;Console.WriteLine("Enter Date in this Format(YYYY-MM-DD): ");
input =Console.ReadLine();
db =Convert.ToDateTime(input);//////// this methods convert string value to datetime///////// in order to print dateConsole.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
stringvalue="1 January 2019";CultureInfo provider =newCultureInfo("en-GB");DateTime.Parse(value, provider,DateTimeStyles.NoCurrentDateDefault););
Wert: Zeichenfolgendarstellung von Datum und Uhrzeit.
Anbieter: Objekt, das kulturspezifische Informationen bereitstellt.
Stile: Formatierungsoptionen, mit denen das Parsen von Zeichenfolgen für einige Datums- und Zeitanalyseverfahren angepasst werden kann. AllowWhiteSpaces ist beispielsweise ein Wert, mit dem alle in der Zeichenfolge vorhandenen Leerzeichen beim Parsen ignoriert werden können.
Beachten Sie auch, dass DateTime ein Objekt ist, das intern im Framework als Nummer gespeichert wird. Format gilt nur, wenn Sie es wieder in einen String konvertieren.
Parsing Konvertieren einer Zeichenfolge in den internen Nummerntyp.
Formatieren Konvertieren des internen numerischen Werts in eine lesbare Zeichenfolge.
Ich hatte kürzlich ein Problem, bei dem ich versuchte, eine DateTime zu konvertieren, um sie an Linq zu übergeben. Was ich zu diesem Zeitpunkt noch nicht erkannt hatte, war, dass das Format beim Übergeben von DateTime an eine Linq-Abfrage irrelevant ist.
Sie können DateTime.TryParseExact () auch wie folgt verwenden, wenn Sie sich über den Eingabewert nicht sicher sind.
DateTime outputDateTimeValue;if(DateTime.TryParseExact("2009-05-08 14:40:52,531","yyyy-MM-dd HH:mm:ss,fff",System.Globalization.CultureInfo.InvariantCulture,System.Globalization.DateTimeStyles.None,out outputDateTimeValue)){return outputDateTimeValue;}else{// Handle the fact that parse did not succeed}
Verschiedene Kulturen auf der Welt schreiben Datumszeichenfolgen auf unterschiedliche Weise. In den USA ist der 20. Januar 2008 beispielsweise der 20. Januar 2008. In Frankreich wird eine InvalidFormatException ausgelöst. Dies liegt daran, dass Frankreich Datums- und Uhrzeitangaben als Tag / Monat / Jahr liest und in den USA Monat / Tag / Jahr.
Folglich wird eine Zeichenfolge wie der 20.01.2008 in Frankreich bis zum 20. Januar 2008 analysiert und anschließend in den USA eine InvalidFormatException ausgelöst.
Um Ihre aktuellen Kultureinstellungen zu ermitteln, können Sie System.Globalization.CultureInfo.CurrentCulture verwenden.
Angenommen, Sie haben ein Datum mit dem Format yyMMdd.
Der schnellste Weg, es zu konvertieren, den ich gefunden habe, ist:
var d =newDateTime((s[0]-'0')*10+ s[1]-'0'+2000,(s[2]-'0')*10+ s[3]-'0',(s[4]-'0')*10+ s[5]-'0')
Wählen Sie einfach die Indizes entsprechend dem Datumsformat Ihrer Wahl. Wenn Sie Geschwindigkeit benötigen, stört Sie wahrscheinlich die "nicht generische" Art der Funktion nicht.
Diese Methode benötigt ungefähr 10% der Zeit, die benötigt wird von:
var d =DateTime.ParseExact(s,"yyMMdd",System.Globalization.CultureInfo.InvariantCulture);
@CMS
nicht als Antwort markiert? Es kann einen Grund geben - ich bin neugierig.Antworten:
Da Sie eine 24-Stunden-Zeit verarbeiten und der Sekundenbruch durch ein Komma getrennt ist, empfehle ich, ein benutzerdefiniertes Format anzugeben:
quelle
Sie haben hierfür grundsätzlich zwei Möglichkeiten.
DateTime.Parse()
undDateTime.ParseExact()
.Die erste ist in Bezug auf die Syntax sehr nachsichtig und analysiert Daten in vielen verschiedenen Formaten. Es ist gut für Benutzereingaben geeignet, die in verschiedenen Formaten vorliegen können.
Mit ParseExact können Sie das genaue Format Ihrer Datumszeichenfolge angeben, die zum Parsen verwendet werden soll. Es ist gut, dies zu verwenden, wenn Ihre Zeichenfolge immer das gleiche Format hat. Auf diese Weise können Sie leicht Abweichungen von den erwarteten Daten erkennen.
Sie können Benutzereingaben wie folgt analysieren:
Wenn Sie ein bestimmtes Format für die Zeichenfolge haben, sollten Sie die andere Methode verwenden:
"d"
steht für das kurze Datumsmuster (siehe MSDN für weitere Informationen ) undnull
gibt an, dass die aktuelle Kultur zum Parsen der Zeichenfolge verwendet werden soll.quelle
Versuche dies
Ein besserer Weg wäre:
quelle
Verwendung
DateTime.Parse(string)
:quelle
Niemand scheint eine Erweiterungsmethode implementiert zu haben. Mit Hilfe der Antwort von @ CMS :
Ein funktionierendes und verbessertes Beispiel für eine vollständige Quelle finden Sie hier: Gist Link
quelle
Nobody seems to implemented an extension method
vielleicht weil nicht benötigt ...Ich habe verschiedene Möglichkeiten ausprobiert. Was für mich funktioniert hat, war Folgendes:
data
Für mich war es eine Zeit wie diese 24.09.2017 09:31:34 Uhrquelle
Versuchen Sie Folgendes, wobei strDate Ihr Datum im Format 'MM / TT / JJJJ' ist
quelle
Convert.ToDateTime oder DateTime.Parse
quelle
quelle
DateTime.Parse
Syntax:
Beispiel:
Beachten Sie auch, dass DateTime ein Objekt ist, das intern im Framework als Nummer gespeichert wird. Format gilt nur, wenn Sie es wieder in einen String konvertieren.
Parsing Konvertieren einer Zeichenfolge in den internen Nummerntyp.
Formatieren Konvertieren des internen numerischen Werts in eine lesbare Zeichenfolge.
Ich hatte kürzlich ein Problem, bei dem ich versuchte, eine DateTime zu konvertieren, um sie an Linq zu übergeben. Was ich zu diesem Zeitpunkt noch nicht erkannt hatte, war, dass das Format beim Übergeben von DateTime an eine Linq-Abfrage irrelevant ist.
Vollständige DateTime-Dokumentation
quelle
Sie können DateTime.TryParseExact () auch wie folgt verwenden, wenn Sie sich über den Eingabewert nicht sicher sind.
quelle
Fügen Sie diesen Code in eine statische Klasse ein
> public static class ClassName{ }
Auf diese Weise können Sie verwenden
quelle
Ich habe gerade einen eleganten Weg gefunden:
quelle
Verschiedene Kulturen auf der Welt schreiben Datumszeichenfolgen auf unterschiedliche Weise. In den USA ist der 20. Januar 2008 beispielsweise der 20. Januar 2008. In Frankreich wird eine InvalidFormatException ausgelöst. Dies liegt daran, dass Frankreich Datums- und Uhrzeitangaben als Tag / Monat / Jahr liest und in den USA Monat / Tag / Jahr.
Folglich wird eine Zeichenfolge wie der 20.01.2008 in Frankreich bis zum 20. Januar 2008 analysiert und anschließend in den USA eine InvalidFormatException ausgelöst.
Um Ihre aktuellen Kultureinstellungen zu ermitteln, können Sie System.Globalization.CultureInfo.CurrentCulture verwenden.
quelle
dieser gibt dir
quelle
Willst du es schnell?
Angenommen, Sie haben ein Datum mit dem Format yyMMdd.
Der schnellste Weg, es zu konvertieren, den ich gefunden habe, ist:
Wählen Sie einfach die Indizes entsprechend dem Datumsformat Ihrer Wahl. Wenn Sie Geschwindigkeit benötigen, stört Sie wahrscheinlich die "nicht generische" Art der Funktion nicht.
Diese Methode benötigt ungefähr 10% der Zeit, die benötigt wird von:
quelle