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

 

posted @ 2015-12-02 10:21  天也冷了  阅读(930)  评论(0编辑  收藏  举报