# برنامه نویسی با محصولات مایکروسافت > برنامه نویسی مبتنی بر Microsoft .Net Framework > C#‎‎ >  مرجع کامل حل مشکلات تاریخ شمسی

## Vahid_Nasiri

به جمع دوستداران سی شارپ خوش آمدید!  :twisted: 


﻿using System;


namespace Zarin
&#123;
	/// &lt;summary>
	/// clsPesianDate.
	/// Converted to VC#‎ by &#58; Vahid_Nasiri@Yahoo.Com
	/// &lt;/summary>
	public class clsPersianDate
	&#123;
		

		public clsPersianDate&#40;&#41;
		&#123;
			//
			// TODO&#58; Add constructor logic here &#40;chi! bih!&#41;
			//
		&#125;


		/// &lt;summary>
		/// GetShamsiDate.
		/// Its name is so clear!
		/// &lt;/summary>
		public string GetSystemShamsiDate&#40;&#41;
		&#123;

			int Year = System.DateTime.Now.Year;   
			int Month = System.DateTime.Now.Month;
			int Day = System.DateTime.Now.Day ;
			return GetShamsiDate&#40;Year, Month, Day&#41;;

		&#125;

	
		/// &lt;summary>
		/// GetShamsiDate.
		/// Converts the specified date to shamsi.
		/// &lt;/summary>
		public string GetShamsiDate&#40;int	Year,int Month,int Day&#41;
		&#123;
			int&#91;&#93; A =&#123;0,10, 11,  9, 11, 10, 10, 9, 9, 9, 8, 9, 9&#125;;
			int&#91;&#93; B =&#123;0,30, 30, 29, 31, 31, 31, 31, 31, 31, 30, 30, 30&#125;;
		
			int	 YY;
			int  MM;
			int  DD;
			string CHm,CHd  ;

			// Get current Date values
			YY = Year - 621;
			if &#40;&#40;Year % 4 == 0&#41; && &#40;Month == 3&#41; && &#40;Day &lt; 21&#41;&#41; 
			&#123;
				A&#91;3&#93;++;
				B&#91;3&#93;++;
			&#125;
			MM = Month + 9;
			DD = Day + A&#91;Month&#93;;
			if &#40;DD > B&#91;Month&#93;&#41; 
			&#123;
				DD -= B&#91;Month&#93;;
				MM++;
			&#125;
			if &#40;MM > 12&#41; 
				MM -= 12;
			
			if &#40;MM == 10 && DD > 10&#41;  
				YY--;
			
			if &#40;MM == 11 || MM == 12&#41;  
				YY--;

			if &#40;MM&lt;10&#41; 
				CHm = "0" + MM.ToString&#40;&#41; ;
			else
				CHm = MM.ToString&#40;&#41; ;

			if &#40;DD&lt;10&#41; 
				CHd = "0" + DD.ToString&#40;&#41; ;
			else 
				CHd = DD.ToString&#40;&#41; ;

			return YY.ToString&#40;&#41;  + '/' + CHm + '/' + CHd;
		&#125;

		public string systemDayOfWeek&#40;&#41;
		&#123;
			string res="";
			
			switch&#40; System.DateTime.Now.DayOfWeek.ToString&#40;&#41;  &#41;
			&#123;
				case "Saturday" &#58;
					res =  "شنبه";
					break;

				case "Sunday" &#58;
					res =  "یک شنبه" ;
					break;

				case "Monday"&#58;
					res =  "دوشنبه";
					break;

				case "Tuesday"&#58;
					res =  "سه شنبه";
					break;

				case "Wednesday"&#58;
					res =  "چهار شنبه";
					break;

				case "Thursday"&#58;
					res =  "پنج شنبه";
					break;

				case "Friday"&#58;
					res =  "جمعه" ;
					break;
			&#125;

			return res ;

		&#125;

		public string  systemShamsiDatTime&#40;&#41;
		&#123;

			return 
				GetSystemShamsiDate&#40;&#41; + " اکنون " +"\n"+
				System.DateTime.Now.ToLongTimeString&#40;&#41; +"\n"+
				System.DateTime.Now.ToLongDateString&#40;&#41; + " " +"\n"+
				System.DateTime.Now.DayOfWeek + " "+
				systemDayOfWeek&#40;&#41;   ;
		&#125;

	&#125;
&#125;


اگر راستش رو بخوام بگم من قسمتی از این کد را از دلفی به سی شارپ تبدیل کرده ام.  :oops:

----------


## Vahid_Nasiri

خواهش می کنم!

نام فصای نام این کلاس همانطور که مشاهده می فرمایید Zarin  است. زرین اینجا نام پروژه است. ( پس بهتر است آنرا مطابق نام کلی پروژه ویرایش کنید )
برای استفاده کافی است یک متغیر از کلاس ایجاد کنید و سپس متد را به صورت زیر فراخوانی کنید :

			clsPersianDate m_d = new clsPersianDate&#40;&#41;;
			lblDate.Text =  m_d.GetSystemShamsiDate&#40;&#41;;

در مثال فوق من یک لیبل روی فرم گذاشته ام . و سپس با استفاده از متغیر تعریف شده از کلاس به تابع مورد نظر دسترسی پیدا کرده ام.

در ضمن کلاس فوق امتحان خودش را پس داده است.

----------


## Vahid_Nasiri

نتیجه محاسبات این کلاس در سال جدید یک روز عقب افتاده است!  :oops:   بنابراین بازنویسی جدید آن از روی تقویم استاد بیرشک انجام شده که اینجا اتچ می شود. تست شده و مشکلی ندارد. در ضمن با کلاس فوق هم کاملا سازگار است و نیازی به تغییر در کدها ندارید (فقط این کلاس را جایگزین قبلی نمایید).

----------


## linux

خود دات نت این کار توابعی برای این کار دارد.

Imports System
Imports System.Globalization


Public Class SamplesHijriCalendar   

   Public Shared Sub Main&#40;&#41;

      ' Sets a DateTime to April 3, 2002 of the Gregorian calendar.
      Dim myDT As New DateTime&#40;2002, 4, 3, New GregorianCalendar&#40;&#41;&#41;

      ' Creates an instance of the HijriCalendar.
      Dim myCal As New HijriCalendar&#40;&#41;

      ' Displays the values of the DateTime.
      Console.WriteLine&#40;"April 3, 2002 of the Gregorian calendar equals the following in the Hijri calendar&#58;"&#41;
      DisplayValues&#40;myCal, myDT&#41;

      ' Adds two years and ten months.
      myDT = myCal.AddYears&#40;myDT, 2&#41;
      myDT = myCal.AddMonths&#40;myDT, 10&#41;

      ' Displays the values of the DateTime.
      Console.WriteLine&#40;"After adding two years and ten months&#58;"&#41;
      DisplayValues&#40;myCal, myDT&#41;

   End Sub 'Main

   Public Shared Sub DisplayValues&#40;myCal As Calendar, myDT As DateTime&#41;
      Console.WriteLine&#40;"   Era&#58;        &#123;0&#125;", myCal.GetEra&#40;myDT&#41;&#41;
      Console.WriteLine&#40;"   Year&#58;       &#123;0&#125;", myCal.GetYear&#40;myDT&#41;&#41;
      Console.WriteLine&#40;"   Month&#58;      &#123;0&#125;", myCal.GetMonth&#40;myDT&#41;&#41;
      Console.WriteLine&#40;"   DayOfYear&#58;  &#123;0&#125;", myCal.GetDayOfYear&#40;myDT&#41;&#41;
      Console.WriteLine&#40;"   DayOfMonth&#58; &#123;0&#125;", myCal.GetDayOfMonth&#40;myDT&#41;&#41;
      Console.WriteLine&#40;"   DayOfWeek&#58;  &#123;0&#125;", myCal.GetDayOfWeek&#40;myDT&#41;&#41;
      Console.WriteLine&#40;&#41;
   End Sub 'DisplayValues

End Class 'SamplesHijriCalendar 


'This code produces the following output.

'

'April 3, 2002 of the Gregorian calendar equals the following in the Hijri calendar&#58;

'   Era&#58;        1

'   Year&#58;       1423

'   Month&#58;      1

'   DayOfYear&#58;  21

'   DayOfMonth&#58; 21

'   DayOfWeek&#58;  Wednesday

'

'After adding two years and ten months&#58;

'   Era&#58;        1

'   Year&#58;       1425

'   Month&#58;      11

'   DayOfYear&#58;  316

'   DayOfMonth&#58; 21

'   DayOfWeek&#58;  Saturday


&#91;JScript&#93; No example is available for JScript. To view a Visual Basic, C#‎, or C++‎ example, click the Language Filter button  in the upper-left corner of the page.

Requirements
Platforms&#58; Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 family

تازه بگری کدهای بیشتری هم پیدا می کنی
راستش همچین خفن هم نیستی    :قهقهه:

----------


## Vahid_Nasiri

این کلاس رو هم حتما ببینید:
An implementation of the PersianCalendar class in C#‎ which is lacking in the .NET Framework.

----------


## Identifier

آقای نصیری واقعن ممنون خیلی کمکم کرد با اینکه تاز #c کار شدیم ولی خیلی استفاده کرم  :flower: 
با تشکر از اینکه وقتتون رو گذاشتید و حواب دادید. 
 :thnx:

----------


## Peyman_Ranjbar

> خوب دوست عزیز بگو ما هم یاد بگیریم


 
DateTime dt = new DateTime(1384,2,31,new PersianCalendar());

  
با این کد میشه روز ها رو در بازه تعریف شده ماههای خورشیدی تعریف کرد همونطوری که میدونید ماه دوم میلادی 28 روز بیشتر نداره ولی اینجا 31 اردیبهشت رو وارد کردم.
برای تبدیل تاریخ از میلادی به خورشیدی

System.Globalization.PersianCalendar PCal = new PersianCalendar();
int year = PCal.GetYear(new DateTime(yy,mm,dd,new GregorianCalendar()));
int month = PCal.GetMonth(new DateTime(yy,mm,dd,new GregorianCalendar()));
int day = PCal.GetDay(new DateTime(yy,mm,dd,new GregorianCalendar()));
 
تبدیل از خورشیدی به میلادی

System.Globalization.GregorianCalendar GCal = new GregorianCalendar();
int year = GCal.GetYear(new DateTime(yy,mm,dd,new PersianCalendar()));
int month = GCal.GetMonth(new DateTime(yy,mm,dd,new PersianCalendar()));
int day = GCal.GetDay(new DateTime(yy,mm,dd,new PersianCalendar()));
 

البته باید کلاس persianclaendar که آقای امید خندان راد زحمتش رو کشیدند و ساختند رو در برنامه تون بذارید

خیلی سعی کردم که این کلاس رو upload کنم ولی چون امشب نتایج کنکور رو زدند و همه دارن از اینترنت استفاده می کنن نتونستم اینجا بذارم اگه پیدا نکردید فردا اونو میذارمش

----------


## abdollahi

این کلاس Persian API چیز خوبیه! تو دات نت تهیه شده. درنتیجه میشه تو VB.Net ، C#‎.Net، ASP.Net و ... ازش استفاده کرد. از آدرس زیر دانلودش کنید:
www.shahabfar.com/misc/persia

----------


## Mahdavi

با سلام 
مدتی هست که می  بینم بحثهای زیادی در مورد تغییر تاریخ میلادی سه شمسی مطرح شده و راه حل های گوناگون.
همه این راه ها یه مشکل دارند و اون اینکه اگه در پروژه قسمتهای مختلفی داشته باشید که از تاریخ استفاده می کنند شما برای تبدیل همه اونا باید کد بنویسید. و دیده شده که بعضی ها کنترلهایی هم واسه تاریخ نوشته و می فروشند. در صورتیکه با یه تغییر کوچک در Pcal.cs که آقای *امید خندان* زحمت اونو کشیدند و اضافه کردن چند خط کد ساده تمام تاریخ هاتون شمسی نمایش داده میشه و شما به شکل میلادی ذخیره خواهید کرد. از خوبی های این روش اینه که دیگه نیازی نیست تاریخ رو به شکل رشته ای ذخیره کنید . بلکه چون میلادی ذخیره میشه شما خیلی راحت می تونید با اونا کار کنید.
من کد Pcal.cs رو ضمیمه می کنم که شما باید به پروژه مورد نظرتون اضافه کنید و همچنین چند خط کد زیر رو به InitializeComponent مربوط به Global.asax قرار دهید تا کل تاریخ های سیستم شما شمسی شوند و 
حتی کنترل Calender خود ‍C#‎.
دیگه فکر کنم کسی در مورد تاریخ تاپیکی اینجا نذاره.(انشاالله):)
کد یه برنامه نمونه هم ضمیه شده است.

