PDA

View Full Version : کسی الگوریتم تبدیل تقویم میلادی به شمسی را دارد ؟



فارسی ساز
سه شنبه 18 شهریور 1382, 14:42 عصر
با عرض سلام خدمت همه برنامه نویس ها
آیا کسی الگوریتم تبدیل تاریخ (میلادی به شمسی) یا (قمری به شمسی) را دارد ؟
اگر هم سورس برنامه ای دارید خواهش می کنم همراه با توضیح باشد .

با تشکر

Kambiz
سه شنبه 18 شهریور 1382, 22:49 عصر
اگر متن پاسکال به دردت می‌خوره این متن زیر رایگان هست.
http://delphiarea.com/products/misc/solar.zip

shaniaki
جمعه 09 آبان 1382, 14:54 عصر
با عرض ادب:
در قسمت جاوا همین سایت هم نسخه جاوای این تبدیل موجود است.

یه عشق برنامه نویسی خفن

ناصرقلی
شنبه 10 آبان 1382, 09:28 صبح
سلام رفقا
قابل توجه تمام کسانی که می خواهند مبدل تاریخ درست و حسابی بنویسند (یعنی تبدیل تاریخ کامل نه برای 10 و 15 سال)
1.طبق قانون هیچ روش معینی برای محاسبه کبیسه ها در تقویم جلالی وجود ندارد!
2.طبق نظر علمای گاهشماری ایران حد اقل سه روش برای گاهشماری جلالی وجود دارد
روش آقای ایرج ملکپور
روش استاد دکتر بیرجندی
روش استفاده از طول متوسط سال
خوب متاسفانه روش آقای ملکپور مبتنی بر رصد است !
روش دکتر بیرجندی بسیار نزدیک به روش سوم است ولی با کمی اختلاف در کبیسه های پنج ساله
روش استفاده از طول سال متوسط هم که قابل استفاده در برنامه سازی است توسط نویسنده کتاب "گاهشماری ایرانی"(اکرمی، موسی) پیشنهاد شده که نمونه پیاده سازی آن در بخش جاوا وجود دارد.
نکته مهم اینست که این سه روش نتایج متفاوتی را ایجاد می کنند در نتیجه هیچ برنامه نویسی نمی تواند ادعا کند که مبدل درستی نوشته چون اصولا بر طبق ملاک قانونی هیچ روش قابل محاسبه ای تعیین نشده است.

NiLoOfAr
جمعه 21 آذر 1382, 22:09 عصر
با پوزش فراوان بابت تاخیر در ارسال :oops:


