在C#中将stringparsing为DateTime

我有一个string格式化的date和时间

"2011-03-21 13:26" //year-month-day hour:minute 

我怎样才能parsing到System.DateTime

如果可能的话,我想使用DateTime.Parse()DateTime.ParseExact()等函数,以便能够手动指定date的格式。

DateTime.Parse()将尝试找出给定date的格式,它通常做得很好。 如果您可以保证date将始终以给定的格式,那么您可以使用ParseExact()

 string s = "2011-03-21 13:26"; DateTime dt = DateTime.ParseExact(s, "yyyy-MM-dd HH:mm", CultureInfo.InvariantCulture); 

(但是请注意,如果date不是预期格式,则使用TryParse方法通常更安全)

在构build格式化string时,一定要检查自定义date和时间格式string,特别要注意字母和大小写(即“MM”和“mm”意思完全不同)。

另一个用于C#格式string的有用资源是C#中的string格式

正如我稍后解释的,我总是喜欢TryParseTryParseExact方法。 因为它们有点笨重,所以我写了一个扩展方法 ,使得parsing更加容易:

 var dtStr = "2011-03-21 13:26"; DateTime? dt = dtStr.toDate("yyyy-MM-dd HH:mm"); 

不像ParseParseExact等,它不会抛出exception,并允许您通过检查

if (dt.HasValue) { // continue processing } else { // do error handling }

转换是否成功(在这种情况下, dt有一个值,你可以通过dt.Value访问)或不(在这种情况下,它是null )。

试试.NetFiddle

 public static class Extensions { public static DateTime? toDate(this string dateTimeStr, 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"}); const DateTimeStyles style = DateTimeStyles.AllowWhiteSpaces; if (dateFmt == null) { var dateInfo = System.Threading.Thread.CurrentThread.CurrentCulture.DateTimeFormat; dateFmt=dateInfo.GetAllDateTimePatterns(); } DateTime? result = null; DateTime dt; if (DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture, style, out dt)) result = dt; return result; } public static DateTime? toDate(this string dateTimeStr, string dateFmt=null) { // example: var dt="2011-03-21 13:26".toDate("yyyy-MM-dd HH:mm"); // or simply var dt="2011-03-21 13:26".toDate(); // call overloaded function with string array param string[] dateFmtArr = dateFmt == null ? null : new string[] { dateFmt }; return toDate(dateTimeStr, dateFmtArr); } } 

更新: .toDate() (不带参数)现在默认为线程当前文化的所有常见date/时间模式。
请注意 ,我们需要resultdt在一起,因为TryParseExact不允许使用DateTime? ,我们打算返回。 在C#版本7中,您可以简化toDate函数,如下所示:

  // in C#7 only: "DateTime dt;" - no longer required, declare implicitly if (DateTime.TryParseExact(dateTimeStr, dateFmt, CultureInfo.InvariantCulture, style, out var dt)) result = dt; 

(也可以写出out DateTime dt而不是out var dt 。)

例:

 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!"); } 

正如你所看到的,这个例子只是查询dt.HasValue来查看转换是否成功。 作为一个额外的好处,TryParseExact允许指定严格的DateTimeStyles所以你确切地知道一个合适的date/时间string是否已经通过。


NB重载函数允许你传递一个有效格式数组,用于parsing/转换date,如下所示( TryParseExact直接支持这个),例如

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

但是,为了保持代码简短,我只使用TryParseExact的string数组重载,因为它不适用于通用参数。

先进的例子:
你可以使用?? 操作员默认为故障安全格式,例如

 var dtStr = "2017-12-30 11:37:00"; var dt = (dtStr.toDate()) ?? dtStr.toDate("yyyy-MM-dd HH:mm:ss"); 

在这种情况下, .toDate()将使用常见的本地文化date格式,如果所有这些都失败了,它会尝试使用ISO标准格式"yyyy-MM-dd HH:mm:ss"作为后备。 这样,扩展function可以轻松地“链接”不同的后备格式。


最后,下面是关于背景的一些评论(也就是我这样写的原因):

我更喜欢在这个扩展方法中使用TryParseExact ,因为你避免了exception处理 – 你可以阅读Eric Lippert关于exception的文章,为什么你应该使用TryParse而不是Parse,我引用他的话题: 2)

这个不幸的devise决定 1) [注释:让Parse方法抛出一个exception]令人恼火,当然框架团队在不久之后实现了TryParse,这是正确的。

它的确如此,但是TryParseTryParseExact两者仍然比使用起来舒服得多:它们强迫你使用一个未初始化的variables作为out参数,这个参数不能为空,当你转换的时候你需要评估布尔返回值 -要么立即使用if语句,要么必须将返回值存储在一个额外的布尔variables中,以便稍后进行检查。 如果不知道转换是否成功,您不能只使用目标variables。

在大多数情况下,你只是想知道转换是否成功(当然,如果成功的话,它的价值) ,所以保留所有信息的可以为空的目标variables将是可取的,更优雅 – 因为整个信息是只是存储在一个地方:这是一致的,易于使用,而且更不容易出错。

我写的扩展方法完全是这样的(它也显示了如果你不打算使用它,你每次都要写什么样的代码)。

我相信.toDate(strDateFormat)的好处是它看起来简单而干净 – 就像原来的DateTime.Parse一样简单 – 但能够检查转换是否成功,并且不会抛出exception。


1)这里的意思是exception处理 (即try { ... } catch(Exception ex) { ...} block) – 当你使用Parse时,这是必须的,因为如果一个invalidstring被parsing – 不仅在这种情况下不必要,但也烦人,并使您的代码复杂。 TryParse避免了这一切,因为我提供的代码示例正在显示。


2) Eric Lippert是一位着名的StackOverflow研究员 ,在微软担任C#编译器团队的主要开发人员多年。

 var dateStr = @"2011-03-21 13:26"; var dateTime = DateTime.ParseExact(dateStr, "yyyy-MM-dd HH:mm", CultureInfo.CurrentCulture); 

看看这个链接的其他格式string!

DateTime.Parse()应该适用于该string格式。 参考:

http://msdn.microsoft.com/en-us/library/1k1skd40.aspx#Y1240

它是抛出一个FormatException吗?

将一个可读的string的值放入.NET DateTime中,代码如下所示:

 DateTime.ParseExact("April 16, 2011 4:27 pm", "MMMM d, yyyy h:mm tt", null); 

你也可以使用XmlConvert.ToDateString

var dateStr =“2011-03-21 13:26”; var parsedDate = XmlConvert.ToDateTime(dateStr,“yyyy-MM-dd hh:mm”);

指定datetypes是很好的

var anotherParsedDate = DateTime.ParseExact(dateStr,“yyyy-MM-dd hh:mm”,CultureInfo.InvariantCulture,DateTimeStyles.AssumeUniversal);

有关不同parsing选项的更多详细信息http://amir-shenodua.blogspot.ie/2017/06/datetime-parsing-in-net.html