private void InitializeComponent()
		{	
		    System.Globalization.CultureInfo cf = new System.Globalization.CultureInfo("fa-IR");
			cf.DateTimeFormat.Calendar =new System.Globalization.PersianCalendar();
			cf.DateTimeFormat.MonthNames = new string[]{
		"فروردین",
		"اردیبهشت",
		"خرداد",
		"تیر",
		"مرداد",
		"شهریور",
		"مهر",
		"آبان",
		"آذر",
		"دی",
		"بهمن" ,
		"اسفند",
		""};
			System.Threading.Thread.CurrentThread.CurrentCultu  re = cf;
			this.components = new System.ComponentModel.Container();
		}

----------


## Peyman_Ranjbar

> سلام
> 
> کسی این لینک دانلود کلاس ها رو ندیده...؟
> اگه می شه دوباره لینکش رو بزارید 
> ممنون


این هم کلاس PCall  که خواسته بودید...

----------


## صابر

اینو یادم نیست از کجا داونلود کردم.
ولی خیلی جالبه، حتماً ببینید.
سورس کد + Dll

----------


## رضا عربلو

با تشکر از آقای زواری (با تقدیم یک دسته گل)

برای دوستانی که با این تاپیک نگاه می کنند، به لینک زیر یه سر بزنند.
http://search.msn.com/results.aspx?q...alaaliCalendar

----------


## محمد میرمصطفی

*مایکروسافت حجت را تمام کرد.*
System.Globalization.PersianCalendar PersianCalendar = new PersianCalendar();
 
String Today = PersianCalendar.GetYear(DateTime.Now).ToString() + "/";
 
Today += PersianCalendar.GetMonth(DateTime.Now).ToString() + "/";
 
Today += PersianCalendar.GetDayOfMonth(DateTime.Now).ToString() + ", ";
 
MessageBox.Show(Today);
 

دیگه همه چی تموم شد. تقویم هجری شمسی

----------


## محمد میرمصطفی

ولی نمیدونم چرا نمیشه به عنوان یه CultureInfo تعریفش کرد:
 
System.Globalization.CultureInfo CultureInfo = new System.Globalization.CultureInfo(1065);
CultureInfo.DateTimeFormat.Calendar = new System.Globalization.PersianCalendar();
 
این خط دومی Error میده. کسی می‏تونه کمک کنه؟

----------


## nasimnastaran

با سلام !
ما نتونتستیم از کلاس Persian Calendar که جناب آقای نصیری توی تاپیک گذاشتند در Application
چندان استفاده بکنیم . چون من می خواستم با انتخاب تاریخ توسط کاربر با استفاده از کنترل DateTimePicker یا MonthCalendar ، اطلاعات مورد نظر در یک Table ذخیره گردد ( به صورت شمسی ).( البته توی وب کنترل شمسی را نشان می دهد  ولی در winApp ، روی کنترل تاثیری ندارد ). میشه چگونگی استفاده از این کلاس را روی کنترل مورد اشاره جهت انتخاب تاریخ توسط کاربر و ذخیره آن در یک Table، راهنمائی ام کنید ؟
( دات ما 2003 می باشد )
با تشکر !

----------


## Mehrafrooz

تاریخ رو ابتدا باید تبدیل به میلادی بکنید بعدا در یک table اگر فیلد از نوع date هست ذخیره کنید چون فیلدهای date تاریخ شمسی رو قبول نمی کنند . و بعد وقتی که از جدول می خونید به دوباره به شمسی تبدیل کنید .
اما کد :
datarow dr = dataset.tables["your_Table_Name"].newrow;
dr["Date_Field"]=this.DateTimePicker.text;
dataset.tables["Your_Table_Name"].add(dr);
your_Data_Adaptor.update(dataset,"Your_Table_Name"  );
البته کار تبدیل و غیره رو باید خودتون انجام بدید . این مثال برای تنها یک فیلد بود از این طریق می تونید فیلدهای دیگر رو هم اضافه کنید .
اگر فیلد تون از نوع text یا memo یا char باشه مشکلی پیش نمیاد ولی اگر از نوع date باشه باید دقت کنید که فرمت DateTimePicker با فرمت فیلدتون بخونه یعنی از نوع shortdate یا longdate .
در ضمن تبدیل هم یادتون نره اگر فیلدتون از نوع date بود.

----------


## ali_kolahdoozan

ببین همینه که میخوای ؟؟؟

----------


## ali_kolahdoozan

این یکی دیگس

----------


## Mehrafrooz

تاریخ تاپیک رو دقت کنید .



> توی برنامه&#172;ی سی شارپ&#172;ام می خوام چک کنم که اگه تاریخ سیستم با تاریخی که در نظر گرفتم یکی بود (مثلا اگه امروز شنبه است ) یه کنترل اجرا بشه .


توی MSDN هست . برای مقایسه با تاریخ امروز

System.DateTime today1 =new System.DateTime(System.DateTime.Today.Ticks);
System.DateTime today2 = new System.DateTime(System.DateTime.Today.Ticks);
System.DateTime tomorrow = new System.DateTime( System.DateTime.Today.AddDays(1).Ticks);
// todayEqualsToday gets true.
bool todayEqualsToday = System.DateTime.Equals(today1, today2);
// todayEqualsTomorrow gets false.
bool todayEqualsTomorrow = System.DateTime.Equals(today1, tomorrow);

----------


## Behrooz_CS

*
اینم یه کد تاریخ توپ که خودم نوشتم و مطمئنم هیچ جا پیدا نمی کنید . حالشو ببرید.
این کد تست شده و کاملا سالمه

*
using System;

