在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格式
正如我稍后解释的,我总是喜欢TryParse
和TryParseExact
方法。 因为它们有点笨重,所以我写了一个扩展方法 ,使得parsing更加容易:
var dtStr = "2011-03-21 13:26"; DateTime? dt = dtStr.toDate("yyyy-MM-dd HH:mm");
不像Parse
, ParseExact
等,它不会抛出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/时间模式。
请注意 ,我们需要result
和dt
在一起,因为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,这是正确的。
它的确如此,但是TryParse
和TryParseExact
两者仍然比使用起来舒服得多:它们强迫你使用一个未初始化的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