簡化 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
}
}