Konvertieren eines Strings in DateTime

590

Wie konvertiert man einen String wie 2009-05-08 14:40:52,531in einen DateTime?

Cramopy
quelle
2
@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:

DateTime myDate = DateTime.ParseExact("2009-05-08 14:40:52,531", "yyyy-MM-dd HH:mm:ss,fff",
                                       System.Globalization.CultureInfo.InvariantCulture);
CMS
quelle
4
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:

DateTime enteredDate = DateTime.Parse(enteredString);

Wenn Sie ein bestimmtes Format für die Zeichenfolge haben, sollten Sie die andere Methode verwenden:

DateTime loadedDate = DateTime.ParseExact(loadedString, "d", null);

"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.

Sander
quelle
137

Versuche dies

DateTime myDate = DateTime.Parse(dateString);

Ein besserer Weg wäre:

DateTime myDate;
if (!DateTime.TryParse(dateString, out myDate))
{
    // handle parse failure
}
gehsekky
quelle
33

Verwendung DateTime.Parse(string):

DateTime dateTime = DateTime.Parse(dateTimeStr);
Amir Touitou
quelle
26

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;

    public static class DateTimeExtensions {
        public static DateTime ToDateTime(this string 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
            }
        }

        public static DateTime ToDateTime(this string 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;

    class Program {
        static void Main(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(new DateTime(year: 2016, month: 5, day: 18)));
        }
    }
}
Guneysos
quelle
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:

Convert.ToDateTime(data, CultureInfo.InvariantCulture);

data Für mich war es eine Zeit wie diese 24.09.2017 09:31:34 Uhr

zeilja
quelle
Sieht besser aus, kann der DateTime-Variable seinen Wert zuweisen?
Birhan Nega
20

Versuchen Sie Folgendes, wobei strDate Ihr Datum im Format 'MM / TT / JJJJ' ist

var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
Krishna
quelle
1
Niemand erwähnte, dass es nur mit diesem bestimmten Format funktioniert.
T.Todua
Schade ... 🙂 Codierer denken immer, dass andere Codierer es herausfinden werden ... Gute Sache eigentlich ... Lassen Sie uns mehr nachdenken ...
Krishna
15
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 date

Console.WriteLine("{0}-{1}-{2}",db.Year,db.Month,db.Day);
Umair Baig
quelle
1
Du hast den Zeitteil verpasst? Ich brauche Datum und Uhrzeit. Wie kann ich das machen?
Badhon Jain
15

DateTime.Parse

Syntax:

DateTime.Parse(String value)
DateTime.Parse(String value, IFormatProvider provider)
DateTime.Parse(String value, IFormatProvider provider, DateTypeStyles styles)

Beispiel:

string value = "1 January 2019";
CultureInfo provider = new CultureInfo("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.

DateTime SearchDate = DateTime.Parse(searchDate);
applicationsUsages = applicationsUsages.Where(x => DbFunctions.TruncateTime(x.dateApplicationSelected) == SearchDate.Date);

Vollständige DateTime-Dokumentation

Mr.B.
quelle
14

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
}
dev.bv.
quelle
2

Fügen Sie diesen Code in eine statische Klasse ein> public static class ClassName{ }

public static DateTime ToDateTime(this string datetime, char dateSpliter = '-', char timeSpliter = ':', char millisecondSpliter = ',')
{
   try
   {
      datetime = datetime.Trim();
      datetime = datetime.Replace("  ", " ");
      string[] body = datetime.Split(' ');
      string[] date = body[0].Split(dateSpliter);
      int year = date[0].ToInt();
      int month = date[1].ToInt();
      int day = date[2].ToInt();
      int hour = 0, minute = 0, second = 0, millisecond = 0;
      if (body.Length == 2)
      {
         string[] tpart = body[1].Split(millisecondSpliter);
         string[] time = tpart[0].Split(timeSpliter);
         hour = time[0].ToInt();
         minute = time[1].ToInt();
         if (time.Length == 3) second = time[2].ToInt();
         if (tpart.Length == 2) millisecond = tpart[1].ToInt();
      }
      return new DateTime(year, month, day, hour, minute, second, millisecond);
   }
   catch
   {
      return new DateTime();
   }
}

Auf diese Weise können Sie verwenden

string datetime = "2009-05-08 14:40:52,531";
DateTime dt0 = datetime.TToDateTime();

DateTime dt1 = "2009-05-08 14:40:52,531".ToDateTime();
DateTime dt5 = "2009-05-08".ToDateTime();
DateTime dt2 = "2009/05/08 14:40:52".ToDateTime('/');
DateTime dt3 = "2009/05/08 14.40".ToDateTime('/', '.');
DateTime dt4 = "2009-05-08 14:40-531".ToDateTime('-', ':', '-');
MRT2017
quelle
2

Ich habe gerade einen eleganten Weg gefunden:

Convert.ChangeType("2020-12-31", typeof(DateTime));

Convert.ChangeType("2020/12/31", typeof(DateTime));

Convert.ChangeType("2020-01-01 16:00:30", typeof(DateTime));

Convert.ChangeType("2020/12/31 16:00:30", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("en-GB"));

Convert.ChangeType("11/شعبان/1437", typeof(DateTime), System.Globalization.CultureInfo.GetCultureInfo("ar-SA"));

Convert.ChangeType("2020-02-11T16:54:51.466+03:00", typeof(DateTime)); // format: "yyyy'-'MM'-'dd'T'HH':'mm':'ss'.'fffzzz"
Guneysos
quelle
1

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.

string dateTime = "01/08/2008 14:50:50.42";  
        DateTime dt = Convert.ToDateTime(dateTime);  
        Console.WriteLine("Year: {0}, Month: {1}, Day: {2}, Hour: {3}, Minute: {4}, Second: {5}, Millisecond: {6}",  
                          dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute, dt.Second, dt.Millisecond);  
Saeed Dini
quelle
1
String now = DateTime.Now.ToString("YYYY-MM-DD HH:MI:SS");//make it datetime
DateTime.Parse(now);

dieser gibt dir

2019-08-17 11:14:49.000
Abdulhakim Zeinu
quelle
-1

Willst du es schnell?

Angenommen, Sie haben ein Datum mit dem Format yyMMdd.

Der schnellste Weg, es zu konvertieren, den ich gefunden habe, ist:

var d = new DateTime(
(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);
David
quelle