Antworten:
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);
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 null
gibt an, dass die aktuelle Kultur zum Parsen der Zeichenfolge verwendet werden soll.
Verwendung DateTime.Parse(string)
:
DateTime dateTime = DateTime.Parse(dateTimeStr);
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)));
}
}
}
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:
Convert.ToDateTime(data, CultureInfo.InvariantCulture);
data
Für mich war es eine Zeit wie diese 24.09.2017 09:31:34 Uhr
Versuchen Sie Folgendes, wobei strDate Ihr Datum im Format 'MM / TT / JJJJ' ist
var date = DateTime.Parse(strDate,new CultureInfo("en-US", true))
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);
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););
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);
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
}
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('-', ':', '-');
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"
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);
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
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);
@CMS
nicht als Antwort markiert? Es kann einen Grund geben - ich bin neugierig.