C# 日期和时间的字符串表示形式转换为其等效的DateTime(stringToDateTime)
一. 标准的日期和时间字符串转换
将日期和时间的字符串表示形式转换为其等效的DateTime对象是开发中很常见的类型转换,我们最常使用的方式是:
// 如果s为null,抛出ArgumentNullException异常 // 如果s 不包含的有效字符串表示形式的日期和时间,抛出FormatException DateTime DateTime.Parse(string s); bool DateTime.TryParse(string s, out DateTime result);
DateTime.Parse在处理过程中,可能会抛出异常让编写代码更加复杂,所以我们更推荐的是DateTime.TryParse方法。
为了避免重复编码和减少开发时编写的代码量,我们将转换的代码封装到我们自己的公共帮助库中:
/// <summary> /// 转换为日期 /// </summary> /// <param name="data">数据</param> public static DateTime ToDate(object data) { if (data == null) return DateTime.MinValue; DateTime result; return DateTime.TryParse(data.ToString(), out result) ? result : DateTime.MinValue; } /// <summary> /// 转换为可空日期 /// </summary> /// <param name="data">数据</param> public static DateTime? ToDateOrNull(object data) { if (data == null) return null; DateTime result; if (DateTime.TryParse(data.ToString(), out result)) return result; return null; }
为了更加方便,我们还可以对string类型做方法扩展(Extension Method),这里不再演示。
二. 自定义格式的日期和时间字符串转换
有些时候会遇到一些特别的需求,需要将自定义格式的日期和时间字符串转换为DateTime对象,这时候用上面的方法就会无法进行转换了。
// 需要转换的字符串,即开头是 月-日,然后是时间 string s = "07-13 15:50:42"
这时我们可以用下面的方法:
// 如果dateTimeStr或者format 是null,会抛出ArgumentNullException异常 // 如果dateTimeStr或者format 是空字符串,则抛出FormatException异常 DateTime DateTime.ParseExact(string s, string format, IFormatProvider provider);
bool DateTime.ParseExact(string s, string format, IFormatProvider provider, DateTimeStyles style, out DateTime result);
使用例子如下:
var dateTimeStr = "07-13 15:50:42"; var dateTime = DateTime.ParseExact(dateTimeStr, "MM-dd HH:mm:ss", CultureInfo.InvariantCulture);
同样我们也将其封装一下:
/// <summary> /// 转换为日期,根据自定义格式字符串 /// </summary> /// <param name="data"></param> /// <param name="format"></param> /// <param name="provider"></param> /// <returns></returns> public static DateTime ToDate(object data, string format, IFormatProvider provider = null) { if (data == null) return DateTime.MinValue; DateTime result; return DateTime.TryParseExact(data.ToString(), format, provider ?? CultureInfo.InvariantCulture, DateTimeStyles.None, out result) ? result : DateTime.MinValue; } /// <summary> /// 转换为可空日期 /// </summary> /// <param name="data">数据</param> public static DateTime? ToDateOrNull(object data, string format, IFormatProvider provider = null) { if (data == null) return null; DateTime result; if (DateTime.TryParseExact(data.ToString(), format, provider ?? CultureInfo.InvariantCulture, DateTimeStyles.None, out result)) return result; return null; }