majid_i68
شنبه 26 بهمن 1392, 00:47 صبح
ممنونم از توضیحات خوب شما ..
این کلاس توسط یکی از برنامه نویسان آماده شده بود... میخوام بفهمم چطور میشه با این کلاس تقویم شمسی رو نشون نداد..
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
}
vBulletin® v4.2.5, Copyright ©2000-1403, Jelsoft Enterprises Ltd.