ممنونم از توضیحات خوب شما ..
این کلاس توسط یکی از برنامه نویسان آماده شده بود... میخوام بفهمم چطور میشه با این کلاس تقویم شمسی رو نشون نداد..
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Globalization;
using Regex = System.Text.RegularExpressions.Regex;
using System.Collections;
namespace AppPersian
{
public struct PersianDate : IComparable,
IComparable<PersianDate>,
IComparer,
IComparer<PersianDate>,
ICloneable
{
#region Fields
private static readonly PersianCalendar calendar = new PersianCalendar();
public static readonly PersianDate MinValue = new PersianDate(1, 1, 1);
public static readonly PersianDate MaxValue = new PersianDate(1500, 12, 29, 11, 59, 59);
private string[] weekArray;
private string[] monthsArray;//
private int year;
private int month;
private int day;
private int hour;
private int minute;
private int second;
private DayOfWeek dayOfWeek;
#endregion
#region Ctor
//}
public PersianDate(int year, int month, int day, int hour, int minute, int second)
{
if (!PersianDate.ValidDate(year, month, day, hour, minute, second))
throw new ArgumentException("Date time is not valid");
this.year = year;
this.month = month;
this.day = day;
this.hour = hour;
this.minute = minute;
this.second = second;
weekArray = new string[] { "شنبه", "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه" };
monthsArray = new string[] { "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند" };
var dt = calendar.ToDateTime(year, month, day, hour, minute, second, 0);
this.dayOfWeek = calendar.GetDayOfWeek(dt);
}
public PersianDate(int year, int month, int day) : this(year, month <= 0 ? 1 : month, day <= 0 ? 1 : day, 0, 0, 0) { }
#endregion
#region Props
public int Year
{
get { return year; }
//set
//{
// if (!PersianDate.ValidDate(value, month, day, hour, minute, second))
// throw new ArgumentException("Year is out of range");
// year = value;
//}
}
public int Month
{
get { return month; }
//set
//{
// if (!PersianDate.ValidDate(year, value, day, hour, minute, second))
// throw new ArgumentException("Month is out of range");
// month = value;
//}
}
public int Day
{
get { return day; }
//set
//{
// if (!PersianDate.ValidDate(year, month, value, hour, minute, second))
// throw new ArgumentException("Day is out of range");
// day = value;
//}
}
public int Hour
{
get { return hour; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, value, minute, second))
// throw new ArgumentException("Day is out of range");
// hour = value;
//}
}
public int Minute
{
get { return minute; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, hour, value, second))
// throw new ArgumentException("Day is out of range");
// minute = value;
//}
}
public int Second
{
get { return second; }
//set
//{
// if (!PersianDate.ValidDate(year, month, day, hour, minute, value))
// throw new ArgumentException("Day is out of range");
// hour = value;
//}
}
public DayOfWeek DayOfWeek
{
get { return dayOfWeek; }
}
public static PersianDate Now
{
get
{
return Parse(DateTime.Now);
}
}
#endregion
#region Methods
#region Static Methods
public static bool ValidDate(int year, int month, int day, int hour, int minute, int second)
{
bool result = true;
try
{
calendar.ToDateTime(year, month, day, hour, minute, second, 0);
}
catch (ArgumentException) { result = false; }
return result;
}
[Obsolete("please use valid date method ValidDate(1388,05,06,04,10,20) ")]
public static bool ValidDate(int year, int month, int day)
{
bool result = true;
try
{
calendar.ToDateTime(year, month, day, 0, 0, 0, 0);
}
catch (ArgumentException) { result = false; }
return result;
}
public static bool ValidDate(PersianDate persianDate)
{
return PersianDate.ValidDate(persianDate.Year, persianDate.Month, persianDate.Day, persianDate.Hour, persianDate.Minute, persianDate.Second);
}
public static int Compare2Date(PersianDate persianDate1, PersianDate persianDate2)
{
if (persianDate1.year > persianDate2.Year) return 1;
else if (persianDate1.year < persianDate2.Year) return -1;
if (persianDate1.month > persianDate2.Month) return 1;
else if (persianDate1.month < persianDate2.Month) return -1;
if (persianDate1.day > persianDate2.Day) return 1;
else if (persianDate1.day < persianDate2.Day) return -1;
if (persianDate1.hour > persianDate2.hour) return 1;
else if (persianDate1.hour < persianDate2.hour) return -1;
if (persianDate1.minute > persianDate2.Minute) return 1;
else if (persianDate1.minute < persianDate2.Minute) return -1;
if (persianDate1.second > persianDate2.Second) return 1;
else if (persianDate1.second < persianDate2.Second) return -1;
return 0;
}
public static PersianDate Parse(DateTime date)
{
PersianDate pd = new PersianDate(
calendar.GetYear(date),
calendar.GetMonth(date),
calendar.GetDayOfMonth(date),
calendar.GetHour(date),
calendar.GetMinute(date),
calendar.GetSecond(date));
pd.dayOfWeek = calendar.GetDayOfWeek(date);
return pd;
}
public static PersianDate Parse(string dateString)
{
return PersianDate.MinValue;
}
#endregion
#region Public Methods
public PersianDate AddHours(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddHours(value));
}
catch (Exception ex) { throw ex; }
}
public PersianDate AddMinutes(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddMinutes(value));
}
catch (Exception ex) { throw ex; }
}
public PersianDate AddSeconds(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddSeconds(value));
}
catch (Exception ex) { throw ex; }
}
public PersianDate AddDays(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddDays(value));
}
catch (Exception ex) { throw ex; }
}
public PersianDate AddMonths(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddMonths(value));
}
catch (Exception ex) { throw ex; }
}
public PersianDate AddYears(int value)
{
try
{
return (PersianDate)(((DateTime)this).AddYears(value));
}
catch (Exception ex) { throw ex; }
}
public int GetDaysInMonth()
{
return calendar.GetDaysInMonth(year, month);
}
public int GetDaysInYear()
{
return calendar.GetDaysInYear(year);
}
#endregion
#region internal Method(s)
internal PersianDate GetLastSaturday()
{
PersianDate date = AddDays(-(day + 1));
return date.AddDays(-(GetWeekNo(date.dayOfWeek) - 1));
}
#endregion
#region Private Method(s)
private int GetWeekNo(DayOfWeek week)
{
switch (week)
{
case DayOfWeek.Saturday:
return 1;
case DayOfWeek.Sunday:
return 2;
case DayOfWeek.Monday:
return 3;
case DayOfWeek.Tuesday:
return 4;
case DayOfWeek.Wednesday:
return 5;
case DayOfWeek.Thursday:
return 6;
case DayOfWeek.Friday:
return 7;
}
return -1;
}
#endregion
#region Override Methods
/// <summary>
/// for example ToString(yyyy-MM-dd hh:mm:ss);
/// </summary>
/// <param name="format"></param>
/// <returns></returns>
public string ToString(string format)
{
format = Regex.Replace(format, "dd", day.ToString("00"));
format = Regex.Replace(format, "MM", month.ToString("00"));
format = Regex.Replace(format, "yyyy", year.ToString("0000"), System.Text.RegularExpressions.RegexOptions.Ignore Case);
format = Regex.Replace(format, "DD", weekArray[GetWeekNo(calendar.GetDayOfWeek((DateTime)this)) - 1]);
format = Regex.Replace(format, "ND", weekArray[GetWeekNo(dayOfWeek) - 1]);
format = Regex.Replace(format, "NM", monthsArray[month - 1]);
format = Regex.Replace(format, "hh", hour.ToString("00"));
format = Regex.Replace(format, "mm", minute.ToString("00"));
format = Regex.Replace(format, "ss", second.ToString("00"));
return format;
}
public override string ToString()
{
return string.Format("{0:D4}/{1:D2}/{2:D2} {3:D2}:{4:D2}:{5:D2}", year, month, day, hour, minute, second);
}
public override bool Equals(object obj)
{
if (obj is PersianDate)
return ((PersianDate)obj) == this;
return false;
}
public override int GetHashCode()
{
return this.ToString().GetHashCode();
}
#endregion
#endregion
#region Operators
public static bool operator ==(PersianDate persianDate1, PersianDate persianDate2)
{
return (
persianDate1.Second == persianDate2.Second &&
(persianDate1.Minute == persianDate2.Minute) &&
(persianDate1.Hour == persianDate2.Hour) &&
(persianDate1.Day == persianDate2.Day) &&
(persianDate1.Month == persianDate2.Month) &&
(persianDate1.Year == persianDate2.Year)
);
}
public static bool operator !=(PersianDate persianDate1, PersianDate persianDate2)
{
return !(
persianDate1.Second == persianDate2.Second &&
(persianDate1.Minute == persianDate2.Minute) &&
(persianDate1.Hour == persianDate2.Hour) &&
(persianDate1.Day == persianDate2.Day) &&
(persianDate1.Month == persianDate2.Month) &&
(persianDate1.Year == persianDate2.Year)
);
}
public static bool operator >(PersianDate persianDate1, PersianDate persianDate2)
{
return PersianDate.Compare2Date(persianDate1, persianDate2) == 1;
}
public static bool operator <(PersianDate persianDate1, PersianDate persianDate2)
{
return PersianDate.Compare2Date(persianDate1, persianDate2) == -1;
}
public static bool operator >=(PersianDate persianDate1, PersianDate persianDate2)
{
int res = PersianDate.Compare2Date(persianDate1, persianDate2);
return res == 1 || res == 0;
}
public static bool operator <=(PersianDate persianDate1, PersianDate persianDate2)
{
int res = PersianDate.Compare2Date(persianDate1, persianDate2);
return res == -1 || res == 0;
}
#endregion
#region Implicit Casting
public static implicit operator DateTime(PersianDate persianDate)
{
if (PersianDate.ValidDate(persianDate))
return calendar.ToDateTime(persianDate.Year, persianDate.Month, persianDate.Day, persianDate.Hour, persianDate.Minute, persianDate.Second, 0);
return DateTime.MinValue;
}
public static implicit operator PersianDate(DateTime date)
{
if (date.Equals(DateTime.MinValue))
return MinValue;
return Parse(date);
}
#endregion
#region IComparable Members
public int CompareTo(object obj)
{
if (!(obj is PersianDate))
new ArgumentException("obj is not PersianDate");
return CompareTo((PersianDate)obj);
}
#endregion
#region IComparable<PersianDate> Members
public int CompareTo(PersianDate other)
{
return PersianDate.Compare2Date(this, other);
}
#endregion
#region IComparer Members
public int Compare(object x, object y)
{
if (!(x is PersianDate))
throw new ArgumentException("x is not PersianDate");
if (!(y is PersianDate))
throw new ArgumentException("y is not PersianDate");
return PersianDate.Compare2Date((PersianDate)x, (PersianDate)y);
}
#endregion
#region IComparer<PersianDate> Members
public int Compare(PersianDate x, PersianDate y)
{
return PersianDate.Compare2Date(x, y);
}
#endregion
#region ICloneable Members
public object Clone()
{
return (PersianDate)this.MemberwiseClone();
}
#endregion
}//end class
}