Public Function FDate( ) As Long
On Error Resume Next
Dim YearEqual(2,2) As Integer
Dim AddOneDay As Boolean
Dim AddFarDay As Boolean
Dim AddToDays As Byte,FarDay As Byte
Dim ThisDay As Byte
Dim ThisMonth As Byte
Dim ThisYear As Integer
Dim YearDif1 As Integer , YearDif2 As Integer
Dim TestRange1 As Integer , TestRange2 As Integer
Dim p As Integer
Dim CurM As String , CurD As String
Dim sYear As As Variant , sMonth As Variant , sDay As Variant
Rem --------
YearEqual(1,1) = 1997
YearEqual(1,2) = 1998
YearEqual(2,1) = 1376
YearEqual(2,2) = 1377
ThisDay = Day(Date)
ThisMonth = Month(Date)
ThisYear = Year(Date)
YearDif1 = ThisYear - 1997
YearDif2 = ThisYear - 1998
TestRange1 = 1996 - (100 * 4)
TestRange2 = 1996 + (100 * 4)
FarsiRange1 = 1375 - (100 * 4)
FarsiRange2 = 1375 + (100 * 4)
AddOneDay = False
Rem -----------
For p = TestRange1 To TestRange2 Step 4
If ThisYear = p Then
AddOneDay = True
Exit For
End If
Next
If AddOneDay Then AddToDays = 1 Else
AddToDays = 0
Rem ------------
If ((ThisMonth = 3 And ThisDay < 20 + AddToDays) Or (ThisMonth < 3)) Then
YearDif1 = YearDif1 - 1
End If
Rem ------------
If (ThisYear Mod 2 <> 0 And ((ThisMonth = 3 And ThisDay > (20 - AddToDays)) Or (ThisMonth > 4))) Then
CurrentYear = YearEqual(2,1) + YearDif1
Else
CurrentYear = YearEqual(2,1) + YearDif2
For p = FarsiRange1 To FarsiRange2 Step 4
If CurrentYear = p Then AddFarDay = True :
Exit For
Next p
If AddFarDay Then FarDay = 1 Else FarDay = 0
If (( ThisMonth = 3 And ThisDay > 20 - (AddToDays) + FarDay) Or ThisMonth > 3)
Then CurrentYear = CurrentYear + 1
End If
End If
If AddToDays = 1 Then FarDay = 0
Rem ------------
Select Case ThisMonth
Case 1
If ThisDay < (21 - FarDay) Then
CurrentMonth = 10
CurrentDay = (ThisDay + 10) + FarDay
Else
CurrentMonth = 11
CurrentDay = (ThisDay - 20) + FarDay
End If
Case 2
If ThisDay < (20 - FarDay) Then
CurrentMonth = 11
CurrentDay = (ThisDay + 11) FarDay
Else
CurrentMonth = 12
CurrentDay = (ThisDay - 19) + FarDay
End If
Case 3
If ThisDay < (21 - AddToDays) Then
CurrentMonth = 12
CurrentDay = (ThisDay + 9) + AddToDays + FarDay
Else
CurrentMobth = 1
CurrentDay = (ThisDay - 20) + AddToDays
End If
Case 4
If ThisDay < (21 - AddToDays) Then
CurrentMonth = 1
CurrentDay = (thisDay + 11) + AddToDays
Else
CurrentMonth = 2
CurrentDay = (ThisDay - 20) + AddToDays
End If
Case 5
If ThisDay < (22 - AddtoDays) then
CurrentMonth = 2
CurrentDay = (ThisDay + 10) + AddToDays
Else
CurrentMonth = 3
CurrentDay = (ThisDay - 21) + AddToDays
End If
Case 6
If ThisDay < (22 - AddToDays) Then
CurrentMonth = 3
CurrentDay = (ThisDay + 10) + AddToDays
Else
CurrentMonth = 4
CurrentDay = (ThisDay - 21) + AddToDays
End If
Case 7
If ThisDay < (23 - AddToDays) Then
CurrentMonth = 4
CurrentDay = (ThisDay + 9) + AddToDays
Else
CurrentMonth = 5
CurrentDay = (ThisDay - 22) + AddToDays
End If
Case 8
If ThisDay < (23 - AddToDays) Then
CurrentMonth = 5
CurrentDay = (ThisDay + 9) + AddToDays
Else
CurrentMonth = 6
CurrentDay = (Thisday - 22) + AddToDays
End If
Case 9
If ThisDay < (23 - AddToDays) Then
CurrentMonth = 6
CurrentDay = (ThisDay - 22) + AddTodays
Else
CurrentMonth=7
CurrentDay=(ThisDay-22)+AddToDays
End If
Case 10
If ThisDay < (23 - AddToDays) Then
CurrentMonth = 7
Currentday = (ThisDay +8 ) + AddToDays
Else
CurrentMonth = 8
CurrentDay = (ThisDay - 22) + AddToDays
End If
Case 11
If ThisDay < (22 - AddToDays) Then
CurrentMonth = 8
CurrentDay = (ThisDay + 9) + AddtoDays
Else
CurrentMonth = 9
CurrentDay = (ThisDay - 21) + AddToDays
End If
Case 12
If ThisDay < (22 - AddToDays) Then
CurrentMonth = 9
CurrentDay = (ThisDay + 9) + AddToDays
Else
CurrentMonth = 10
CurrentDay = (ThisDay - 21) + AddToDays
End If
End Select
Rem ------------
CurM = Trim(Str(CurrentMonth))
CurD = Trim(Str(CurrentDay))
Rem ------------
If CurrentMonth < 10 Then CurM = "0" & Trim(Str(CurrentMonth))
If CurrentDay < 10 Then CurD = "0" & Trim(Str(CurrentDay))
FDate = Val(Trim(Str((CurrentYear)) & CurM & CurD)
End Function

SSP_Software_team
چهارشنبه 26 آذر 1382, 01:34 صبح
اینم نسخه ی #C
http://www.barnamenevis.org/forum/viewtopic.php?t=2211

N_D
دوشنبه 15 دی 1382, 17:58 عصر
ببینید کار میکنه یا نه اخه سریع نوشتم لطفا کامل تست کنید- کد کامل دلفی


unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
monthDays: array[1..12] of integer=
(30,30,29,31,31,31,31,31,31,30,30,30);
monthNames: array[1..13] of string=
('dey','bahman','esfand','farvardin','ordibehest', 'khordad','tir','mordad','shahrivar','mehr','aban' ,'azar','dey');

procedure printdate(yr,dy: integer);

implementation

uses DateUtils;

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var
td: TDate;
yr,dy: word;
begin

td:= StrToDate(Edit1.Text);
DecodeDateDay(td,yr,dy);
printdate(yr,dy);

end;

procedure printdate(yr,dy: integer);
var
s,days,i, Base: integer;
sal,mah,roz: string;
begin
Base:=10;
monthDays[3]:=29;
s:=yr-622;
if yr mod 4 = 1 then inc(Base);
if s mod 4 = 3 then monthDays[3]:=30;
days:= dy+Base;

for i:=1 to 12 do
begin
if days<= monthDays[i] then break;
days:=days-monthdays[i];
end;

mah:=monthNames[i];
roz:=variant(days);
if i>3 then inc(s);
sal:=variant(s);
Form1.ListBox1.Items.Add(sal+' '+mah+' '+roz);
end;

end.

problem
چهارشنبه 15 آذر 1385, 23:50 عصر
سورسی که در این کنترل دات نت (http://www.gotdotnet.com/Community/UserSamples/Details.aspx?SampleGuid=844e1a97-0e12-48d7-b2f9-d5884a9b1523) وجود داره هم دقیقه. الگوریتم کلی، مربوط به محاسبهٔ دوره‌های سی و چندساله و صد و چندساله‌ای هست که کبیسهٔ ما به‌جای ۴ سال یکبار، می‌شه ۵ سال یکبار. کتابی هم در این زمینه دارم، اگر مایلید معرفی کنم.

problem
پنج شنبه 16 آذر 1385, 09:36 صبح
عنوان = گاهنامهٔ تطبیقی سه هزار ساله
مولف = احمد بیرشک (که احتمالاً معرف حضور هستند این استاد!)
ناشر = بنیاد دانشنامهٔ بزرگ فارسی
چاپ دوم سال ۱۳۷۳

از جمله صحبت‌های جالبی که در این کتاب می‌خوانید:
- مفاهیمی مثل کبیسه ۱۲۸ ساله و ...
- فرمول و جداول لازم برای تبدیل تاریخ ۱۲۶۰ تا ۲۰۰۰ ایرانی و ۱- تا ۲۰۶۲ قمری و ۶۳۹- تا ۲۶۲۱ میلادی به هم‌دیگر!
- اندکی درباره آن ۱۰ روزی که از تقویم میلادی حذف شد و هیچ معادلی در تاریخ شمسی و قمری ندارد!!
- این که چرا تقویم ایرانی (جلالی) دقیق‌ترین تقویم است، و با این وجود، هر ۱۴۱۰۰۰ سال یک روز با واقعیت اختلاف پیدا می‌کند!

tthenry14plus
شنبه 06 بهمن 1386, 02:00 صبح
الگوریتمش زیاد پیچیده نیست
الگوریتمو بدونی راحت می تونی بنویسیش
هم کد و هم قطعه برنامه رو می ذارم اگر هم سوالی داشتی به ایمیلم بزن
mostafa.bita@gmail.com


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
شنبه 06 بهمن 1386, 02:09 صبح
اینم از الگوریتم تبدیل تاریخ میلادی به تاریخ شمسی :
تبدیل تاریخ میلادی به شمسی بسیار راحتتر از تبدیل تاریخ شمسی به میلادی است.

برای نوشتن این الگوریتم به اختلاف روزهای میان اولین روز سال میلادی و اولین روز سال شمسی نیاز داریم که این اختلاف روز(در صورتی که سال کبیسه باشد یا نباشد) "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" بدست می آید.(زیرا در سال قبل قرار داریم.)

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



هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه.
البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.

ahmadkiani
یک شنبه 18 فروردین 1387, 10:56 صبح
سلام
اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .

whitehat
یک شنبه 18 فروردین 1387, 11:07 صبح
اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .
ما سعی می کنیم در این بخش مستقل از زبان عمل کنیم، بهتره اگه کد یا شبه کدی دارید در اینجا قرار دهید. در ضمن این امکان در دات نت نسخه 2 پشتیبانی میشه و نسخه های قدیمی این امکان را ندارند
موفق باشید

ahmadkiani
یک شنبه 18 فروردین 1387, 11:33 صبح
کد تبدیل با C :



#include <stdio.h>
#include <conio.h>
#include <dos.h>
main()
{
//start/variables
int m_day_mon[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
int s_day_mon[12] = {31,31,31,31,31,31,30,30,30,30,30,30};

int m_year , s_year;
int m_month , s_month;
int m_day , s_day;
int m_day_sum , s_day_sum;
//end/variables
struct date d;
getdate(&d);
m_year = d.da_year;
m_month = d.da_mon;
m_day = d.da_day;
// number of past day from m_year
if(m_year % 4 == 0)
m_day_mon[1] = 29;
else m_day_mon[1] = 28;
for(int i = 1 ; i <m_month ; i++)
m_day_sum += m_day_mon[i - 1];
m_day_sum += m_day;
// convert m_date to s_date
if(m_day_sum > 79)
{
s_day_sum = m_day_sum - 79;
s_year = m_year - 621; //s_year
if((s_year + 1) % 4 == 0)
s_day_mon[11] = 30;
else s_day_mon[11] = 29;
if (s_day_sum > 186)
{
s_month = ((s_day_sum - 187) / 30) + 7;
s_day = (s_day_sum - 186) % 30;
if(s_day == 0) s_day = 30;
}
else
{
s_month = ((s_day_sum - 1) /31) + 1;
if(s_month == 0) s_month = 1;
s_day = s_day_sum % 31;
if(s_day == 0) s_day = 31;
}
}
else
{
s_year = m_year - 622;
if((s_year + 1) % 4 == 0)
{
s_day_mon[11] = 30;
s_day_sum = m_day_sum + 287;
}
else
{
s_day_mon[11] = 29;
s_day_sum = m_day_sum + 286;
}
s_month = ((s_day_sum -187) / 30) + 7;
s_day = (s_day_sum - 186) % 30;
if(s_day == 0) s_day = 30;
}
printf("TODAY IN GREGORIAN CALENDAR IS : %d/%d/%d\n" , m_year,m_month,m_day);
if((m_month == 1) && (m_day == 1))
printf("HAPPY NEW GREGORIAN YEAR\n");
printf("\nTODAY IN PERSIAN CALENDAR IS : %d/%d/%d\n" , s_year,s_month,s_day);
if((s_month == 1) && (s_day == 1))
printf("HAPPY NEW PERSIAN YEAR");
getch();
}

cyber_world
چهارشنبه 06 شهریور 1387, 14:34 عصر
هر عدد که به 4 بخش پذر باشه توی شرط بالا صدق می کنه. و بخش پذیر بودن به 4 شرط کبیسه بودن سال نیست. یک سال شمسی کبیسه هست وقتی باقیمانده اون به 33 یکی از اعداد 6، 22، 17، 13، 9، 5، 1 و 30 باشه.
البته من خودم از این الگوریتم برای تبدیل استفاده کردم و غیر از کبیسه بودن سال که متدشو عوض کردم مشکل دیگه ای نداره.

سلام.
اين روشي كه شما فرموديد، درست كار نمي كنه، چون سال 1379 كبيسه هست ولي باقيمانده آن به 33 برابر است با : 26 كه اين عدد جز باقيمانده هاي بالا نيست!!
راه ديگه اينه كه يك سال کبیسه رو به عنوان سال مبنا قرار بدي ، مثلا 1387، و بعد اگر اختلاف هر سال دلخواهي با اين سال مبنا ، بر 4 بخش پذير بود، اون سال کبیسه خواهد بود.
نكته مهم اين كه اين ايده ي دوست عزيزم ، montazer_mosleh (http://barnamenevis.org/forum/member.php?u=69439) هست. كه كاملا درست جواب مي ده.

R E Z A P
پنج شنبه 04 آذر 1389, 15:24 عصر
کد تبدیل با C :



#include <stdio.h>
#include <conio.h>
#include <dos.h>
main()
{
//start/variables
int m_day_mon[12] = {31,0,31,30,31,30,31,31,30,31,30,31};
int s_day_mon[12] = {31,31,31,31,31,31,30,30,30,30,30,30};

int m_year , s_year;
int m_month , s_month;
int m_day , s_day;
int m_day_sum , s_day_sum;
//end/variables
struct date d;
getdate(&d);
m_year = d.da_year;
m_month = d.da_mon;
m_day = d.da_day;
// number of past day from m_year
if(m_year % 4 == 0)
m_day_mon[1] = 29;
else m_day_mon[1] = 28;
for(int i = 1 ; i <m_month ; i++)
m_day_sum += m_day_mon[i - 1];
m_day_sum += m_day;
// convert m_date to s_date
if(m_day_sum > 79)
{
s_day_sum = m_day_sum - 79;
s_year = m_year - 621; //s_year
if((s_year + 1) % 4 == 0)
s_day_mon[11] = 30;
else s_day_mon[11] = 29;
if (s_day_sum > 186)
{
s_month = ((s_day_sum - 187) / 30) + 7;
s_day = (s_day_sum - 186) % 30;
if(s_day == 0) s_day = 30;
}
else
{
s_month = ((s_day_sum - 1) /31) + 1;
if(s_month == 0) s_month = 1;
s_day = s_day_sum % 31;
if(s_day == 0) s_day = 31;
}
}
else
{
s_year = m_year - 622;
if((s_year + 1) % 4 == 0)
{
s_day_mon[11] = 30;
s_day_sum = m_day_sum + 287;
}
else
{
s_day_mon[11] = 29;
s_day_sum = m_day_sum + 286;
}
s_month = ((s_day_sum -187) / 30) + 7;
s_day = (s_day_sum - 186) % 30;
if(s_day == 0) s_day = 30;
}
printf("TODAY IN GREGORIAN CALENDAR IS : %d/%d/%d\n" , m_year,m_month,m_day);
if((m_month == 1) && (m_day == 1))
printf("HAPPY NEW GREGORIAN YEAR\n");
printf("\nTODAY IN PERSIAN CALENDAR IS : %d/%d/%d\n" , s_year,s_month,s_day);
if((s_month == 1) && (s_day == 1))
printf("HAPPY NEW PERSIAN YEAR");
getch();
}

سلام به همه ی اساتید
کسی کد تبدیل به قمری رو نداره c مثل بالا دقیقا
ممنون

R E Z A P
جمعه 05 آذر 1389, 18:40 عصر
كسي نيست جواب مارو بده؟

maxmas
دوشنبه 29 آذر 1389, 12:18 عصر
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `gday`(x int) RETURNS int(11)
begin
declare y int;
case x
when 0 then set y = 31;
when 1 then set y = 28;
when 2 then set y = 31;
when 3 then set y = 30;
when 4 then set y = 31;
when 5 then set y = 30;
when 6 then set y = 31;
when 7 then set y = 31;
when 8 then set y = 30;
when 9 then set y = 31;
when 10 then set y = 30;
when 11 then set y = 31;
else set y = 0;
end case;
return y;
end;;
DELIMITER ;

-- ----------------------------
-- Function structure for GeoToJal
-- ----------------------------
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `GeoToJal`(jdate datetime) RETURNS varchar(32) CHARSET utf8
begin
declare g_y int;
declare g_m int;
declare g_d int;
declare gy int;
declare gm int;
declare gd int;
declare jy int;
declare jm int;
declare jd int;
declare g_day_no int;
declare j_day_no int;
declare j_np int;
declare i int;

set g_y = year(jdate);
set g_m = month(jdate);
set g_d = day(jdate);

if g_y = 0 || g_m = 0 || g_d = 0 then
return null;
end if;

set gy = g_y - 1600;
set gm = g_m - 1;
set gd = g_d - 1;

set g_day_no = 365*gy+((gy+3) div 4)-((gy+99) div 100)+((gy+399) div 400);

set i = 0;
_loop1: LOOP
set g_day_no = g_day_no + gday(i);

set i = i + 1;
if i = gm then
leave _loop1;
end if;
end LOOP _loop1;

if gm>1 && ((mod(gy,4)=0 && not (mod(gy,100)=0)) || (mod(gy,400)=0)) then
set g_day_no = g_day_no + 1;
end if;

set g_day_no = g_day_no + gd;
set j_day_no = g_day_no - 79;
set j_np = j_day_no div 12053;
set j_day_no = mod(j_day_no, 12053);
set jy = 979 + 33 * j_np + 4 * (j_day_no div 1461);
set j_day_no = mod(j_day_no, 1461);

if j_day_no >= 366 then
set jy = jy + ((j_day_no-1) div 365);
set j_day_no = mod((j_day_no-1), 365);
end if;

set i = 0;
_loop2: LOOP
set j_day_no = j_day_no - jday(i);

set i = i + 1;
if i >= 11 || j_day_no < jday(i) then
leave _loop2;
end if;
end LOOP _loop2;

set jm = i + 1;
set jd = j_day_no + 1;

return concat(jy, "/", jm, "/", jd, " ", time(jdate));
end;;
DELIMITER ;

-- ----------------------------
-- Function structure for jday
-- ----------------------------
DELIMITER ;;
CREATE DEFINER=`root`@`localhost` FUNCTION `jday`(x int) RETURNS int(11)
begin
declare y int;
case x
when 0 then set y = 31;
when 1 then set y = 31;
when 2 then set y = 31;
when 3 then set y = 31;
when 4 then set y = 31;
when 5 then set y = 31;
when 6 then set y = 30;
when 7 then set y = 30;
when 8 then set y = 30;
when 9 then set y = 30;
when 10 then set y = 30;
when 11 then set y = 29;
else set y = 0;
end case;
return y;
end;;
DELIMITER ;
#END


:چشمک:

saya joon
چهارشنبه 27 مهر 1390, 21:39 عصر
سلام
اگه از NET. استفاده می کنید که خودش به هر نوع تاریخی که بخواهید تبدیل می کنه . دیگه احتیاجی به کد نویسی نیست . کافی از using system.globalization استفاده کنید .
من کد delphi , c دارم اگه خواستید بگید ، واستون بزارم .

با سلام.دوست خوب میشه همون کد c گذاشتین اینجا توضیح بدی من مبتدی هستم متوجه نشدم چی به چی هست؟ کد را کامل توضیح بدین ممنون میشم.

logofun
شنبه 30 مهر 1390, 14:00 عصر
برای نوشتن فلوچارتش باید چه کرد میشه قدم به قدم بگید:خجالت: