如何将诸如2009-05-08 14:40:52,531这样的字符串转换为DateTime?


当前回答

世界上不同的文化以不同的方式书写日期字符串。例如,在美国01/20/2008就是2008年1月20日。在法国,这将抛出InvalidFormatException异常。这是因为法国的日期时间是日/月/年,而美国的日期时间是月/日/年。

因此,像20/01/2008这样的字符串在法国将解析到2008年1月20日,然后在美国抛出InvalidFormatException。

要确定当前区域性设置,可以使用System.Globalization.CultureInfo.CurrentCulture。

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 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);

我只是找到了一个优雅的方法:

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"

你基本上有两个选择。DateTime.Parse()和DateTime.ParseExact()。

第一个在语法方面非常宽容,将以许多不同的格式解析日期。它对可能以不同格式出现的用户输入很有帮助。

ParseExact将允许您指定用于解析的日期字符串的确切格式。如果您的字符串总是使用相同的格式,那么使用这个是很好的。通过这种方式,您可以轻松地检测出与预期数据的任何偏差。

你可以这样解析用户输入:

DateTime enteredDate = DateTime.Parse(enteredString);

如果你有一个特定的字符串格式,你应该使用另一种方法:

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

“d”代表短日期模式(更多信息请参阅MSDN), null指定当前区域性应用于解析字符串。

你想快点吗?

假设您有一个格式为yyMMdd的日期。

我发现转换它的最快方法是:

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')

只需根据您选择的日期格式选择索引。如果你需要速度,你可能不介意函数的“非泛型”方式。

此方法所需时间约为以下操作所需时间的10%:

var d = DateTime.ParseExact(s, "yyMMdd", System.Globalization.CultureInfo.InvariantCulture);

世界上不同的文化以不同的方式书写日期字符串。例如,在美国01/20/2008就是2008年1月20日。在法国,这将抛出InvalidFormatException异常。这是因为法国的日期时间是日/月/年,而美国的日期时间是月/日/年。

因此,像20/01/2008这样的字符串在法国将解析到2008年1月20日,然后在美国抛出InvalidFormatException。

要确定当前区域性设置,可以使用System.Globalization.CultureInfo.CurrentCulture。

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);