Custom ShortDate type (struct: Icomparable)

Here it is a custom C#.NET Date type (struct)that will help you deal with converting to and from strings. The structimplements the IComparable interface and overrides the ToString, Equalsand GetHashCode() functions.

In my work I use short dates all the time sothis struct has only 3 members: day, month and year. It is realy easyto extend the struct to full datetime, just drop a message to my blogif you need it. (http://www.alephdev.blogspot.com)

Code:

using System;
using System.Text.RegularExpressions;

[Serializable]
public struct Date : IComparable
{
#region private members

private UInt16 _day;
private UInt16 _month;
private UInt16 _year;
#endregion

#region public members

public UInt16 Day
{
get { return _day; }
set
{
if (value > 31)
{
throw new ArgumentException("Day out of range[31]");
}
else
{
_day = value;
}
}
}

public UInt16 Month
{
get { return _month; }
set
{
if (value > 12)
{
throw new ArgumentException("Month out of range[12]");
}
else
{
_month = value;
}
}
}

public UInt16 Year
{
get { return _year; }
set
{
if (value.ToString().Length > 4)
{
throw new ArgumentException("Year out of range.");
}
else
{
_year = value;
}
}
}

#endregion

#region constructor

public Date(DateTime dt)
{
_month = Convert.ToUInt16(dt.Month);
_day = Convert.ToUInt16(dt.Day);
_year = Convert.ToUInt16(dt.Year);

}

#endregion

#region functiones

public bool IsDateTime(string dt)
{
Regex rgx = new Regex(@"(?<day>\d{1,2})/(?<month>\d{1,2})/(?<year>(?:\d{4}|\d{2}))");
if (rgx.IsMatch(dt))
{
return true;
}
else
{
return false;
}
}

public DateTime StringToDate(string dt)
{
if (IsDateTime(dt))
{
_day = Convert.ToUInt16(dt.Split('/')[0]);
_month = Convert.ToUInt16(dt.Split('/')[1]);
_year = Convert.ToUInt16(dt.Split('/')[2]);
}
else
{
throw new ArgumentException("The string can't be converted to a date");
}

return new DateTime(Year, Month, Day);

}

public DateTime ToDateTime()
{
return new DateTime(Year, Month, Day);
}

public static DateTime ToDateTime(Date dt)
{
return new DateTime(dt.Year, dt.Month, dt.Day);
}

#endregion

#region IComparable & override implementation

public int CompareTo(object obj)
{
Date dt = (Date) obj;
UInt16 i = 0;
if (dt._day == _day)
{
i += 100;
}
if (dt._month == _month)
{
i += 010;
}
if (dt._year == _year)
{
i += 001;
}

return i;
}

public override bool Equals(object obj)
{
Date dt = (Date) obj;
if (dt._day == _day && dt._month == _month && dt._year == _year)
{
return true;
}
else
{
return false;
}
}

public override int GetHashCode()
{
return (_day ^ _month ^ _year);
}

public override string ToString()
{
return (_day.ToString() + "/" + _month.ToString() + "/" + _year.ToString());
}

#endregion
}
</year></month></day>

Related Articles :

Twitter Digg Delicious Stumbleupon Technorati Facebook Email

No comments yet... Be the first to leave a reply!