namespace DateFarsi
{
   /// <summary>
   /// &#202;&#199;&#209;&#237;&#220;&#206; &#212;&#227;&#211;&#220;&#220;&#237;
   /// *** &#228;&#230;&#212;&#202;&#229; &#200;&#229;&#220;&#220;&#209;&#230;&#210; &#227;&#205;&#227;&#220;&#220;&#207;&#237;
   /// </summary>
   public class DateFarsi
   {
      public DateFarsi()
      {
         //
         // TODO: Add constructor logic here
         //
      }
      /// <summary>
      /// &#202;&#199;&#209;&#237;&#206; &#212;&#227;&#211;&#237; &#209;&#199; &#227;&#205;&#199;&#211;&#200;&#229; &#227;&#237;˜&#228;&#207;
      /// </summary>
      /// <returns>&#202;&#199;&#209;&#237;&#206; &#212;&#227;&#211;&#237; &#209;&#199; &#200;&#209; &#227;&#237; �&#209;&#207;&#199;&#228;&#207;</returns>
      public static string GetDate()
      {
         int Y = DateTime.Today.Year;
         int M = DateTime.Today.Month;
         int D = DateTime.Today.Day;
         int DOY = DateTime.Today.DayOfYear;         
         int YY=0, MM=1, DD=0;
         bool L = DateTime.IsLeapYear(Y);
         bool L_1 = DateTime.IsLeapYear(Y-1);

         if(!L && !L_1)
            if((M==3 && D<21) || M<3)
            {
               DD = 365 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         else if(!L && L_1) 
            if((M==3 && D<21) || M<3)
            {
               DD = 366 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         else if(L && !L_1)
            if((M==3 && D<20) || M<3)
            {
               DD = 365 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         
         for( ; MM<=6 && DD>31 ; ++MM, DD-=31);
         
         if(DD>30 && MM>6)
            for( ; DD>30 ; ++MM ,DD-=30);
            
         return YY.ToString() + "/" + 
            (MM<10 ? "0" + MM.ToString() : MM.ToString()) + "/" +
            (DD<10 ? "0" + DD.ToString() : DD.ToString());
      }
   }
}
*
اما این یکی خیلی کاملتر وخیلی کارا می کنه 
ولی کامل تست نشده و تابع تبدیل تاریخ شمسی به میلادیش  خوب کار نمی کنه
اگه کاملش کردید لطفا برایم بفرستید. مرسی.
 
*

using System;

namespace BM
{
   /// <summary>
   /// &#202;&#199;&#209;&#237;&#220;&#206; &#212;&#227;&#211;&#220;&#220;&#237;
   /// *** &#228;&#230;&#212;&#202;&#229; &#200;&#229;&#220;&#220;&#209;&#230;&#210; &#227;&#205;&#227;&#220;&#220;&#207;&#237;
   /// </summary>
   public class DateFarsi
   {
      public DateFarsi()
      {
         //
         // TODO: Add constructor logic here
         //
      }

      //**************************************************  *******
      //static int YY,MM,DD;
      //**************************************************  *******
      public static int GetYearNow
      {
         get
         {
            return int.Parse(GetDate().Substring(0,4));
         }
      }

      public static int GetMonthNow
      {
         get
         {
            return int.Parse(GetDate().Substring(5,2));
         }
      }

      public static int GetDayNow
      {
         get
         {
            return int.Parse(GetDate().Substring(8,2));
         }
      }
      //**************************************************  *******
      /// <summary>
      /// &#202;&#199;&#209;&#237;&#206; &#212;&#227;&#211;&#237; &#209;&#199; &#227;&#205;&#199;&#211;&#200;&#229; &#227;&#237;˜&#228;&#207;
      /// </summary>
      /// <returns>&#202;&#199;&#209;&#237;&#206; &#212;&#227;&#211;&#237; &#209;&#199; &#200;&#209; &#227;&#237; �&#209;&#207;&#199;&#228;&#207;</returns>
      public static string GetDate()
      {
         return ConvertEnglishDate2FarsiDate(DateTime.Today);
      }
      // OK
      public static string ConvertEnglishDate2FarsiDate(DateTime DateEnglish)
      {
         int Y = DateEnglish.Year;
         int M = DateEnglish.Month;
         int D = DateEnglish.Day;
         int DOY = DateEnglish.DayOfYear;         
         int YY=0, MM=1, DD=0;
         bool L = DateTime.IsLeapYear(Y);
         bool L_1 = DateTime.IsLeapYear(Y-1);

         if(!L && !L_1)
            if((M==3 && D<21) || M<3)
            {
               DD = 365 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         else if(!L && L_1) 
            if((M==3 && D<21) || M<3)
            {
               DD = 366 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         else if(L && !L_1)
            if((M==3 && D<20) || M<3)
            {
               DD = 365 - 79 + DOY;
               YY = Y - 622;
            }
            else
            {
               DD = DOY - 79;
               YY = Y - 621;
            }
         
         for( ; MM<=6 && DD>31 ; ++MM, DD-=31);
         
         if(DD>30 && MM>6)
            for( ; DD>30 ; ++MM ,DD-=30);
            
         return MergeDate(YY, MM, DD);
      }
      // OKs
      public static void ConvertDOY2MD(int DOY , ref int M , ref int D)
      {
         D = DOY;
         for(M=0 ; M<=6 && D>31 ; ++M, D-=31);
         
         if(D>30 && M>6)
            for( ; D>30 ; ++M ,D-=30);
      }
      // OK
      public static void FormatDate(ref string Dt)
      {         
         string[] d = Dt.Split('/');
         if(d == null)
            return;
         if(d[0].Length == 2)
            d[0] = "13" + d[0];

         if(d[1].Length == 1)
            d[1] = "0" + d[1];
         
         if(d[2].Length == 1)
            d[2] = "0" + d[2];
         
         Dt = d[0] + "/" + d[1] + "/" + d[2];

      }
      // OK
      public static bool ValDate(string D)
      {
         if(D == null)
            return false;
         FormatDate(ref D);         
         int yy = int.Parse(D.Substring(0,4));
         int mm = int.Parse(D.Substring(5,2));
         int dd = int.Parse(D.Substring(8,2));

         if(!(yy >= 1300 && yy<=1399))
            return false;          

         if(!(mm >=1 && mm <= 12))
            return false;

         if(!(dd >=1 && dd <= 30 ))
            return false;            
         
         if(!(dd==31 && mm>=1 && mm<=6))
            return false;

         if(!(dd==30 && DateTime.IsLeapYear(yy-1)))
            return false;

         return true;
      }
      // OK
      public static int ConvertDayOfWeek2Int(DayOfWeek DOW)
      {
         int dow=0;
         switch(DOW)
         {
            case DayOfWeek.Saturday :
               dow = 1;
               break;
            case DayOfWeek.Sunday :
               dow = 2;
               break;
            case DayOfWeek.Monday :
               dow = 3;
               break;
            case DayOfWeek.Tuesday :
               dow = 4;
               break;
            case DayOfWeek.Wednesday :
               dow = 5;
               break;
            case DayOfWeek.Thursday :
               dow = 6;
               break;
            case DayOfWeek.Friday :
               dow = 7;
               break;
         }
         return dow;
      }

      // OK
      public static bool IsLeapYear(int Year)
      {
         return (Math.Abs(1383-Year)%4 == 0);
      }

      // OK
      public static int GetDaysInMonth(int Year , int Month)
      {
         int Days =0;
         if(Month<7)
            Days = 31;
         else if(Month>6)
            Days = 30;

         if(Month==12)
            if( ! IsLeapYear(Year) )
               Days = 29;
         return Days;
      }

      // OK
      public static int GetDayOfWeek_int(string Date)
      {         
         return ConvertDayOfWeek2Int(GetDayOfWeek(Date));
      }

      // OK
      public static DayOfWeek GetDayOfWeek(string Date)
      {
         string Dt = ConvertDateFarsi2English(Date);
         //throw(new Exception(Dt));
         int Y=0,M=0,D=0;
         SplitDate(Dt , ref Y , ref M, ref D);
         try
         {
            DateTime dt =new DateTime(Y,M,D);
            return dt.DayOfWeek;
         }
         catch
         {
            throw(new Exception("D=" + D.ToString()));
            //return "";
         }
      }
      // OK
      public static string GetDayOfWeek_StringFarsi(string Date)
      {         
         string day="";
         switch(GetDayOfWeek_int(Date))
         {
            case 1 :
               day = "&#212;&#228;&#200;&#229;";
               break;
            case 2 :
               day = "&#237;˜ &#212;&#228;&#200;&#229;";
               break;
            case 3 :
               day = "&#207;&#230;&#212;&#228;&#200;&#229;";
               break;
            case 4 :
               day = "&#211;&#229; &#212;&#228;&#200;&#229;";
               break;
            case 5 :
               day = "�&#229;&#199;&#209;&#212;&#228;&#200;&#229;"  ;
               break;
            case 6 :
               day = "�&#228;&#204; &#212;&#228;&#200;&#229;";
               break;
            case 7 :
               day = "&#204;&#220;&#227;&#218;&#229;";
               break;
         }
         return day;
      }
      // OK
      public static void SplitDate(string Date , ref int Y , ref int M , ref int D)
      {
         FormatDate(ref Date);
         if(Date.Length != 10)
            throw(new Exception("Error in Date Length (Date = " + Date + ")" ));
         Y = int.Parse(Date.Substring(0,4));
         M = int.Parse(Date.Substring(5,2));
         D = int.Parse(Date.Substring(8,2));
      }
      // OK
      public static string MergeDate(int Y ,int M , int D)
      {
         return Y.ToString() + "/" + 
            (M<10 ? "0" + M.ToString() : M.ToString()) + "/" +
            (D<10 ? "0" + D.ToString() : D.ToString());
      }
      // OK
      public static int GetDayOfYear(string Date)
      {
         int Y=0,M=0,D=0;
         SplitDate(Date , ref Y, ref M, ref D);
         int DOY=D,i=0;
         for(i=1 ; i<=M-1 ; i++)
            DOY += 30;
         
         for(i=1 ; i<=6 && (M-i-1)>=0 ; i++)
            DOY++;

         return DOY;
      }

      // OK
      public static string ConvertDateFarsi2English(string DateFarsi)
      {
         int Y=0,M=0,D=0;
         int YY=0,MM=0,DD=0;

         SplitDate(DateFarsi , ref Y, ref M, ref D);
         int DOY = GetDayOfYear(DateFarsi);
         
         if(IsLeapYear(Y))
         {
            if((M==10 && D<11) || M<11)
            {
               YY = Y + 621;
               DOY += 79;
            }
            else
            {
               YY = Y + 622;
               DOY = DOY - 286;
            }
         }
         else
         {
            if((M==10 && D<12) || M<11 )
            {
               YY = Y + 621;
               DOY += 78;
            }
            else
            {
               YY = Y + 622;
               DOY = DOY - 287;
            }
         }
         try
         {
            for(MM=1 ; DOY > DateTime.DaysInMonth(YY , MM) && MM <12 ; MM++)
               DOY -= DateTime.DaysInMonth(YY , MM);
         }
         catch
         {
            throw(new Exception("M="+MM.ToString() + " D=" + DOY.ToString()));
         }

         DD = DOY;

         return MergeDate(YY , MM , DD);
      }
   }
}

----------


## BuggerMan

سلام
چندوقت پیش روی پروژه ای کار می کردم که نیاز شد چند کلاس تو سی شارپ تهیه کنم که یکی از اونها مربوط به همین پست است.
کلاسهایی که کد اونها همه تو زیر اومده عبارتند از :
CShamsiDate
کلاس تاریخ شمسی تضمین می کنم که درست کار میکنه سال کبیسه هم سرش می شه
CAPIFunctions
فراخوانی توابع API تو سی شارپ
CHookProvider
راه اندازی هوک (البته محلی) تو سی شارپ 
CCommonFunctions
یک سری توابع دم دستی

یادتون نره که نیم اسپیس CommonClasses رو به پروژه تان اضافه کنید.

موفق باشید.

----------


## مهدی رحیم زاده

دوست عزیز از این dllها استفاده کن

----------


## mjdeveloper

من یه کلاس برای تاریخ شمسی نوشتم 
----------------------------------------------
using System;
using System.Data;
using System.Configuration;
using System.Web;
using System.Web.Security;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.Web.UI.WebControls.WebParts;
using System.Web.UI.HtmlControls;

/// <summary>
/// Summary description for MyDate
/// </summary>
public class MyDate
{
    private bool MiladiIsLeap(int miladiYear)
    {
        if (((miladiYear % 100) != 0 && (miladiYear % 4) == 0) || ((miladiYear % 100) == 0 && (miladiYear % 400) == 0))
            return true;
        else
            return false;
    }
    public string miladi2shamsi(int type)
    {
        int iMiladiMonth = DateTime.Today.Month;
        int iMiladiDay = DateTime.Today.Day;
        int iMiladiYear = DateTime.Today.Year;
        int shamsiDay, shamsiMonth, shamsiYear;
        int dayCount, farvardinDayDiff, deyDayDiff;
        int[] sumDayMiladiMonth = { 0, 31, 59, 90, 120, 151, 181, 212, 243, 273, 304, 334 };
        int[] sumDayMiladiMonthLeap = { 0, 31, 60, 91, 121, 152, 182, 213, 244, 274, 305, 335 };
        string[] W ={ "یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه" };
        string[] mon ={ "فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند" };

        farvardinDayDiff = 79;
        if (MiladiIsLeap(iMiladiYear))
        {
            dayCount = sumDayMiladiMonthLeap[iMiladiMonth - 1] + iMiladiDay;
        }
        else
        {
            dayCount = sumDayMiladiMonth[iMiladiMonth - 1] + iMiladiDay;
        }
        if ((MiladiIsLeap(iMiladiYear - 1)))
        {
            deyDayDiff = 11;
        }
        else
        {
            deyDayDiff = 10;
        }
        if (dayCount > farvardinDayDiff)
        {
            dayCount = dayCount - farvardinDayDiff;
            if (dayCount <= 186)
            {
                switch (dayCount % 31)
                {
                    case 0:
                        shamsiMonth = dayCount / 31;
                        shamsiDay = 31;
                        break;
                    default:
                        shamsiMonth = (dayCount / 31) + 1;
                        shamsiDay = (dayCount % 31);
                        break;
                }
                shamsiYear = iMiladiYear - 621;
            }
            else
            {
                dayCount = dayCount - 186;
                switch (dayCount % 30)
                {
                    case 0:
                        shamsiMonth = (dayCount / 30) + 6;
                        shamsiDay = 30;
                        break;
                    default:
                        shamsiMonth = (dayCount / 30) + 7;
                        shamsiDay = (dayCount % 30);
                        break;
                }
                shamsiYear = iMiladiYear - 621;
            }
        }
        else
        {
            dayCount = dayCount + deyDayDiff;
            switch (dayCount % 30)
            {
                case 0:
                    shamsiMonth = (dayCount / 30) + 9;
                    shamsiDay = 30;
                    break;
                default:
                    shamsiMonth = (dayCount / 30) + 10;
                    shamsiDay = (dayCount % 30);
                    break;
            }
            shamsiYear = iMiladiYear - 622;
        }
        int iYear = shamsiYear;
        int iMonth = shamsiMonth;
        int iDay = shamsiDay;
        int dow = 0;
        switch (DateTime.Today.DayOfWeek)
        {
            case DayOfWeek.Sunday: dow = 1; break;
            case DayOfWeek.Monday: dow = 2; break;
            case DayOfWeek.Tuesday: dow = 3; break;
            case DayOfWeek.Wednesday: dow = 4; break;
            case DayOfWeek.Thursday: dow = 5; break;
            case DayOfWeek.Friday: dow = 6; break;
            case DayOfWeek.Saturday: dow = 7; break;

        }
        string shamsidate = string.Empty;
        if (type == 1)
            shamsidate = W[dow - 1] + "  " + iDay.ToString() + "  " + mon[iMonth - 1] + "    " + iYear.ToString();
        else
            shamsidate = iDay.ToString() + "/" + iMonth.ToString() + "/" + iYear.ToString();
        return shamsidate;
    }
}
----------------------------------------------------------------------------------------
امید وارم خوشتون بیاد
طریقه استفاده:
MyDate mdate = new MyDate();
Datelbl.Text = mdate.miladi2shamsi(1);
-----------------------------------------------------

مقدار ورودی 1 تاریخ رو به صورت حروف و مقدار 0 به صورت عددی به شما خواهد داد

----------


## omid_Ahmadi

http://www.codeproject.com/cs/miscctrl/FarsiLibrary.asp

----------


## اَرژنگ

http://www.codeproject.com/article.a...38290638339147
http://lytopia.com/Articles/Article.aspx?id=6

----------


## VNSoft

این کلاس روی سال های کبیسه کاملا دقیق عمل کرده . اکثر کامپوننت های موجود در این زمینه دارای نقص می باشند .

----------


## SYSMAN

> مگه کلاس *PersianCalender* خود دات نت چشه؟


PersianCalendar چیزیش نیست فقط:


http://www.codeproject.com/csharp/JalaliCalendar.asp

همین یک مشکل کوچیک رو داره

----------


## __H2__

سلام
با نظرات کاربر linux کاملاً موافق هستم، من خودم دو الگوریتم کاملاً متفاوت در کتابها برای به دست آوردن سالهای کبیسه پیدا کردم و جالب آنکه هر دو با نام تقویم جلالی بود !!!!! (این لینک را در جای دگر هم داده بود، نگاهی بیاندازید تا منظور را از اختلاف نظر اساتید متوجه شوید! )

در مورد اختلاف دو تاریخ هم روش اصلی تبدیل به تعداد روز و در صورت نیاز تبدیل مجدد به تاریخ است، اصلاً خود مقدار تاریخ در دات نت به صورت تعداد زمانهای 100 نانو سانیه سپری شده از اول سال صفر نگه داشته میشود.

در مورد ایراد در PersianCalendar هم من خیلی کم مشکل داشتم ولی از وقتی در تبدیلات ساعت را رأس 12 ظهر میگذارم دیگر به مشکلی بر نخوردم در نتیجه برای کم کردن دو تاریخ میتوانید از کد زیر استفاده کنید. و نیاز به هیچ DLL هم ندارد

Dim convert As New System.Globalization.PersianCalendar
Dim DayDiff As Integer = (convert.ToDateTime(1388, 1, 1, 12, 0, 0, 0) - convert.ToDateTime(1386, 2, 31, 12, 0, 0, 0)).Days

----------


## golihaghighi

از این کد می تونید برای تبدیل تاریخ میلادی به شمسی استفاده کنید.


 
    Function Shamsi(Optional ByVal Date1 As String = "", Optional ByVal SmallDate1 As Boolean = False, Optional ByVal Year4Char As Boolean = True) As String
        Dim U, Ym, Rp, D, P, Sd, Ls, Ye, I, Mn, Yy, J, Dd As Integer
        'Dim d, p As Integer()
        Dim w, Mon, Days As String()
        Dim T4, T5, T6 As Integer(,)
        'd = New Integer() {20, 19, 20, 20, 21, 21, 22, 22, 22, 22, 21, 21}
        'p = New Integer() {11, 12, 10, 12, 11, 11, 10, 10, 10, 9, 10, 10}
        w = New String() {"یکشنبه", "دوشنبه", "سه شنبه", "چهارشنبه", "پنجشنبه", "جمعه", "شنبه"}
        T4 = New Integer(,) {{11, 12, 11, 11}, {12, 13, 12, 12}, _
                            {11, 11, 10, 11}, {13, 12, 12, 12}, _
                            {12, 11, 11, 11}, {12, 11, 11, 11}, _
                            {11, 10, 10, 10}, {11, 10, 10, 10}, _
                            {11, 10, 10, 10}, {10, 9, 9, 9}, _
                            {11, 10, 10, 10}, {11, 10, 10, 10}}
        T5 = New Integer(,) {{20, 19, 20, 20}, {19, 18, 19, 19}, _
                            {19, 20, 20, 20}, {19, 20, 20, 20}, _
                            {20, 21, 21, 21}, {21, 21, 21, 21}, _
                            {21, 22, 22, 22}, {21, 22, 22, 22}, _
                            {21, 22, 22, 22}, {21, 22, 22, 22}, _
                            {20, 21, 21, 21}, {20, 21, 21, 21}}
        T6 = New Integer(,) {{10, 11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9}, _
                            {11, 12, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10}}
        If SmallDate1 = True Then
            Mon = New String() {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12"}
        Else
            Mon = New String() {"فروردین", "اردیبهشت", "خرداد", "تیر", "مرداد", "شهریور", "مهر", "آبان", "آذر", "دی", "بهمن", "اسفند"}
        End If
        If SmallDate1 = True Then
            Days = New String() {"01", "02", "03", "04", "05", "06", "07", "08", "09", "10", "11", "12", "13", "14", "15", _
                                "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31"}
        Else
            Days = New String() {"یکم", "دوم", "سوم", "چهارم", "پنجم", "ششم", "هفتم", "هشتم", "نهم", "دهم", _
                                "یازدهم", "دوازدهم", "سیزدهم", "چهاردهم", "پانزدهم", "شانزدهم", "هفدهم", "هجدهم", "نوزدهم", "بیستم", _
                                "بیست و یکم", "بیست و دوم", "بیست و سوم", "بیست و چهارم", "بیست و پنجم", "بیست و ششم", "بیست و هفتم", _
                                "بیست و هشتم", "بیست و نهم", "سیم", "سی و یکم"}
        End If
 
        If Date1 = "" Then
            Date1 = Convert.ToString(Date.Now)
        End If
        Yy = Convert.ToDateTime(Date1).Year
        J = Convert.ToDateTime(Date1).Month
        Dd = Convert.ToDateTime(Date1).Day
        U = 0
        Rp = 0
        If KabiseM(Yy) = True Then
            U = 1
        End If
        Ym = Yy - 622
        If KabiseS(Ym) = True Then
            Rp = 1
        End If
        If (Rp = 0 And U = 1) Then
            I = 1
        ElseIf (Rp = 1 And U = 0) Then
            I = 2
        ElseIf (Rp = 0 And U = 0) Then
            I = 3
        Else
            I = 4
        End If
        D = T4(J - 1, I - 1)
        P = T5(J - 1, I - 1)
        If Dd <= P Then
            Sd = D + Dd - 1
            Mn = T6(0, J - 1)
            Ls = 1
        Else
            Sd = Dd - P
            Mn = T6(1, J - 1)
            Ls = 2
        End If
        If (J > 3 Or (Ls = 2 And J = 3)) Then
            Ye = Yy - 621
        Else
            Ye = Yy - 622
        End If
 
        '****************************
        '****************************
        If SmallDate1 = True Then
            If Year4Char = True Then
                Shamsi = Trim(Str(Ye)) + "/" + Trim(Mon(Mn - 1)) + "/" + Trim(Days(Sd - 1))
            Else
                Shamsi = Mid(Trim(Str(Ye)), 3, 2) + "/" + Trim(Mon(Mn - 1)) + "/" + Trim(Days(Sd - 1))
            End If
        Else
            If Year4Char = True Then
                Shamsi = w(Convert.ToDateTime(Date1).DayOfWeek) + " " + Days(Sd - 1) + " " + Mon(Mn - 1) + " " + Str(Ye)
            Else
                Shamsi = w(Convert.ToDateTime(Date1).DayOfWeek) + " " + Days(Sd - 1) + " " + Mon(Mn - 1) + " " + Mid(Trim(Str(Ye)), 3, 2)
            End If
        End If
    End Function
    Function KabiseS(ByVal Year As Integer) As Boolean
        Dim s, kkb, x, w As Integer
        s = (Year + 16) \ 33
        kkb = s * 33 - 16
        If kkb + 1 = Year Then
            KabiseS = False
        Else
            x = (Year + 15) \ 33
            w = Year - x - 17
            If (w Mod 4) = 0 Then
                KabiseS = True
            Else
                KabiseS = False
            End If
        End If
    End Function
    Function KabiseM(ByVal Year As Integer) As Boolean
        If (Year Mod 100) = 0 Then
            If (Year Mod 400) = 0 Then
                KabiseM = True
            Else
                KabiseM = False
            End If
        Else
            If (Year Mod 4) = 0 Then
                KabiseM = True
            Else
                KabiseM = False
            End If
        End If
    End Function

----------


## __H2__

سلام



> به نظر من هم استفاده از کلاس مایکروسافت بهتر است زیرا اگر تا اون موقع مشکلی در کلاس persiancalndar دات نت فریم ورک وجود داشته باشد یا مایکروسافت آنرا در نسخه های بعدی اش حل و یا سرویس پک می دهد


دقیقاً موافقم! شما استفاده کنید تا سال  140X   اگر مشکلی بود حل میشود!




> اینکه باید هر ۳۳ سال یک سال کبیسه باشه، از نظر رسمی مدرک و یا استنادی داره؟


در مورد الگوریتم ثابت 33 ساله در اینترنت به کرات نقل شده ولی من مرجع رسمی سراغ ندارم و در مورد آن الگوریتم دیگر هم که سری 29 و 37 هم دارد من در کتاب ها دیده ام و متاسفانه چون قضیه مربوط به سالها قبل است نامی یادم نیست ولی یادداشت برداری هایی داشتم که اگر خواستید و وقت کردم میتوانم تایپ کنم، گرچه فکر نمیکنم نیازی باشد و یادداشت های من هم که کتابهایی که نامشان یادم نیست مرجع حساب نمیشود.




> یا اینکه یک چیزه دلبخواهیه که بعضیها میگند باید باشه و بعضیها برایشان مهم نیست؟


دلبخواه نیست ولی اختلاف نظرهایی وجود دارد
در تاپیک دیگری هم این لینک را داده بودم، یک نگاهی بیاندازید.

ولی اگر بتوان نظر استاد ایرج ملک پور را فهمید مشکل حل است، چون بعید میدانم کسی در ایران بتواند در ضمینه فوق با ایشان مخالفت کند.
(فرقی ندارد چه تقویمی استفاده میکنید یه نگاهی به تنظیم کننده اش بیاندازید!)




> مگر سازمان استانداردها کارش این نیست؟ یعنی تقویم رسمی ایران بر حسبه اینکه مایکراسافت چی پیاده کرده است؟


استاندارد را نمیدانم! همه میگویند تقویم ایران جلالی است! مایکروسافت هم بر اساس الگوریتم معروفی که در اینترنت وجود دارد (دوره های ثابت 33 ساله) کدش را نوشته.

----------


## PC2st

وقتی که بخواهیم یک تاریخ شمسی مثل زیر رو به شیئ DateTime مقدار دهی کنیم، با خطا مواجه میشیم:

DateTime dt = new DateTime(1386, 6, 31);

چون چنین تاریخ میلادی وجود نداره و همانطور که خودتون میدونید، باید از PersianCalendar استفاده کرد:

DateTime dt = new DateTime(1386, 6, 31, pcal);
Console.WriteLine(dt.ToShortDateString());

اما همانطور که در خط دوم از کد فوق نمایش داده میشه، تاریخ بر اساس تاریخ میلادیه معادل تاریخ شمسی، ذخیره میشه (بعبارتی تاریخ شمسی بصورت تاریخ میلادی در dt قرار میگیره). و برای استخراج تاریخ شمسی، همانطور که گفتید باید از متدهای GetYear و GetMonth و غیره، استفاده کرد، یعنی:

Console.WriteLine("Year: {0}\nMonth: {1}\nDay: {2}", pcal.GetYear(dt), pcal.GetMonth(dt), pcal.GetDayOfMonth(dt));





> برای اینکه اعداد به دست آمده از این کد رو تبدیل کنیم به یک تاریخ(متغیری از نوع datetime)


در واقع نمیشه یک تاریخ شمسی رو در متغیری از نوع DateTime ذخیره کرد (مگر بصورت معادلی از تاریخ میلادی). چون اعداد بدست آمده از این متدها (GetYear و GetMonth و غیره) رو هر وقت بخوایم برای شیئ DateTime مشخص کنیم، این اعداد بر حسب تاریخ میلادی در شیئ DateTime قرار میگیره و به عبارتی با تبدیل این اعداد به متغیری از نوع DateTime، تاریخ شمسی هم به معادل میلادیش تغییر پیدا میکنه.

----------


## tthenry14plus

*سلام*
*می دونم که خیلی ها این الگوریتم رو می دونند ولی خیلی ها هم از کامپوننت های آماده استفاده می کنند، این اگوریتم مخصوص دسته دومه که بدونند چطور این کار انجام میشه.*

*الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی :* 

تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است. 

برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "79" روز است.

برای تشخیص کبیسه بودن یا نبودن سال از روش زیر استفاده می کنیم:
اگر سال داده شده بر100و400 بخشپذیر باشد" یا بر" 100 بخشپذیر نباشد بر 4 بخشپذیر باشد" آنگاه سال کبیسه است، در غیر این صورت سال کبیسه نیست.
با توجه به کبیسه بودن یا کبیسه نبودن سال مشخص می کنیم که در کدامین روز سال میلادی قرار داریم.

دو حالت پیش می آید:

روزی که در آن قرار داریم از 79 بیشتر است 
به این معنی است که در ماههای بعد از فروردین قرار داریم.
حال باید مشخص کنیم که در 6 ماه اول سال شمسی قرار داریم یا در 6 ماه دوم سال قرار داریم،
برای اینکار ابتدا 79 روز از تعداد روزها کم می کنیم تا در اول فروردین قرار بگیریم حال اگر تعداد روزها از "186"(31*6) کمتر باشد یعنی در 6 ماه اول سال شمسی قرار داریم در غیر اینصورت در 6 ماه دوم قرار داریم. 

اگر در 6 ماه اول سال قرار گرفته باشیم :تعداد روزها را بر "31" تقسیم می کنیم(6 ماه اول در سال شمسی 31 روزه است.)
اگر باقیمانده این تقسیم صفر شد خارج قسمت تقسیم برابر با ماه شمسی می شود و روز شمسی برابر با 31 می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه یک می شود و روز شمسی همان باقیمانده است. 

اگر در 6 ماه دوم سال قرار گرفته باشیم : "186" روز از تعداد روزها کم می کنیم و آن را بر "30" تقسیم می کنیم .
اگرباقیمانده این تقسیم صفر شد خارج قسمت تقسیم باضافه"6" برابر با ماه شمسی می شودو روز شمسی برابر با30 می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"7" می شودو روز شمسی همان باقیمانده است. 

سال شمسی از تفاضل سال میلادی با"621" بدست می آید.

روزی که در آن قرار داریم کمتر از"79"است 

که این به این معنی است که درروزهایی بین اولین روزسال میلادی تا اولین روز شمسی (ماههای دی ،بهمن و اسفند)قرار داریم. 
اختلاف روز بین اولین روز سال میلادی داده شده و اولین روز دی ماه در سال شمسی را در نظر می گیریم که این اختلاف برای سال کبیسه"11" و برای غیر کبیسه "10" است.*دقت کنید که در این الگوریتم برای مشخص کردن این اختلاف باید سال قبل از سال داده شده را در نظر بگیریم زیرا سال قبل بر روی اولین روز سال میلادی تاثیر می گزارد.* 

اختلاف روز با تعداد روز محاسبه شده جمع می کنیم ، آن را بر"30" تقسیم می کنیم(3 ماه آخر سال شمسی 30 روزه است.).
اگر باقیمانده این تقسیم صفر شود خارج قسمت تقسیم باضافه"9" برابر با ماه شمسی می شودو روز شمسی برابر با"30" می شود.
اگر باقیمانده صفر نشود ماه شمسی برابر با خارج قسمت باضافه"10"می شودو روز شمسی همان باقیمانده است.

در این حالت سال شمسی از تفاضل سال میلادی با"622" بدست می آید.(زیرا در سال قبل قرار داریم.)

*این هم کدش و ضمیمه این تاپیک هم قطعه برنامه تاریخ شمسیه با #C*


bool MiladiIsLeap(int miladiYear)
{
if(((miladiYear % 100)!= 0 && (miladiYear % 4) == 0) || ((miladiYear % 100)== 0 && (miladiYear % 400) == 0))
returntrue;
else
returnfalse;
}
//***************************************
void MiladiToShamsi(int iMiladiMonth,int iMiladiDay,int iMiladiYear)
{
 
int shamsiDay, shamsiMonth, shamsiYear;
int dayCount, farvardinDayDiff, deyDayDiff;
int[] sumDayMiladiMonth = newint[]{0,31,59,90,120,151,181,212,243,273,304,334};
int[] sumDayMiladiMonthLeap=newint[]{0,31,60,91,121,152,182,213,244,274,305,335};
 
 
farvardinDayDiff=79;
if (MiladiIsLeap(iMiladiYear))
{
dayCount = sumDayMiladiMonthLeap[iMiladiMonth-1] + iMiladiDay; 
}
else
{
dayCount = sumDayMiladiMonth[iMiladiMonth-1] + iMiladiDay; 
}
if((MiladiIsLeap(iMiladiYear - 1)))
{
deyDayDiff = 11;
}
else
{
deyDayDiff = 10;
}
if (dayCount > farvardinDayDiff) 
{
dayCount = dayCount - farvardinDayDiff;
if (dayCount <= 186)
{
switch (dayCount%31)
{
case 0:
shamsiMonth = dayCount / 31;
shamsiDay = 31;
break;
default:
shamsiMonth = (dayCount / 31) + 1; 
shamsiDay = (dayCount%31);
break;
}
shamsiYear = iMiladiYear - 621;
}
else
{
dayCount = dayCount - 186;
switch (dayCount%30)
{
case 0:
shamsiMonth = (dayCount / 30) + 6;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 7;
shamsiDay = (dayCount%30);
break;
}
shamsiYear = iMiladiYear - 621;
}
}
else
{
dayCount = dayCount + deyDayDiff;
 
switch (dayCount%30)
{
case 0 :
shamsiMonth = (dayCount / 30) + 9;
shamsiDay = 30;
break;
default:
shamsiMonth = (dayCount / 30) + 10;
shamsiDay = (dayCount%30);
break;
}
shamsiYear = iMiladiYear - 622;
 
}

----------


## tthenry14plus

*تاریخ تقویم های شمسی و قمری*
سال 467 در زمان سلطنت جلال الدین ملکشاه سلجوقی و وزارت خواجه نظام الملک ، چون خواستند ترتیب تقویم یعنی محاسبه سال و ماه را بر طبق قوانین نجومی و دقیق معین کنند، گروهی از دانشمندان آگاه به علم نجوم را برای این کار انتخاب کردند و آنها مامور بودند تا محاسبه را ترتیب دهند و این محاسبه ، درست ترین و دقیق ترین محاسبه سال شماری و معروف به تقویم جلالی است و خیام یکی از این دانشمندان و گویا سرپرست این گروه بوده است.هر دستگاه تقسیم زمان به سال ، ماه ، هفته و روز و جدولی که شامل این تقسیمات است ، به تقویم یا تاریخ موسوم است.همه این دستگاه های قراردادی حساب زمان در نهایت به امور متناوب طبیعی و دوره های گردش طبیعی برمی گردد. در واقع باید گفت که تاریخ تقویم از زمانی شروع می شود که انسان به حال ماندگاری به زراعت پرداخت ؛ در نتیجه متوجه شد که موسم بذرافشانی به فواصل منظم همه ساله بازمی گردد.سپس به شمردن ایام میان 2 موسم متوالی بذرافشانی پرداخت. 


از نخستین پیشرفت هایی که در حساب زمان حاصل شد، اتخاذ دوره گردش قمر بود. منجمان 2 تعریف برای ماه دارند؛ ماه نجومی که فاصله زمانی میان دو عبور متوالی قمر از مقابل یک ستاره ثابت است و ماه هلالی ، که فاصله زمانی میان دو مقارنه قمر و خورشید است.ماهی که در آن روزها از آن استفاده می شد، ماه هلالی بود. پس از آن که استفاده از ماههای قمری بر استفاده فصلها در تقسیم سال طبیعی غلبه پیدا کرد، ماهها را بر حسب فصلی که در آن می افتاد، نامگذاری کردند.مبنا قرار دادن ماههای قمری ، به عنوان حساب زمان ، با مشکل مواجه شد؛ چون پدیده های طبیعی که ماهها به مناسبت آنها نامگذاری شده بودند، باید همواره در همان ماه پیش بیاید که این ممکن نیست. راصدین نخستین ، وسیله ای برای محاسبه طول دقیق سال شمسی و قمری نداشتند، ولی عده ای از آنها، با شمردن تعداد ایام میان 2 انقلاب متوالی یا 2 اعتدال متوالی و حساب متوسط ارقام حاصل در طی چندین سال ، طول سال شمسی را نزدیک به 365 شبانه روز به دست آورده بودند. این گونه که مشهود است، سال شمسی نزدیک به 11 شبانه روز از 12 ماه هلالی ، طولانی تر است. اگر یک رصدکننده بدوی می خواست تناظر ماهها را با فصول طبیعی تا حدی محفوظ نگه دارد، مجبور بود اختلافی را که از جمع شدن تفاوت 11 روز در هر سال حاصل می شد و پس از 3 سال به بیش از یک ماه اضافه می شد، تصحیح کند.راه ساده این مساله ، کبس (kabs) یعنی الحاق یک ماه قمری اضافی بود. در چنین دستگاهی ، بعضی سالها 12ماهه و بعضی 13 ماهه می شدند.بسیاری از اقوام بدوی کبس را از طریق مشاهده انجام می دادند. 

سال شمسی 


برای مصریان قدیم ، به مناسبت نقش حیاتی طغیان های سالانه رود نیل در اقتصاد زراعتی آنها و به ترتیب نسبتا منظم این طغیان ها، سال شمسی اهمیتی بیش از سال قمری داشت.به همین دلیل ، از زمانهای بسیار دور، تقویم شمسی خالص ، جایگزین تقویم قمری بدوی شد. سال شمسی به 3 فصل 4 ماهه تقسیم می شد.هر ماه 30 شبانه روز بود و پس از 12 ماه ، 5 روز اضافی درج می شد و به این ترتیب ، سال درست ، مرکب از 365 شبانه روز بود.در سالی که این تقویم اختیار شد، اولین روز اولین ماه ، مقارن ، رصد تشریق شعرای یمانی آغاز شد و انتخاب آن مسلما به این سبب بود که تقریبا مقارن آغاز طغیان نیل و انقلاب صیفی بود. 


تقویم جلالی یا ملکی


تقویم شمسی که در زمان جلال الدوله ملکشاه سلجوقی تاسیس شد و در قسمت اعظم ایران رواج یافت ، همان تقویمی است که امروزه رایج است.مبدا این تقویم روز جمعه 9 رمضان 471 هجری قمری است. سال جلالی از اول بهار آغاز می شود و 12 ماه 30 روزه و 5روز اضافی به دنبال ماه دوازدهم دارد. روز اول سال جلالی ، یعنی روز ورود خورشید به اعتدال بهاری با روز ورود خورشید به نخستین درجه حمل انطباق یافت با این قرارداد، سال جلالی به عکس سال مسیحی که در هر 10 هزار سال ، قریب 3 روز با سال شمسی اختلاف پیدا می کند، همیشه مطابق با سال شمسی قرار دارد و آن را می توان دقیق ترین تقویم جهان دانست ؛ ولی سالهای کبیسه در تقویم جلالی ، ثابت نیستند و کبیسه کردن موقوف به نتایج رصد هر سال است. 
تقویم های زرتشتی

زرتشتی گری در دوره ساسانی رواج یافت. پس از حمله اعراب ، زرتشتیان در مناطق مختلف پخش شدند که باعث پیدایش تقویم های گوناگون شد.تقویم زرتشتی ، خورشیدی است و با زمان تاجگذاری آخرین پادشاه زرتشتی ، یزدگرد سوم ، شروع می شود.سال تقویم اوستایی (زرتشتی) در هر 4 سال ، یک شبانه روز یا به طور دقیق تر در هر 128 سال ، 31 شبانه روز از سال شمسی حقیقی عقب می افتد و در نتیجه ، مثلا نوروز در طول سال تغییر می کند.در باب تنظیم زمان در ایران باستان ، اطلاعات قطعی در دست نیست. احتمالا در بدو امر، سال قمری ایجاد شده ، ولی ظاهرا میان مردم کشاورز و گله دار، که اساس کارهایشان بر فصول طبیعی است ،باید بزودی ترتیب کبیسه ای داده شده باشد.اولین شکل تقویم که از آن نزد اقوام ایرانی خبر داریم ، تقویم اوستایی قدیم است که قمری - شمسی و آغازش بر پایه انقلاب سیفی بوده است.بعید نیست که در نتیجه مهاجرت اقوام ایرانی و به اقتضای آب و هوا یا به واسطه رابطه ای که با تمدن بابلی و آشوری داشتند، مبدا سال آنها تغییر کرده باشد. نشانه این تقویم پارسی قدیم در کتیبه های داریوش پیدا شده است.تقویم اوستایی در تمام جزییات با تقویم مصری مطابق است و هر روز ماه ، چنان که در مصر معمول بوده ، به یک فرشته موکل منسوب و به اسم او موسوم است و البته تنها مشکل در این تقویم ، همانند بسیاری از تقویم های دیگر، کبیسه گیری بوده است که این مشکل با به وجود آمدن تقویم جلالی تا حدودی حل شد.
منبع :سایت ملاصدرا

----------


## tthenry14plus

من گفتم هر یک میلیون سال یک روز خطا ولی اصلاح می کنم، هر 10 میلیون سال یک روز خطا دارد 




> اساس این رفرانس میخواهد، یک لینک به جایی که بررسی این مسئله را کامل دارد مودرد نیاز است.


گفت و گوی روزنامه همشهری و BBCPersian.com را با دکتر ایرج ملک پور (مانی راد) حتماً بخوانید

نمای نزدیک در ۲ مهر ۱۳۱۹ هجری شمسی زمانی که کودکی درروستای نوا درشهرستان لاریجان به دنیا آمد، کسی تصور نمی کرد که روزگاری او خورشید و ماه و ستارگان را رصد کند و حاصل مطالعاتش تقویمی باشد که در آغاز هر سال و در روزهای اولیه نوروز، دست به دست بچرخد تا ما را از گردش ایام خبردار کند. دکتر ایرج ملک پور در خانواده ای ملاک بدنیا آمد. زمانی که هنوز خانواده شان در ییلاق بودند و به قصد آمدن به شهر بارو بندشان را جمع می کردند، او دیگر مجال نداد تا هوای شهر را برای اولین بار تنفس کند. در همان روستای ییلاقی چشم به جهان گشود. تحصیلات ابتدایی و متوسطه اش را درشهرستان لاریجان گذراند. و پس از آن در سال ۱۳۳۹ وارد دانشگاه تهران شد و در رشته فیزیک به تحصیل پرداخت. در خرداد۱۳۴۳ لیسانس اش را از دانشگاه تهران گرفت و به آلمان رفت. پس از چند ماه از آلمان به فرانسه رفته و در دانشگاه به تحصیل ادامه داد. در ۲۳ بهمن ۱۳۵۲ در رشته دکترای علوم از دانشگاه پاریس فارغ التحصیل شد پس از آن به ایران آمد و از مهر ۱۳۵۵ در دانشگاه تهران و در موسسه ژئوفیزیک مشغول به کار شد. در سال ۱۳۵۷ یونسکو به منظور برقراری امکان تحقیق و مطالعه از ده نفر از دانشمندان جهان دعوت به عمل آورد تا با هزینه این سازمان در رشته های مختلف به اروپا بروند. این بورس که توسط یونسکو به دانشمندان برجسته جهان در رشته های مختلف اختصاص یافته بود به بورس کوپرنیک معروف شد. دکتر ایرج ملک پور در رشته نجوم، از سوی یونسکو انتخاب و به این بورس دعوت شد. او تنها منجمی بود که در دنیا از سوی یونسکو انتخاب شده بود اما ملک پور، به میل و اختیار شخصی ترجیح داد تا در آن شرکت نکند و درتحول جاری کشور که در آن روزها دوران اوجشن را می گذراند، در کنار مردم باشد. او طی تقریبا سی سال فعالیت خود، تقویم بسیاری از کشورهای جهان را استخراج کرده همچنین استخراج تقویم شمسی به شکل امروزی اش از نتایج فعالیت های اوست. او تحت نظر آیت الله مرعشی نجفی اوقات شرعی ماههای قمری را استخراج کرد و اکنون براساس تحقیقات و مطالعات او تقویم شمسی و قمری و اوقات شرعی استخراج می شود. او سال ها مسوول انجمن خورشیدی موسسه ژئوفیزیک بود و بر رصد خانه تهران سال ها مدیریت داشت. او یک فرزند دارد که هم اکنون بامدرک کارشناسی زمین در موسسه ژئوفیزیک به فعالیت مشغول است. ملک پور را همه می شناسیم؛ مردی که تاریخ پنج هزار ساله شمسی را در سینه دارد. فقط کافی است تا شما ابهامی در مورد ماهی از سال های گذشته داشته باشید! محاسباتی چند بر کاغذ توسط او همه چیز را برایتان آشکار می کند. او پیدا کردن سالروز تولد حضرت فاطمه زهرا(س) را یکی از افتخارات خود می داند. بسیاری از سالروزهای تولد و مرگ را او بدست آورده: ابن سینا، خیام، فردوسی، سعدی و بسیاری از بزرگان دیگر. او پدر تقویم نوین ایران است. دست های کودکی و اندیشه تقویم من از کودکی دلبسته بهار بودم و رسیدن عید. مثل همه بچه های ایران سفره هفت سین برایم پر از رنگ بود و شادی. بوی اسکناس نو و گرفتن عیدی از بزرگترها نشانه آمدن سال نو بود. در کنار همه اینها طبیعت خیره ام می کرد. جوانه زدن آرام آرام یک گیاه و شکوفه کردن درخت های میوه با نفس گرم زمین و بهار به ذهنم تلنگر می زد. من عاشق ریاضیات بودم و این تصویرها را با دنیای ریاضی مقایسه می کردم. می خواستم حیرتم را از واکنش زمین به مدد اعداد و ارقام آرام کنم. خیلی از دوستان و همکلاسی های آن روزگارم می خواستند دکتر شوند، مهندس شوند یا خلبان. من به دنبال هیچ کدام از این شغل های طلایی نبودم. اما دوست داشتم آسمان را بشناسم و زمین را. دوست داشتم بدانم دنیای ریاضی در این میانه چه کاری از دستش ساخته است و بعد زمان گذشت. زمان گذشت تا تقویم را شناختم و فهمیدم سامان دادن به همین دفترچه کوچک و به ظاهر دم دست حاصل مطالعات بسیار و دقیق شدن بر حرکت خورشید است. در همین روزها بود که به یاد کودکی ام افتادم و حیرتم از طبیعت و مدد از ابزار ریاضی. به نظرم رسید من از همان کودکی با تقویم و آسمان تنیده شده ام. تقویم ما دقیق ترین تقویم دنیاست.تقویم ما در هر ۱۰ میلیون سال با تقویم طبیعت تنها یک روز اختلاف دارد در تقویم میلادی هر دو هزار و پانصد سال یک روز با تقویم طبیعت اختلاف وجود دارد. در حالی که تقویم شمسی هر ده میلیون سال یک روز. پس حتما می توانید تصور کنید که به چه دلیلی تقویم ما دقیق ترین تقویم دنیاست او پیدا کردن سالروز تولد حضرت فاطمه زهرا(س) را یکی از افتخارات خود می داند. بسیاری از سالروزهای تولد و مرگ را او بدست آورده: ابن سینا، خیام، فردوسی، سعدی و بسیاری از بزرگان دیگر. او پدر تقویم نوین ایران است «ماه شب چهارده، شبیه فانوس دزدی است که برای دزدیدن بهترین ستاره ها، از آسمان بالا رفته است...» این سخنان ناظم حکمت شاید به حرف های منجم پیری که سال ها ستارگان و ماه و خورشید را رصد کرده تا دقیق ترین تقویم دنیا را برایمان به رشته تحریر درآورد، شباهتی نداشته باشد، اما می تواند شروعی باشد برای حرف های مردی ۶۳ ساله که سال ها نامش را به هنگام تحویل سال جدید، زیر ساعت و دقیقه ورود سال می بینیم و نمی بینیم. حرف های مردی که در زندگی مان حضور ندارد اما نتیجه کارش برایمان خاطره ها به همراه آورده. وقتی که پای سفره افطاری نشسته ایم و منتظریم تا آخرین ثانیه ها هم بروند و روزه سر به مهر را بگشاییم. وقتی که زیر نوشته هایمان را امضا می کنیم و در زیر آن چند عدد می نویسیم که حاکی از روز و ماه و سال است. وقتی که... تمام اینها حاصل زحمات کسی است که روزی در حوالی سال های ۵۵ به همراه عده ای از همکاران خود در دانشگاه تهران به هیات اعزامی از عربستان سعودی ثابت کرد که تقویم خورشیدی، بسیار دقیق است و آنها بازگشتند، بی آنکه نتیجه به دست آورند. او دکتر «ایرج ملک پور» است. یقیناً بارها شما هم نام او را روی صفحه اول تقویمتان دیده اید که نوشته شده «مستخرج: دکتر ایرج ملک پور.» او کیست؟! در حرف های این منجم پیر چه چیزهایی است که ما را تا موسسه ژئوفیزیک کشانده و پای حرف هایش نشانده. صمیمانه می نشینم دور یک میز و حرف ها شروع می شود. مردی که تاریخ پنج هزار ساله خورشیدی را در سینه دارد، روبه رویت نشسته، با احتیاط و کمال ادب شروع می کنی. ترس از اینکه مبادا خطایی کنی، اما او صبور است. صبور وپرحرارت سکوت می کند، می شنود، لختی درنگ کرده و پرحرارت شروع می کند به حرف زدن. از خودش می پرسم. اینکه از کجا شروع کرد به استخراج تقویم. «در سال ۱۳۵۳ بعد از اتمام تحصیلات از فرانسه به تهران آمدم و از آن پس مطالعات جدی ام را در زمینه نجوم آغاز کردم. اشتیاق فراوان برای استخراج تقویم و آشنایی با فرآیندی که منجر به تحویل سال می شد، از همان روزهایی که به علم نجوم گرایش پیدا کرده بودم، در من وجود داشت. این اشتیاق اگرچه زیاد بود، سختی کار آنقدر بود که شاید منتظر جرقه ای بودم تا اینکه این آخرین سد هم برداشته شد. در سال ۱۳۵۵، هیاتی از دربار عربستان سعودی به ایران آمد تا ایران را متقاعد کند که از تقویم قمری مستخرج عربستان سعودی استفاده کند، همانگونه که بسیاری از کشورهای عربی حوزه خلیج فارس از آن استفاده می کردند. به منظور کارشناسی دقیق این موضوع، جلسه ای در دانشگاه تهران با حضور منجمان و مستخرجان مطرح کشور تشکیل شد و این هیات در این جلسه استدلال ما را پیرامون تقویم خورشیدی شنید.آنها وقتی که دیدند تقویم هجری شمسی چقدر دقیق است، از پیشنهاد خود منصرف شدند. این هیات متوجه شد که تقویم ما قدمت بسیار زیادی دارد. درست پس از این جلسه بودکه ما تصمیم گرفتیم مطالعات جدی را درباره تقویم شمسی و استخراج آن آغاز کنیم. در هنگام مطالعه فهمیدیم که حدود هزار سال است که کاری بنیادین روی تقویم انجام نشده. از سال ۵۵ ما کمیته ای تشکیل دادیم که طی آن به بررسی تقویم هجری شمسی و هجری قمری پرداختیم تا اینکه پس از سه سال مطالعه روی تقویم خورشیدی در سال ۵۸ موفق شدیم اولین تقویم هجری شمسی را استخراج کنیم. البته همراه با استخراج تقویم هجری شمسی، تقویم هجری قمری را هم استخراج کردیم و همچنین اوقات شرعی تمام سال را. در جریان مطالعات و استخراج تقویم با مشکلات فراوان روبه رو می شدیم. به عنوان نمونه، در جریان همین مطالعات فهمیدم که معیارها برای استخراج تقویم قمری، نزد دانشمندان قرون گذشته، غلط بوده. بنابراین دوباره از ابتدا به مطالعه تقویم قمری پرداختیم و پس از آن به تقویم هجری شمسی روی آوردیم یا یکی دیگر از مسایل مهمی که تا مدت ها روی آن کار می کردیم.تقویم های ایرانی بود. از آنجا که ایرانی ها سابقه چند هزار ساله تمدن دارند، دارای تقویم های گوناگونی نیز هستند. بنابراین برای دقت بیشتر در محاسبات لازم بود تا تمامی آنها بررسی شود. دقیق ترین تقویم دنیا «یامقلب القلوب والابصار...» کمی آنسوتر با خط درشت نوشته اند: «لحظه تحویل سال ۱۳۸۱ هجری شمسی، ساعت ۲۲ و ۴۶ دقیقه و ۲ ثانیه روز چهارشنبه ۲۹ اسفند ۱۳۸۰ هجری شمسی» و یک سال بعد دوباره همان دعا نوشته شده و باز عبارتی در زیر آن «لحظه تحویل سال ۱۳۸۲ هجری شمسی، ساعت ۴ و ۲۹ دقیقه و ۴۵ ثانیه...» از دقتی که در لحظه تحویل سال شده، حتی شما هم حیرت می کنید. می توان تصور کرد که چه محاسبات بسیاری انجام می گیرد تا اینقدر دقیق، همه چیز پیش بینی شود. آیا این دقت، نتیجه اتکا به علم ریاضی است؟! آیا تنها محاسبات می توانند نقطه اتکای ما باشند برای استخراج دقیق روز، ماه و سال. مبنای این محاسبه چیست؟! این سوالات باعث می شود تا دکتر ملک پور حقیقتی را بگوید که غرورمان را بارور کند، غرور حاصل از ایرانی بودن مان. «تقویم ما دقیق ترین تقویم دنیاست. وقتی که این حرف را می زنم، مبنای مقایسه من کاملا علمی است: در واقع، بشر یک تقویم بسیار دقیق دارد که آن تقویم، خود طبیعت است. مبنای مقایسه ما هم وقتی که می گوییم تقویم شمسی دقیق ترین تقویم دنیاست، طبیعت است. به عبارتی دیگر آن تقویمی دقیق تر است که با طبیعت همگام باشد و تقویمی هم که در زندگی مردم استفاده می شود باید بر اساس این تقویم تنظیم شود. برای اینکه من مبنای این تقویم را بیایم، تقویم پنج هزار ساله ایرانیان را مطالعه کردم. چیزی که مرا به شگفتی انداخت و شاید برای شما هم جالب باشد، میزان خطای تقویم شمسی است. در جریان مطالعات به این نتیجه رسیدم که تقویم ما (یعنی تقویم شمسی) هر هزار سال، فقط نه ثانیه با تقویم طبیعت اختلاف دارد، به عبارتی در هر ده میلیون سال ما با تقویم طبیعت، تنها یک روز اختلاف داریم. وقتی این آمار برایمان شگفت انگیز می شود که ما تقویم سایر ملل را مورد مطالعه قرار دهیم. مثلا رایج ترین تقویم دنیا، تقویم میلادی است. اگر بخواهیم تقویم هجری شمسی را با آن مقایسه کنیم، حتما شما هم بر دقیق بودن تقویم شمسی اذعان دارید. در تقویم میلادی هر دو هزار و پانصد سال یک روز با تقویم طبیعت اختلاف وجود دارد. در حالی که تقویم شمسی هر ده میلیون سال یک روز. پس حتما می توانید تصور کنید که به چه دلیلی تقویم ما دقیق ترین تقویم دنیاست، عملا در مقایسه با سایر تقویم ها ما هیچ خطایی نداریم. تازه جالب است که بدانیم، این خطا از زمانی به وجود آمد که تقویم جلالی رایج شد. بر اساس مطالعات انجام شده و طبق منحنی ها و آمارها، از سال ۴۵۸ هجری شمسی تقویم جلالی متداول شد. طبق نتایج به دست آمده، تا قبل از آن اختلاف تقویم ما با طبیعت، صفر بوده. یعنی تا سال ۴۵۸ هجری شمسی تقویم ما با تقویم طبیعت اصلا اختلافی نداشت. تازه از آن زمان به بعد است که ما این خطای بسیار ناچیز را در تقویم شمسی مشاهده کردیم. هر ده میلیون سال یک روز.» خیام، شاعری در آسمان ها وقتی که از یک متخصص سوال می کنید و از زاویه سختگیر و تنگ تخصص، نام بلند ایران را می شنوید، جریانی سیال زیر پوست و توی شقیقه می کوبد. راستش ما بغض می کنیم، این جور وقت ها، بغضی که پر است از شور و سرشار است از غرور و افتخار. وقتی مردی سپیدمو، با عینکی بر چشم و خبره در کار، می گوید، حکیم عمربن ابراهیم خیام در دنیا نمونه ندارد، ما فقط می توانیم مور مور پوستمان را و اشک چشممان را با لبخند بپوشانیم و به بهانه نوشتن سرمان را روی کاغذ خم کنیم. وقتی می شنویم، تقویممان توی همه دنیا تک است و بی نظیر، دوست داریم فریاد بزنیم، ما ایرانی هستیم. هیچ کس مثل ما نیست. دکتر ملک پور است و حرف هایی که... اصل و اساس تقویم جلالی، تقویم اوستایی است. این تقویم در ۱۱۰۰ قبل از هجری شمسی و در دوره کمبوجیه متداول بود. یعنی تقریبا ۲ هزار و ۵۰۰ سال پیش. اسامی ماه ها هم با همین عناوین رایج بوده. تا سال ها این تقویم مورد استفاده ایرانیان بود، بعدها در دوره سلجوقیان که تقویم جلالی به همت خیام و برخی دیگر رایج شد، اقدامی جدی در تقویم اوستایی صورت گرفت. خیام، روز اول فروردین را مبنای اولین روز سال قرارداد و چگونگی تعیین آن را مشخص کرد. معلوم نیست که او و سایر همکارانش چرا، این روز را به عنوان اولین روز سال انتخاب کردند و دلیل آن چیست؟ حتی محاسبات و معادلاتی که طی آن این روز انتخاب شد بر ما آشکار نیست. ما امروزه نمی دانیم که خیام اولین روز بهار را با چه معیارهای دقیقی محاسبه کرده است؟ اما هرچه هست، نشان از قدرت علمی او دارد. برای اینکه صحت این مطلب به اثبات برسد، ما تقویم هجری شمسی را در طول تاریخ ایران گسترش دادیم. یعنی کل تاریخ ایران را بر اساس تقویم هجری شمسی به ثبت رساندیم و متوجه شدیم که با این انتخاب خیام اصلا مغایرت ندارد، اما همین کار را هم با تقویم قمری انجام دادیم، اما نتیجه معکوس بود. تقویمی که ما استخراج کردیم را با پیش بینی منجمان تقویم هجری قمری مطابقت دادیم ومتوجه شدیم که پیش بینی آنها درست نبوده، ولی چه دقتی در محاسبات خیام وجود داشته که باعث شده اینگونه همه چیز دقیق باشد وخطای تقریبا هیچ تقویم ما، امکان هرگونه پدیده طبیعی آسمانی را میسر سازد، خیام به ما نگفت که چگونه به این مهم دست یافته. او دانشمند عجیبی بوده ما حتی تاریخ دقیق تولد او را نمی دانستیم، تا اینکه براساس اطلاعات و یادداشت مورخان حدود ۳۰سال از قرن پنجم هجری مورد بحث قرار گرفت و گمان رفت که تولد خیام در یکی از روزهای این ۳۰سال بوده. من تمام یادداشت های خیام را مورد مطالعه قرار دادم و متوجه شدم که او شبی را که در آن متولد شده، به لحاظ نجومی تعریف کرده است. او در یکی از سه شبنه های ما بین این ۳۰سال به دنیا آمده بود. همین امر باعث شد تا من حدود شش ماه به بررسی تمام شب های سه شنبه این ۳۰سال بپردازم تا بالاخره موفق شوم که تاریخ دقیق تولد او را بیابم. او نه تنها راز انتخاب اول فروردین به عنوان اولین روز سال را برایمان نگشود، بلکه حتی روز تولد خود را در هاله ای از رمز و راز به ما گفته. در واقع انتخاب نوروز به عنوان اول سال، برای او چنان واضح و بدیهی بوده که دیگر نیازی احساس نکرده که چگونگی انتخاب آن را برای نسل های بعد از خود توضیح دهد. اساسی ترین نیاز ما را تقویم رقم می زند پای سفره افطار و آوای «ربنا» در گوش، و صدای اذان که بلند می شود، دقیقا لحظه ای مشخص که چند ماه قبل یا حتی چندین ماه قبل تر پیش بینی شده، اذان گفته می شود. چطور ممکن است که کسی پیش بینی کند که در فلان روز از فلان ماه که خواهد آمد، خورشید در لحظه ای معین غروب می کند؟ این اعجابی است که به وسیله علم پدید آمده است. دکتر ایرج ملک پور به یاد سال های۵۹ - ۵۸می افتد. «در سال هایی که تقویم خورشیدی را بدست آورده و دراختیار مردم گذاشتیم، بسیاری از مردم مراجعه کردند و خواهان تعیین اوقات شرعی شدند. براساس این نیاز مردم، از سوی آیت الله مرعشی نجفی به ما ماموریت داده شد تا زیرنظر ایشان به استخراج اوقاع شرعی بپردازیم. از آنجا که ایشان به امور شرعی آشنایی داشتند، کمک فراوانی به ما کردند تا ما هر چه دقیقتر کار علمی مان را پیگیری کنیم. ما حدود شش ماه با آیت الله مرعشی نجفی کار کردیم و بلاخره توانستیم اوقات شرعی سال قمری را بدست آوریم. پس از استخراج اوقات شرعی، متوجه شدیم که نتیجه ای که ما بدست آوردیم، با نتایج مستخرجان قبلی فرقی ندارد. الان هم اوقات شرعی را بر همان اصول استخراج می کنیم و این افتخار را هم داریم که اوقات شرعی کل دنیا را ما می دهیم. «دکتر ملک پور در اتاقی واقع در موسسه ژئوفیزیک، به وسیله محاسباتی روی کاغذ، بسیاری از مشکلات روزمره ما را که اصلاً به چشم نمی آید حل کرده. فقط کافی است که تصور کنیم، اگر این اوقات نبودند، اگر تاریخ تقویمی ما دقیق نبود، چه مشکلاتی که به وجود نمی آمد. حتی همین الان هم او پاسخگوی بسیاری از افراد جامعه است. از مسوولان کشوری که می خواهند برای سال ها بعد برنامه ریزی کنند تا مردم عادی که نمی توانند دلیل عوض شدن تاریخ تولد یا مشکلات تقویمی خود را حل کنند. او همچنان همه این کارها را انجام می دهد. بی آنکه توقعی داشته باشد. کسی که به واسطه آشنایی با او، بسیار بیشتر از قبل به ایرانی بودن خود افتخار می کنیم.» شور و اشتیاق بهار وقتی که بهار می آید و قدم های سنگین اش را بر درختان و سبزها می گذارد، بی آنکه چشم به تقویم بدوزیم می فهمیم که طبیعت دارد پوست می اندازد. قرار است که با این پوست انداختن ما نیز تغییرکنیم. سال که تازه می شود، ما نه منتظر تقویم می مانیم و نه منتظر آمدن یک روز، تنها طبیعت است که معیار ماست. ما وقتی دگرگونی طبیعت را می بینیم، خود را آماده می کنیم. تازه بعد از آنست که می رویم سراغ تقویم و بازهم تقویم را که برمی داریم، نام آشنایی به چشم می آید. سوالی که در ذهنمان مدام می رود و می آید، ناخودآگاه به زبان آورده می شود. قصد نداریم که پیش دکتر ملک پور، حرفی زده شود که نپخته و نسنجیده باشد. اما کنجکاوی را نمی شود کنترل کرد. وقتی شما هم از حرف های دکتر ملک پور احساس غرور کنید، حتماً گاهی اوقات نمی توانید خودتان را کنترل کنید. او هم این را می داند. وقتی از او می پرسم آیا هیچ ملتی اول بهار را اولین روز سال خود قرارداده، نگاهی می کند و دوباره حرف های شنیدنی، دوباره حرف هایی که به دل مان خوب می نشیند. دکتر ملک پور شمرده، شمرده شروع می کند به صحبت: «تقریباً چهل کشور در دنیا از تقویم میلادی استفاده می کنند. البته از تقویم قمری هم در کشورهای اسلامی استفاده می شود، آن هم به خاطر استفاده از زمان های مذهبی و تعیین مراسم و مواقع ویژه آن. استفاده ازتقویم قمری به عنوان تقویم رسمی کشورها، رایج نیست. اما تنها کشور و ملتی که اولین روز فصل بهار را مبنای شروع سال خود قرارداده، ما هستیم. ما تنها ملتی هستیم که با آغاز تقویم طبیعت، تقویم ما هم آغاز می شود. این مساله چنان اهمیتی دارد که سازمان ملل هم اولین روز بهار که عید ما ایرانیان است را به رسمیت شناخته و آن روز را به عنوان روز زمین نامگذاری کرده است. تمام دنیا به اهمیت تقویم ما اذعان دارند. با آغاز بهار، سال ما هم شروع می شود. به لحاظ روانی این مساله بسیار حائزاهمیت است. مثلاً تحویل سال میلادی در زمستان است، حدود ۱۱-۱۲ دی ماه شمسی، فصل زمستان فصلی نیست که در آن شادابی و نشاط بین مردم به طور طبیعی وجود داشته باشد. اما با ورود بهار تمام انسان ها شادمان و خوشحالند. احساس طراوت و شادابی در مردم به طور طبیعی دیده می شود. وقتی که ناگهان طبیعت چهره عوض می کند و به سمت سرسبزی و خرمی می رود، مردم نیز با او تغییر کرده و همگام می شوند. این دگرگونی به لحاظ روانی چنان تاثیری می گذارد که نمی شود انکارش کرد. تقویم ما هم از دگرگونی طبیعت آغاز می شود و این احساس شادمانی که در طبیعت وجود دارد، در مردم نیز دیده می شود. شاید همین عامل باعث می شود تا در روزهای تحویل سال، هیچ ملتی مثل ما شاداب نباشد. درواقع این انتخاب از سوی منجمین ما، یک انتخاب دقیق بوده. اما همانگونه که قبلاً گفتم آنها هیچ سند و مدرکی از خود برجا نگذاشته اند تا ما بدانیم چرا اول فروردین را به عنوان اولین روز سال انتخاب کرده اند. انتخاب این آغاز برای تقویم ما، که هر ده میلیون سال، یک روز خطا دارد، واقعاً یک اعجاب است. ماجرا از کجا شروع شد حتما شما هم در آسمان روزگاری چشم هایتان را چرخانده اید و به دنبال ستاره بخت خود بوده اید. یا از سر بی حوصلگی یا از روی کنجکاوی یا حتی با لبخندی تمسخرآمیز، سری به آسمان برده و در پی ستاره اقبالتان که حتما درخشان تر از بقیه است، گشته اید. با حرف هایی که دکتر ملک پور برایمان زده، احتمالا باور کرده ایم که ستاره اقبال مان درخشان تر از آن است که فکر کنیم در هفت آسمان آیا ستاره ای داریم یا نه. همه چیز را از او شروع می کنیم. از روزهایی که بشر پا به روی کره خاکی گذاشت. از انسان های اولیه و چگونگی رفع نیازشان از شمارش روزها، ماه ها و سال ها. «در آغاز، هنگامی که بشر شروع کرد به زندگی متمرکز و در جایی اسکان گزید، نیاز به تقویم از اصلی ترین نیاز آنها بود تا بتواند در کشاورزی و سایر امور بر اساس آن برنامه ریزی کند. در ابتدا تقویم تمامی ملل قمری بوده. یک مبنای محسوس برای شمارش که روز و شب است، در ابتدا تعیین شد و تا مدت ها بشر از این واحد زمانی استفاده می کرد، اما پس از چندی بشر متوجه شد که این معیار پاسخگوی نیازهای او نیست. بشر تصمیم گرفت از واحدی بزرگ تر استفاده کند. بنابراین براساس حرکات ماه، معیار بزرگ تری را برای خود برگزید که شامل ۳۰ روز بود. به تدریج مشخص شد که پس از گذشت ۱۲ ماه، دوباره طبیعت همه چیز را از سر می گیرد و فصل ها از نو آغاز می شوند. پس از آن و بر اساس حرکات ماه تقویم قمری شکل گرفت. تا مدت ها استفاده از تقویم قمری در میان ملل مختلف رایج بود، اما اولین ملتی که تقویم قمری را کنار گذاشت، مصری ها بودند. آنها تقریبا ۶۲۰۰ سال قبل وقتی که فهمیدند تقویم قمری در هر سال ۱۱ روز با طبیعت اختلاف دارد آن را کنار گذاشته وبر اساس حرکات خورشید، تقویم جدیدی به وجود آوردند. اما تقویم شمسی در ایران برای اولین بار در زمان جمشید پی ریزی شد. این تقویم به نام تقویم یزدگردی باستانی معروف است و مراسم خاصی هم در هر رو زآن انجام می گرفت. این تقویم آنقدر دقیق بود که اختلافش با طبیعت در هر سال ۳۵ ثانیه بوده، به عبارتی، تقویم یزدگردی باستانی، چنان دقیق استخراج شده بود که این اختلاف برای آن دوره بسیار ناچیز به نظر می رسد. این تقویم، دوازده ماه سی روز داشت و تمام ماه ها هم با هم برابر بودند. پنج روز هم اضافه می آمد که در این پنج روز جشن های نوروزی برگزار می شد. به این ترتیب اختلاف این تقویم، با تقویم طبیعت در هر سال، فقط ۳۵ ثانیه بود. می توان تصور کرد که آنها چقدر دقیق همه چیز را محاسبه کرده بودند.» دوباره برگردیم به اول متن از آمدنم نبود گردون را سود وز رفتن من جاه و جلالش نفزود از هیچ کسی همین دوگوشم نشنود کین آمدن و رفتنم از بهر چه بود این شعر را بعد از مصاحبه وقتی از پیش دکتر ملک پور باز می گشتیم زیر لب و به زمزمه می خواندیم. در ترافیک سنگین این روزهای آخر سال، نه به فکر سوختن زمان بودیم و نه بوق های بی مورد همشهری ها روی اعصابمان می توانست راه برود. سر خوش بودیم از اینکه حکیم خیام را به لطف سخنان دکتر ملک پور بیشتر و بهتر شناخته ایم. خیام شاعر، حالا برای ما قله ای از نبوغ و دانش و ذوق و مهربانی بود و بیش از آنکه در تصور بگنجد متواضع. دست کم مصرع اول این شعر می توانست سکوی پرتاب ما باشد به جانب سرزمین تواضع خیام. حالا ایران برای ما دوباره و در گوشه ای دیگر از پیشینه اش درخشیده بود و دانسته بودیم که تقویم ما کم خطاترین تقویم دنیاست. فهمیده بودیم تنها کشور دنیا هستیم که سال نو را با آغاز زندگی طبیعت پیوند زده است. مجاب شده بودیم که همه اینها بر پایه حساب و کتاب و دانش شکل گرفته است. حالا ما دوست داشتیم شما را هم در گفت وگویمان با ایرج ملک پور سهیم کنیم. دوست داشتیم تصویر حکیم خیام را وقتی با قلم و کاغذ محاسبات ریاضی را در گوشه اتاقی به سرانجام می رساند بکشانیم و بیاوریم به اتاق دکتر ایرج ملک پور و باقی داستان را از زبان خود او بیاوریم. شاید الان بهتر بشود دلیل آوردن سخن آغاز این گزارش را توضیح داد. وقتی که فهمیدیم خیام چه زحماتی کشیده، بهتر است این سخن ناظم حکمت را برای او بدانیم. «ماه شب چهارده، شبیه فانوس دزدی است...

گفتگوی دکتر ملک پور با سایت BBC :

www.bbc.co.uk/persian/arts/story/2006/04/060421_pm-cy-calendar-malekpour.shtml

فایل ضمیمه صفحه ذخیره شده بی بی سیه از گفتگو با دکتر ملک پور
BBC فیلتره، به این خاطر فایل را ضمیمه کردم.

----------


## sarnev6t

دوستان خارج بحث شما عزیزان/// اینم من نوشتم البته وقت نکردم مشکل سال کبیسشو حل کنم اگه دوست داشتید نظر بدید(کدهاش خیلی ساده هستن در حد سوادم نوشتم)

----------


## linux

> با سلام:
> من یک تابع می خوام که اختلاف *روز و ماه و سال* بین دو تاریخ ورودی *فارسی* رو برگرداند . از کلاس* DateTime* هم استفاده کردم اما اختلاف بیشتر روزها رو اشتباه بر می گرداند و این کلاس نتونست مشکلمو بر طرف کنه.
> در واقع تابعی که دو ورودی از جنش string می گیرد (دو تاریخ فارسی) و سه خروجی (اختلاف روز و اختلاف ماه و اختلاف سال ) رو به صورت int بر می گرداند.
> مثال:
> 12/1/1386
> 12/2/1386
> اختلاف روز:31
> اختلاف ماه:1
> اختلاف سال"0
> ...


به اندازه ی کافی در مورد تو این سایت مطلب هست می گشتی پیدا می کردی.
کلاس datetime برای تاریخ میلادی هست نمی توانی از تاریخ شمسی استفاده کنی در ضمن توابع ممکن هست چندتا ورودی بگیرند ولی همیشه یک خروجی بر می گردانند.
publicstructPDate//perisanDate
{
publicint year;
publicint month;
publicint day;
}
publicPDate diffDate(string pdate1, string pdate2)
{
PersianCalendar pc = newPersianCalendar();
DateTime d1, d2;
TimeSpan ts = newTimeSpan();
 
PDate pd1;
PDate pd2;
PDate pdout;
pd1.year = int.Parse(pdate1.Substring(0, 4));//1386/12/22
pd1.month = int.Parse(pdate1.Substring(5, 2));
pd1.day = int.Parse(pdate1.Substring(8, 2));
pd2.year = int.Parse(pdate2.Substring(0, 4));
pd2.month = int.Parse(pdate2.Substring(5, 2));
pd2.day = int.Parse(pdate2.Substring(8, 2));
d1 = pc.ToDateTime(pd1.year, pd1.month, pd1.day, 0, 0, 0, 0, 0);
d2 = pc.ToDateTime(pd2.year, pd2.month, pd2.day, 0, 0, 0, 0, 0);
 
ts = d1 - d2;
pdout.year = d1.Year - d2.Year;
pdout.month = pdout.year * 12 + (d1.Month - d2.Month);
pdout.day = ts.Days;
return pdout;
 
}

----------


## mohammad272005

> چیزی در مورد کامپوننت های سی شارپ برای تاریخ های شمسی شنیدم, که نیازی به کد نویسی نیست.


بر پایه System.Globalization.PersianCalendar من یه کلاس نوشتم که تو codeproject هست. یه نگاهی بهش بکنید بد نیست.
*Persian DateTime*

----------


## sinpin

در راستای اجرای طرح بهینه سازی تالار :
+ 16 تاپیک مختلف در زمینه ی تاریخ شمسی در یکدیگر ادغام
+ و تمامی پستهای بیهوده و لاشه های آنها (آثار باقیمانده پس از حذف پستها) حذف گردید...
+ و نام تاپیک نهایی به "*مرجع کامل حل مشکلات تاریخ شمسی*" تغییر یافت.

----------


## top7news

> با سلام 
> مدتی هست که می بینم بحثهای زیادی در مورد تغییر تاریخ میلادی سه شمسی مطرح شده و راه حل های گوناگون.
> همه این راه ها یه مشکل دارند و اون اینکه اگه در پروژه قسمتهای مختلفی داشته باشید که از تاریخ استفاده می کنند شما برای تبدیل همه اونا باید کد بنویسید. و دیده شده که بعضی ها کنترلهایی هم واسه تاریخ نوشته و می فروشند. در صورتیکه با یه تغییر کوچک در Pcal.cs که آقای *امید خندان* زحمت اونو کشیدند و اضافه کردن چند خط کد ساده تمام تاریخ هاتون شمسی نمایش داده میشه و شما به شکل میلادی ذخیره خواهید کرد. از خوبی های این روش اینه که دیگه نیازی نیست تاریخ رو به شکل رشته ای ذخیره کنید . بلکه چون میلادی ذخیره میشه شما خیلی راحت می تونید با اونا کار کنید.
> من کد Pcal.cs رو ضمیمه می کنم که شما باید به پروژه مورد نظرتون اضافه کنید و همچنین چند خط کد زیر رو به InitializeComponent مربوط به Global.asax قرار دهید تا کل تاریخ های سیستم شما شمسی شوند و 
> حتی کنترل Calender خود ‍C#‎.
> دیگه فکر کنم کسی در مورد تاریخ تاپیکی اینجا نذاره.(انشاالله):)
> کد یه برنامه نمونه هم ضمیه شده است.
> 
> private void InitializeComponent()
> ...


سلام میشه در مورد این InitializeComponent مربوط به Global.asax بیشتر توضیح بدین
که کجا هستن
من هر چی این ور اون ور کردم پیدا نکردم چیزی

----------


## ciscozagros

در 2008 دچار مشکل شدم اجرا نمی شهفقط برای 2005 کار می کنه

----------


## jmfnima

با سلام به همه دوستان
من براي اينكه تاريخ روز رو به صورت شمسي روي فرمم نشون بدم از كامپوننتي كه  ضميمه كردم استفاده ميكنم كه وقتي اون رو به Toolbox‌اضافه ميكني بايد اون رو درگ كني و بر روي فرم قرار بديم كه تاريخ رو در يك تكس باكس به ما نشون ميده . حالا اگه خواسته باشم به روز تاريخي كه در توسط اين كامپوننت نشون ميده  يك عدد اضافه كنيم به طوري كه بعد از اضافه كردن اين عدد تاريخ مربوطه در يك تكس باكس ديگه نشون داده بشه . 
مثال : فرض كنيم در اين تكس باكس كه تاريخ روز رو نشون ميده تاريخ 90/08/029 باشه و حال خواسته باشيم عدد 3 رو به روز اين تاريخ اضافه كنيم و تاريخ 90/09/02 رو در يك تكس باكس ديگه نشون بده . 
بايد چيكار كنم ؟؟؟

----------

