PDA

View Full Version : سوال: تبدیل تاریخ میلادی به تاریخ شمسی



25farshid
پنج شنبه 30 دی 1389, 17:34 عصر
سلامآیا تو سی پلاس میشه تاریخ سیستم رو گرفت و اون رو به شمسی تبدیل کرد .اگه میشه چجوری.با تشکر.

mehdi.mousavi
پنج شنبه 30 دی 1389, 17:55 عصر
سلامآیا تو سی پلاس میشه تاریخ سیستم رو گرفت و اون رو به شمسی تبدیل کرد .اگه میشه چجوری.با تشکر.

سلام.
لطفا به این آدرس (http://barnamenevis.org/showthread.php?70831-%D8%AA%D8%A8%D8%AF%DB%8C%D9%84-%D8%AA%D8%A7%D8%B1%DB%8C%D8%AE-%D9%85%DB%8C%D9%84%D8%A7%D8%AF%DB%8C-%D8%A8%D9%87-%D8%B4%D9%85%D8%B3%DB%8C&p=380637&viewfull=1#post380637) رجوع کنید و قبل از ایجاد تاپیک، جستجو نمایید.

موفق باشید.

25farshid
شنبه 02 بهمن 1389, 13:20 عصر
دست شما درد نکنه .ولی اینا کد c و java هست میشه کد c++ ش رو بزارید اگه یه کمی توضیح هم بدین ممنون میشم .با تشکر .

Salar Ashgi
شنبه 02 بهمن 1389, 22:26 عصر
دوست عزیز ، یک برنامه نویس ماهر اونی هستش که با نگاه کردن به هر کدی حتی اگر با زبانش نا آشنا باشد ، مفهوم کد را حداقل متوجه بشود .
زبان مهم نیست ، بالاخره یک الگوریتم واحدی قرار است پیاده سازی شود ، پس اگر شما همان کد جاوا را بخوبی متوجه شوید ، تبدیل آن به ++C کار
سختی نخواهد بود ، جدای اینکه جاوا و ++C دوستی دیرینه با هم دارند .
در هر حال با یک جستجوی خیلی ساده الگوریتمی را از یک وبلاگ برایتان نقل قول میکنم :


الگوريتم تبديل تاريخ ميلادي به تاريخ شمسي :
تبديل تاريخ ميلادي به شمسي بسيار راحتتر از تبديل تاريخ شمسي به ميلادي است. براي نوشتن اين الگوريتم به اختلاف روزهاي ميان اولين روز سال ميلادي و اولين روز سال شمسي نياز داريم که اين اختلاف روز (در صورتي که سال کبيسه باشد يا نباشد) "79" روز است. براي تشخيص کبيسه بودن يا نبودن سال از روش زير استفاده مي کنيم:
"اگر سال داده شده بر100و 400 بخشپذير باشد" يا بر" 100 بخشپذير نباشد بر 4 بخشپذير باشد" آنگاه سال کبيسه است، در غير اين صورت سال کبيسه نيست.با توجه به کبيسه بودن يا کبيسه نبودن سال مشخص مي کنيم که در کدامين روز سال ميلادي قرار داريم.دو حالت پيش مي آيد:
• روزي که در آن قرار داريم از 79 بيشتر است
به اين معني است که در ماههاي بعد از فروردين قرار داريم.حال بايد مشخص کنيم که در 6 ماه اول سال شمسي قرار داريم يا در 6 ماه دوم سال قرار داريم،براي اينکار ابتدا 79 روز از تعداد روزها کم مي کنيم تا در اول فروردين قرار بگيريم حال اگر تعداد روزها از "186" (31*6) کمتر باشد يعني در 6 ماه اول سال شمسي قرار داريم در غير اينصورت در 6 ماه دوم قرار داريم.
1. اگر در 6 ماه اول سال قرار گرفته باشيم :تعداد روزها را بر "31" تقسيم مي کنيم (6 ماه اول در سال شمسي 31 روزه است.)اگر باقيمانده اين تقسيم صفر شد خارج قسمت تقسيم برابر با ماه شمسي مي شود و روز شمسي برابر با 31 مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه يک مي شود و روز شمسي همان باقيمانده است.
2. اگر در 6 ماه دوم سالقرار گرفته باشيم : "186" روز از تعداد روزها کم مي کنيم و آن را بر "30" تقسيم مي کنيم .اگرباقيمانده اين تقسيم صفر شد خارج قسمت تقسيم باضافه"6" برابر با ماه شمسي مي شودو روز شمسي برابر با30 مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه "7" مي شود و روز شمسي همان باقيمانده است. سال شمسي از تفاضل سال ميلادي با "621" بدست مي آيد.
• روزي که در آن قرار داريم کمتر از "79" است :
که اين به اين معني است که درروزهايي بين اولين روزسال ميلادي تا اولين روز شمسي (ماههاي دي ،بهمن و اسفند)قرار داريم.اختلاف روز بين اولين روز سال ميلادي داده شده و اولين روز دي ماه در سال شمسي را در نظر مي گيريم که اين اختلاف براي سال کبيسه"11" و براي غير کبيسه "10" است.*دقت کنيد که در اين الگوريتم براي مشخص کردن اين اختلاف بايد سال قبل از سال داده شده را در نظر بگيريم زيرا سال قبل بر روي اولين روز سال ميلادي تاثير مي گزارد.*
اختلاف روز با تعداد روز محاسبه شده جمع مي کنيم ، آن را بر"30" تقسيم مي کنيم(3 ماه آخر سال شمسي 30 روزه است.).
اگر باقيمانده اين تقسيم صفر شود خارج قسمت تقسيم باضافه"9" برابر با ماه شمسي مي شودو روز شمسي برابر با "30" مي شود.اگر باقيمانده صفر نشود ماه شمسي برابر با خارج قسمت باضافه"10"مي شودو روز شمسي همان باقيمانده است.در اين حالت سال شمسي از تفاضل سال ميلادي با"622" بدست مي آيد.(زيرا در سال قبل قرار داريم.)

کد کامل تبدیل تاریخ میلادی به شمسی:

Function MiladiToShamsi(var Year, Month, Day: Word): String;
const
count_days : array[1..12] of Byte = (31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31);
var
i: Byte;
st: String;
day_year: Integer;
begin
day_year:= 0;
for i:= 1 to month - 1 do
day_year:= day_year + count_days[i];
day_year:= day_year + day;

if IsLeapYear(Year) and (month > 2) then
Inc(day_year);

if (day_year <= 79) then
begin
if ((Year - 1) mod 4 = 0) then
day_year:= day_year + 11
else
day_year:= day_year + 10;

Year:= Year - 622;

if (day_year mod 30 = 0) then
begin
Month:= (day_year div 30) + 9;
Day:= 30;
end
else
begin
Month:= (day_year div 30) + 10;
Day:= day_year mod 30;
end;
end
else
begin
year:= year - 621;

day_year:= day_year - 79;
if (day_year <= 186) then
begin
if (day_year mod 31 = 0) then
begin
Month:= (day_year div 31);
Day:= 31;
end
else
begin
Month:= (day_year div 31) + 1;
Day:= day_year mod 31;
end;
end
else
begin
day_year:= day_year - 186;
if (day_year mod 30 = 0) then
begin
Month:= (day_year div 30) + 6;
Day:= 30;
end
else
begin
Month:= (day_year div 30) + 7;
Day:= day_year mod 30;
end;
end;
end; // else .

st:= IntToStr(Year) + '/';
if (Month < 10) then
st:= st + '0';
st:= st + IntToStr(Month) + '/';
if (Day < 10) then
st:= st + '0';
st:= st + IntToStr(Day);

Result:= st;
end;



منبع : http://ebrahimkhodaei.blogfa.com/post-18.aspx

موفق باشید ./

www.DST.co.ir
جمعه 21 مهر 1391, 21:50 عصر
PersianCalendar p = new PersianCalendar();
DateTime dmiladi = new DateTime();
dmiladi = DateTime.Now;
LbDate.Text =p.GetYear(dmiladi).ToString() + "/" + p.GetMonth(dmiladi).ToString() + "/" + p.GetDayOfMonth(dmiladi).ToString();

مسعود اقدسی فام
جمعه 21 مهر 1391, 21:58 عصر
PersianCalendar p = new PersianCalendar();
DateTime dmiladi = new DateTime();
dmiladi = DateTime.Now;
LbDate.Text =p.GetYear(dmiladi).ToString() + "/" + p.GetMonth(dmiladi).ToString() + "/" + p.GetDayOfMonth(dmiladi).ToString();


سوال رو خوندید و این جواب رو اینجا گذاشتید؟؟؟