簡單日期類

簡化 DateTime 操作


    /// <summary>
    /// 簡單日期類
    /// </summary>
    [Serializable, StructLayout(LayoutKind.Auto)]
    public struct SmartDate : IComparable
    {
        private const string SmartDateT = "t";
        private const string SmartDateToday = "today";
        private const string SmartDateY = "y";
        private const string SmartDateYesterday = "yesterday";
        private const string SmartDateTom = "tom";
        private const string SmartDateTomorrow = "tomorrow";
        private const string ValueNotSmartDateException = "該對象不是SmartDate類型";
        private const string StringToDateException = "輸入的字符串不是日期類型";

        private DateTime date;
        private bool initialized;
        private SmartDate.EmptyValue emptyValue;
        private string format;
        private static string defaultFormat;

        /// <summary>
        /// 獲取簡單日期文本
        /// </summary>
        public string Text
        {
            get
            {
                return SmartDate.DateToString(this.Date, this.FormatString, this.emptyValue);
            }
            set
            {
                this.Date = SmartDate.StringToDate(value, this.emptyValue);
            }
        }
        /// <summary>
        /// 是否爲空日期值
        /// </summary>
        public bool IsEmpty
        {
            get
            {
                if (this.emptyValue == SmartDate.EmptyValue.MinDate)
                {
                    return this.Date.Equals(DateTime.MinValue);
                }
                return this.Date.Equals(DateTime.MaxValue);
            }
        }
        /// <summary>
        /// 日期格式化規則
        /// </summary>
        public string FormatString
        {
            get
            {
                if (this.format == null)
                {
                    this.format = SmartDate.defaultFormat;
                }
                return this.format;
            }
            set
            {
                this.format = value;
            }
        }
        /// <summary>
        /// 空值是否爲最少日期
        /// </summary>
        public bool EmptyIsMin
        {
            get
            {
                return this.emptyValue == SmartDate.EmptyValue.MinDate;
            }
        }
        /// <summary>
        /// 數據庫的值
        /// </summary>
        public object DBValue
        {
            get
            {
                if (this.IsEmpty)
                {
                    return DBNull.Value;
                }
                return this.Date;
            }
        }
        /// <summary>
        /// 獲取時間類
        /// </summary>
        public DateTime Date
        {
            get
            {
                if (!this.initialized)
                {
                    this.date = DateTime.MinValue;
                    this.initialized = true;
                }
                return this.date;
            }
            set
            {
                this.date = value;
                this.initialized = true;
            }
        }
        /// <summary>
        /// 字符串轉換爲日期
        /// </summary>
        /// <param name="value">字符串值</param>
        /// <param name="emptyValue">日期空值標識</param>
        /// <param name="result">返回時間結果</param>
        /// <returns>轉換是否成功</returns>
        private static bool TryStringToDate(string value, SmartDate.EmptyValue emptyValue, ref DateTime result)
        {
            DateTime time1;
            if (string.IsNullOrEmpty(value))
            {
                if (emptyValue == SmartDate.EmptyValue.MinDate)
                {
                    result = DateTime.MinValue;
                    return true;
                }
                result = DateTime.MaxValue;
                return true;
            }
            if (DateTime.TryParse(value, out time1))
            {
                result = time1;
                return true;
            }
            string text1 = value.Trim().ToLower();
            if (((text1 == SmartDateT) || (text1 == SmartDateToday)) || (text1 == ".?"))
            {
                result = DateTime.Now;
                return true;
            }
            if (((text1 == SmartDateY) || (text1 == SmartDateYesterday)) || (text1 == "-?"))
            {
                result = DateTime.Now.AddDays(-1);
                return true;
            }
            if (((text1 != SmartDateTom) && (text1 != SmartDateTomorrow)) && (text1 != "+?"))
            {
                return false;
            }
            result = DateTime.Now.AddDays(1);
            return true;
        }
        /// <summary>
        /// 字符串轉換爲簡單日期
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="result">返回簡單日期</param>
        /// <returns>轉換是否成功</returns>
        public static bool TryParse(string value, ref SmartDate result)
        {
            return SmartDate.TryParse(value, SmartDate.EmptyValue.MinDate, ref result);
        }
        /// <summary>
        /// 字符串轉換爲簡單日期
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyValue">日期空值標識</param>
        /// <param name="result">返回簡單日期</param>
        /// <returns>轉換是否成功</returns>
        public static bool TryParse(string value, SmartDate.EmptyValue emptyValue, ref SmartDate result)
        {
            DateTime time1 = DateTime.MinValue;
            if (SmartDate.TryStringToDate(value, emptyValue, ref time1))
            {
                result = new SmartDate(time1, emptyValue);
                return true;
            }
            return false;
        }
        /// <summary>
        /// 簡單日期轉換爲字符串
        /// </summary>
        /// <param name="format">格式化規則</param>
        /// <returns></returns>
        public string ToString(string format)
        {
            return SmartDate.DateToString(this.Date, format, this.emptyValue);
        }
        /// <summary>
        /// 返回表示當前 MTFramework.Utils.SmartDate 的 System.String。
        /// </summary>
        /// <returns>返回 MTFramework.Utils.SmartDate 的 System.String 值</returns>
        public override string ToString()
        {
            return this.Text;
        }
        /// <summary>
        /// 比較簡單日期
        /// </summary>
        /// <param name="value">簡單日期對象</param>
        /// <returns></returns>
        public int CompareTo(object value)
        {
            if (!(value is SmartDate))
            {
                throw new ArgumentException(ValueNotSmartDateException);
            }
            return this.CompareTo((SmartDate)value);
        }
        /// <summary>
        /// 從此實例中減去指定持續時間
        /// </summary>
        /// <param name="value">從此實例中減去指定持續時間</param>
        /// <returns>System.DateTime,它等於此實例所表示的日期和時間減去 value 所表示的時間間隔</returns>
        public DateTime Subtract(TimeSpan value)
        {
            if (this.IsEmpty)
            {
                return this.Date;
            }
            return this.Date.Subtract(value);
        }
        /// <summary>
        /// 從此實例中減去指定的日期和時間
        /// </summary>
        /// <param name="value">System.DateTime 的一個實例</param>
        /// <returns>System.TimeSpan 間隔,它等於此實例所表示的日期和時間減去 value 所表示的日期和時間</returns>
        public TimeSpan Subtract(DateTime value)
        {
            if (this.IsEmpty)
            {
                return TimeSpan.Zero;
            }
            return this.Date.Subtract(value);
        }
        /// <summary>
        /// 日期字符串轉換爲日期
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyValue">日期空值標識</param>
        /// <returns>日期對象</returns>
        public static DateTime StringToDate(string value, SmartDate.EmptyValue emptyValue)
        {
            DateTime time1 = DateTime.MinValue;
            if (!SmartDate.TryStringToDate(value, emptyValue, ref time1))
            {
                throw new ArgumentException(StringToDateException);
            }
            return time1;
        }
        /// <summary>
        /// 日期字符串轉換爲日期
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyIsMin">如果轉換爲空返回最少值</param>
        /// <returns></returns>
        public static DateTime StringToDate(string value, bool emptyIsMin)
        {
            return SmartDate.StringToDate(value, SmartDate.GetEmptyValue(emptyIsMin));
        }
        /// <summary>
        /// 設置空值數據
        /// </summary>
        /// <param name="emptyValue">日期空值標識</param>
        private void SetEmptyDate(SmartDate.EmptyValue emptyValue)
        {
            if (emptyValue == SmartDate.EmptyValue.MinDate)
            {
                this.Date = DateTime.MinValue;
            }
            else
            {
                this.Date = DateTime.MaxValue;
            }
        }
        /// <summary>
        /// 設置默認的日期格式化規則
        /// </summary>
        /// <param name="formatString">日期格式化規則</param>
        public static void SetDefaultFormatString(string formatString)
        {
            SmartDate.defaultFormat = formatString;
        }
        /// <summary>
        /// 簡單日期轉換
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyValue">日期空值標識</param>
        /// <returns>簡單日期</returns>
        public static SmartDate Parse(string value, SmartDate.EmptyValue emptyValue)
        {
            return new SmartDate(value, emptyValue);
        }
        /// <summary>
        /// 簡單日期轉換
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyIsMin">如果轉換爲空返回最少值</param>
        /// <returns>簡單日期</returns>
        public static SmartDate Parse(string value, bool emptyIsMin)
        {
            return new SmartDate(value, emptyIsMin);
        }
        /// <summary>
        /// 簡單日期轉換
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <returns>簡單日期</returns>
        public static SmartDate Parse(string value)
        {
            return new SmartDate(value);
        }
        /// <summary>
        /// 簡單日期計算
        /// </summary>
        /// <param name="start">簡單日期</param>
        /// <param name="span">時間間隔</param>
        /// <returns>計算結果</returns>
        public static SmartDate operator +(SmartDate start, TimeSpan span)
        {
            return new SmartDate(start.Add(span), start.EmptyIsMin);
        }
        /// <summary>
        /// 簡單日期計算
        /// </summary>
        /// <param name="start">簡單日期</param>
        /// <param name="finish">簡單日期</param>
        /// <returns>計算結果</returns>
        public static SmartDate operator +(SmartDate start, SmartDate finish)
        {
            return new SmartDate(start.Add(finish.Date.TimeOfDay));
        }
        /// <summary>
        /// 簡單日期計算
        /// </summary>
        /// <param name="start">簡單日期</param>
        /// <param name="span">時間間隔</param>
        /// <returns>簡單日期計算結果</returns>
        public static SmartDate operator -(SmartDate start, TimeSpan span)
        {
            return new SmartDate(start.Subtract(span), start.EmptyIsMin);
        }
        /// <summary>
        /// 簡單日期計算
        /// </summary>
        /// <param name="start">簡單日期</param>
        /// <param name="finish">減去的簡單日期</param>
        /// <returns>時間間隔</returns>
        public static TimeSpan operator -(SmartDate start, SmartDate finish)
        {
            return start.Subtract(finish.Date);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator <=(SmartDate obj1, string obj2)
        {
            return obj1.CompareTo(obj2) <= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator <=(SmartDate obj1, SmartDate obj2)
        {
            return obj1.CompareTo(obj2) <= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">時間對象</param>
        /// <returns>比較結果</returns>
        public static bool operator <=(SmartDate obj1, DateTime obj2)
        {
            return obj1.CompareTo(obj2) <= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator <(SmartDate obj1, string obj2)
        {
            return obj1.CompareTo(obj2) < 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator <(SmartDate obj1, SmartDate obj2)
        {
            return obj1.CompareTo(obj2) < 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">時間對象</param>
        /// <returns>比較結果</returns>
        public static bool operator <(SmartDate obj1, DateTime obj2)
        {
            return obj1.CompareTo(obj2) < 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator !=(SmartDate obj1, string obj2)
        {
            return !obj1.Equals(obj2);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator !=(SmartDate obj1, SmartDate obj2)
        {
            return !obj1.Equals(obj2);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator !=(SmartDate obj1, DateTime obj2)
        {
            return !obj1.Equals(obj2);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator >=(SmartDate obj1, string obj2)
        {
            return obj1.CompareTo(obj2) >= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator >=(SmartDate obj1, SmartDate obj2)
        {
            return obj1.CompareTo(obj2) >= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator >=(SmartDate obj1, DateTime obj2)
        {
            return obj1.CompareTo(obj2) >= 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator >(SmartDate obj1, string obj2)
        {
            return obj1.CompareTo(obj2) > 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator >(SmartDate obj1, SmartDate obj2)
        {
            return obj1.CompareTo(obj2) > 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator >(SmartDate obj1, DateTime obj2)
        {
            return obj1.CompareTo(obj2) > 0;
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期字符串</param>
        /// <returns>比較結果</returns>
        public static bool operator ==(SmartDate obj1, string obj2)
        {
            return obj1.Equals(obj2);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator ==(SmartDate obj1, SmartDate obj2)
        {
            return obj1.Equals(obj2);
        }
        /// <summary>
        /// 簡單日期比較
        /// </summary>
        /// <param name="obj1">簡單日期對象</param>
        /// <param name="obj2">日期對象</param>
        /// <returns>比較結果</returns>
        public static bool operator ==(SmartDate obj1, DateTime obj2)
        {
            return obj1.Equals(obj2);
        }
        /// <summary>
        /// 獲取對象的哈希值
        /// </summary>
        /// <returns></returns>
        public override int GetHashCode()
        {
            return this.Date.GetHashCode();
        }
        /// <summary>
        /// 獲取簡單日期空值數據
        /// </summary>
        /// <param name="emptyIsMin">空置類型</param>
        /// <returns></returns>
        private static SmartDate.EmptyValue GetEmptyValue(bool emptyIsMin)
        {
            if (emptyIsMin)
            {
                return SmartDate.EmptyValue.MinDate;
            }
            return SmartDate.EmptyValue.MaxDate;
        }
        /// <summary>
        /// 簡單日期對象比較
        /// </summary>
        /// <param name="obj">簡單日期對象</param>
        /// <returns>比較結果</returns>
        public override bool Equals(object obj)
        {
            if (obj is SmartDate)
            {
                SmartDate date1 = (SmartDate)obj;
                if (this.IsEmpty && date1.IsEmpty)
                {
                    return true;
                }
                return this.Date.Equals(date1.Date);
            }
            if (obj is DateTime)
            {
                return this.Date.Equals((DateTime)obj);
            }
            if (obj is string)
            {
                return this.CompareTo(obj.ToString()) == 0;
            }
            return false;
        }
        /// <summary>
        /// 日期的字符串表示方式
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="formatString">格式化規則</param>
        /// <param name="emptyValue">日期空值標識</param>
        /// <returns>日期字符串</returns>
        public static string DateToString(DateTime value, string formatString, SmartDate.EmptyValue emptyValue)
        {
            if (emptyValue == SmartDate.EmptyValue.MinDate)
            {
                if (value == DateTime.MinValue)
                {
                    return string.Empty;
                }
            }
            else
            {
                if (value == DateTime.MaxValue)
                {
                    return string.Empty;
                }
            }
            return string.Format("{0:?" + formatString + "}?", value);
        }
        /// <summary>
        /// 日期的字符串表示方式
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="formatString">格式化規則</param>
        /// <param name="emptyIsMin">日期空值標識</param>
        /// <returns>日期字符串</returns>
        public static string DateToString(DateTime value, string formatString, bool emptyIsMin)
        {
            return SmartDate.DateToString(value, formatString, SmartDate.GetEmptyValue(emptyIsMin));
        }
        /// <summary>
        /// 日期的字符串表示方式
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="formatString">格式化規則</param>
        /// <returns>日期字符串</returns>
        public static string DateToString(DateTime value, string formatString)
        {
            return SmartDate.DateToString(value, formatString, true);
        }
        /// <summary>
        /// 日期比較
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <returns>比較結果</returns>
        public int CompareTo(string value)
        {
            return this.Date.CompareTo(SmartDate.StringToDate(value, this.emptyValue));
        }
        /// <summary>
        /// 日期比較
        /// </summary>
        /// <param name="value">簡單日期</param>
        /// <returns>比較結果</returns>
        public int CompareTo(SmartDate value)
        {
            if (this.IsEmpty && value.IsEmpty)
            {
                return 0;
            }
            return this.date.CompareTo(value.Date);
        }
        /// <summary>
        /// 日期比較
        /// </summary>
        /// <param name="value">日期</param>
        /// <returns>比較結果</returns>
        public int CompareTo(DateTime value)
        {
            return this.Date.CompareTo(value);
        }
        /// <summary>
        /// 遞增時間間隔
        /// </summary>
        /// <param name="value">時間間隔</param>
        /// <returns>遞增後的日期</returns>
        public DateTime Add(TimeSpan value)
        {
            if (this.IsEmpty)
            {
                return this.Date;
            }
            return this.Date.Add(value);
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyValue">日期空值標識</param>
        public SmartDate(string value, SmartDate.EmptyValue emptyValue)
        {
            this.emptyValue = emptyValue;
            this.format = null;
            this.initialized = true;
            this.date = DateTime.MinValue;
            this.Text = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期字符串</param>
        /// <param name="emptyIsMin">日期空值標識</param>
        public SmartDate(string value, bool emptyIsMin)
        {
            this.emptyValue = SmartDate.GetEmptyValue(emptyIsMin);
            this.format = null;
            this.initialized = true;
            this.date = DateTime.MinValue;
            this.Text = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期字符串</param>
        public SmartDate(string value)
        {
            this.emptyValue = SmartDate.EmptyValue.MinDate;
            this.format = null;
            this.initialized = true;
            this.date = DateTime.MinValue;
            this.Text = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="emptyValue">日期空值標識</param>
        public SmartDate(SmartDate.EmptyValue emptyValue)
        {
            this.emptyValue = emptyValue;
            this.format = null;
            this.initialized = false;
            this.date = DateTime.MinValue;
            this.SetEmptyDate(emptyValue);
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="emptyValue">日期空值標識</param>
        public SmartDate(DateTime value, SmartDate.EmptyValue emptyValue)
        {
            this.emptyValue = emptyValue;
            this.format = null;
            this.initialized = false;
            this.date = DateTime.MinValue;
            this.Date = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期</param>
        /// <param name="emptyIsMin">日期空值標識</param>
        public SmartDate(DateTime value, bool emptyIsMin)
        {
            this.emptyValue = SmartDate.GetEmptyValue(emptyIsMin);
            this.format = null;
            this.initialized = false;
            this.date = DateTime.MinValue;
            this.Date = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="value">日期</param>
        public SmartDate(DateTime value)
        {
            this.emptyValue = SmartDate.EmptyValue.MinDate;
            this.format = null;
            this.initialized = false;
            this.date = DateTime.MinValue;
            this.Date = value;
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        /// <param name="emptyIsMin">日期空值標識</param>
        public SmartDate(bool emptyIsMin)
        {
            this.emptyValue = SmartDate.GetEmptyValue(emptyIsMin);
            this.format = null;
            this.initialized = false;
            this.date = DateTime.MinValue;
            this.SetEmptyDate(this.emptyValue);
        }
        /// <summary>
        /// 構造方法
        /// </summary>
        static SmartDate()
        {
            SmartDate.defaultFormat = "d?";
        }

        /// <summary>
        /// 日期空值標識
        /// </summary>
        public enum EmptyValue
        {
            /// <summary>
            /// 最少日期
            /// </summary>
            MinDate = 0,
            /// <summary>
            /// 最大日期
            /// </summary>
            MaxDate = 1
        }
    }



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章