Parse string to DateTime in C#
我的日期和时间的格式是这样的:
1 | "2011-03-21 13:26" //year-month-day hour:minute |
如何将其解析为
如果可能的话,我想使用像
将尝试在给定日期的格式中找到一份好工作。如果你能保证日期总是在一个格式中,那么你可以使用
1 2 3 4 | string s ="2011-03-21 13:26"; DateTime dt = DateTime.ParseExact(s,"yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); |
(但注意到这通常是安全的使用一种胰蛋白酶方法,以一个日期为准,而不是预期的格式)
在构建格式条纹时,确保检查自定义日期和时间格式条纹,特别是注意字母和案件的数目(I.E."mm"和"mm"mean very different things)。
另一个C 355使用资源;格式弦乐为C 355格式格式;
正如我稍后所解释的,我总是倾向于使用
1 2 | var dtStr ="2011-03-21 13:26"; DateTime? dt = dtStr.ToDate("yyyy-MM-dd HH:mm"); |
与
江户十一〔四〕号好的。
转换是否成功(在本例中,
这甚至允许使用像"elvis"这样优雅的快捷方式,例如,运算符
1 | int? year = dtStr?.ToDate("yyyy-MM-dd HH:mm")?.Year; |
号
在这里,您还可以使用
解决方案:todate()扩展方法好的。
试试看。网提琴好的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | public static class Extensions { // Extension method parsing a date string to a DateTime? // dateFmt is optional and allows to pass a parsing pattern array // or one or more patterns passed as string parameters public static DateTime? ToDate(this string dateTimeStr, params string[] dateFmt) { // example: var dt ="2011-03-21 13:26".ToDate(new string[]{"yyyy-MM-dd HH:mm", // "M/d/yyyy h:mm:ss tt"}); // or simpler: // var dt ="2011-03-21 13:26".ToDate("yyyy-MM-dd HH:mm","M/d/yyyy h:mm:ss tt"); const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces; if (dateFmt == null) { var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat; dateFmt=dateInfo.GetAllDateTimePatterns(); } // Commented out below because it can be done shorter as shown below. // For older C# versions (older than C#7) you need it like that: // DateTime? result = null; // DateTime dt; // if (DateTime.TryParseExact(dateTimeStr, dateFmt, // CultureInfo.InvariantCulture, style, out dt)) result = dt; // In C#7 and above, we can simply write: var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture, style, out var dt) ? dt : null as DateTime?; return result; } } |
关于代码的一些信息好的。
您可能会奇怪,为什么我使用
更新:
1 2 3 | // in C#7 only:"DateTime dt;" - no longer required, declare implicitly if (DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture, style, out var dt)) result = dt; |
。
或者,如果你喜欢更短的:好的。
1 2 3 | // in C#7 only: Declaration of result as a"one-liner" ;-) var result = DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture, style, out var dt) ? dt : null as DateTime?; |
在这种情况下,您根本不需要
我使用
使用示例好的。
1 2 3 4 5 6 7 8 9 10 11 | var dtStr="2011-03-21 13:26"; var dt=dtStr.ToDate("yyyy-MM-dd HH:mm"); if (dt.HasValue) { Console.WriteLine("Successful!"); // ... dt.Value now contains the converted DateTime ... } else { Console.WriteLine("Invalid date format!"); } |
。
如您所见,这个示例只是查询
更多用法示例好的。
重载函数允许您传递用于分析/转换日期的有效格式数组,如这里所示(
1 2 3 4 5 6 7 | string[] dateFmt = {"M/d/yyyy h:mm:ss tt","M/d/yyyy h:mm tt", "MM/dd/yyyy hh:mm:ss","M/d/yyyy h:mm:ss", "M/d/yyyy hh:mm tt","M/d/yyyy hh tt", "M/d/yyyy h:mm","M/d/yyyy h:mm", "MM/dd/yyyy hh:mm","M/dd/yyyy hh:mm"}; var dtStr="5/1/2009 6:32 PM"; var dt=dtStr.ToDate(dateFmt); |
。
如果您只有几个模板模式,您还可以编写:好的。
1 2 | var dateStr ="2011-03-21 13:26"; var dt = dateStr.ToDate("yyyy-MM-dd HH:mm","M/d/yyyy h:mm:ss tt"); |
高级示例
好的。
您可以使用
1 2 | var dtStr ="2017-12-30 11:37:00"; var dt = (dtStr.ToDate()) ?? dtStr.ToDate("yyyy-MM-dd HH:mm:ss"); |
在这种情况下,
你甚至可以在linq中使用扩展,试试这个(它在上面的.netfiddle中):好的。
1 2 |
号
它将使用模式即时转换数组中的日期,并将其转储到控制台。好的。
胰蛋白酶抑制剂的一些背景好的。
最后,这里有一些关于背景的评论(也就是为什么我这样写的原因):好的。
我更喜欢在这个扩展方法中使用TryparSeeXact,因为您避免了异常处理——您可以阅读Eric Lippert关于异常的文章为什么应该使用Tryparse而不是Parse,我引用他关于那个主题的话:2)好的。
This unfortunate design decision1) [annotation: to
let the Parse method throw an exception] was so vexing that of course
the frameworks team implemented TryParse shortly thereafter which does the right thing.Ok.
号
确实如此,但是
在大多数情况下,您只想知道转换是否成功(当然,如果转换成功,也要知道值),所以保存所有信息的可以为空的目标变量是可取的,而且更优雅——因为整个信息只存储在一个地方:一致且易于使用,错误更少。-俯卧。好的。
我编写的扩展方法就是这样做的(它还向您展示了如果不使用它,每次都必须编写什么类型的代码)。好的。
我相信
1)这里的意思是异常处理(即
2)Eric Lippert是著名的StackOverflow研究员,曾在微软担任C编译器团队的主要开发人员几年。好的。好啊。
ZZU1
查看此链接,以便其它格式弦乐!
Datetime.Parse()should work fine for that string format.参考:
http://msdn.microsoft.com/en-us/library/1k1skd40.aspx&350;y1240
这对你来说是个例外吗?
Put the value of a human-readable string into a net datetime with code like this:
1 | DateTime.ParseExact("April 16, 2011 4:27 pm","MMMM d, yyyy h:mm tt", null); |
简单而直截了当的答案
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | using System; namespace DemoApp.App { public class TestClassDate { public static DateTime GetDate(string string_date) { DateTime dateValue; if (DateTime.TryParse(string_date, out dateValue)) Console.WriteLine("Converted '{0}' to {1}.", string_date, dateValue); else Console.WriteLine("Unable to convert '{0}' to a date.", string_date); return dateValue; } public static void Main() { string inString ="05/01/2009 06:32:00"; GetDate(inString); } } } /** * Output: * Converted '05/01/2009 06:32:00' to 5/1/2009 6:32:00 AM. * */ |
你也可以使用xmlconvert.todatestring
1 2 | var dateStr ="2011-03-21 13:26"; var parsedDate = XmlConvert.ToDateTime(dateStr,"yyyy-MM-dd hh:mm"); |
It is good to specify the date kind,the code is:
1 | var anotherParsedDate = DateTime.ParseExact(dateStr,"yyyy-MM-dd hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AssumeUniversal); |
More details on different parsing options http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html
试着跟随代码
1 2 3 | Month = Date = DateTime.Now.Month.ToString(); Year = DateTime.Now.Year.ToString(); ViewBag.Today = System.Globalization.CultureInfo.InvariantCulture.DateTimeFormat.GetMonthName(Int32.Parse(Month)) + Year; |