예제 #1
0
파일: Utility.cs 프로젝트: zhouweiaccp/X
        /// <summary>转为时间日期,转换失败时返回最小时间。支持字符串、整数(Unix秒)</summary>
        /// <param name="value">待转换对象</param>
        /// <param name="defaultValue">默认值。待转换对象无效时使用</param>
        /// <returns></returns>
        public virtual DateTimeOffset ToDateTimeOffset(Object value, DateTimeOffset defaultValue)
        {
            if (value == null || value == DBNull.Value)
            {
                return(defaultValue);
            }

            // 特殊处理字符串,也是最常见的

            if (value is String str)
            {
                str = str.Trim();
                if (str.IsNullOrEmpty())
                {
                    return(defaultValue);
                }

                if (DateTimeOffset.TryParse(str, out var n))
                {
                    return(n);
                }
                if (str.Contains("-") && DateTimeOffset.TryParseExact(str, "yyyy-M-d", null, DateTimeStyles.None, out n))
                {
                    return(n);
                }
                if (str.Contains("/") && DateTimeOffset.TryParseExact(str, "yyyy/M/d", null, DateTimeStyles.None, out n))
                {
                    return(n);
                }
                if (DateTimeOffset.TryParse(str, out n))
                {
                    return(n);
                }
                return(defaultValue);
            }
            // 特殊处理整数,Unix秒,绝对时间差,不考虑UTC时间和本地时间。
            if (value is Int32 k)
            {
                return(k == 0 ? DateTimeOffset.MinValue : _dto1970.AddSeconds(k));
            }
            if (value is Int64 m)
            {
                if (m > 100 * 365 * 24 * 3600L)
                {
                    return(_dto1970.AddMilliseconds(m));
                }
                else
                {
                    return(_dto1970.AddSeconds(m));
                }
            }

            try
            {
                return(Convert.ToDateTime(value));
            }
            catch { return(defaultValue); }
        }