PDA

View Full Version : سوال: جمع و تفریق دو تاریخ شمسی (جواب بر اساس روز ماه سال)



ma.rad
چهارشنبه 18 خرداد 1390, 15:52 عصر
سلام دوستان
شاید سوال تکراری باشه ولی من تابع جمع وتفریق پیدا نکرددم
میخوام دو تا تاریخ شمسی رو جمع ویا تفریق کنم ونتیجه رو به روز به من برگردونه
اگر ماه و سالم برگردونه بهتره

Reza_Yarahmadi
چهارشنبه 18 خرداد 1390, 19:01 عصر
میتونید از کلاس PersianCalendar بصورت زیر استفاده کنید
int DeduceShamsi(String source, String des)
{
System.Globalization.PersianCalendar p=new System.Globalization.PersianCalendar();
DateTime dt1 = p.ToDateTime(
int.Parse(source.Substring(0, 4)),
int.Parse(source.Substring(5, 2)),
int.Parse(source.Substring(8, 2)),
0, 0, 0, 0);
DateTime dt2 = p.ToDateTime(
int.Parse(des.Substring(0, 4)),
int.Parse(des.Substring(5, 2)),
int.Parse(des.Substring(8, 2)),
0, 0, 0, 0);
return (dt1 - dt2).Days;
}
برای استفاده هم
DeduceShamsi("1390/03/31", "1390/02/01")
برای سال و ماه باید خودتون زحمت محاسباتش رو بکشید (با توجه به تاریخ سورس تشخیص بدید که ماهها چند روز هستند و ...)

mahdidabaghi
چهارشنبه 18 خرداد 1390, 22:56 عصر
سلام این کد رو از ذوست خوبم ئهدی قربانی گرفتم
امیدوارم که مار شما زو هم راه بندازه

SolarDateTime SolarDT = newSolarDateTime(1389, 2, 31); // ساخت تاریخ دستی
SolarDT = SolarDateTime.Now; // تاریخ و زمان امروز
SolarDT = SolarDateTime.GregorianToSolar(DateTime.Now); // تبدیل میلادی به شمسی
SolarDT = newSolarDateTime(DateTime.Now);// تبدیل میلادی به شمسی

SolarDT = SolarDT.AddDays(20);//اضافه کردن تعداد دلخواه روز
SolarDT = SolarDT.AddHours(-400); //کم کردن تعداد دلخواه ساعت

SolarDT = SolarDateTime.Parse("1390/3/11 09:09:51 PM"); // تبدیل رشته به تاریخ
DateTime DT = SolarDT.GregorianDateTime; // تبدیل شمسی به میلادی
DT = SolarDateTime.SolarToGregorian(SolarDT); // تبدیل شمسی به میلادی

label1.Text = SolarDT.ToString(); // 1390/2/26 05:09:51 AM
label1.Text = SolarDT.ToLongDateString(); //دوشنبه 26 اردیبهشت 1390
label1.Text = SolarDT.ToShortDateString(); //1390/2/26
label1.Text = SolarDT.ToLongTimeString(); //05:09:51 AM
label1.Text = SolarDT.ToShortTimeString(); //05:09 AM

ma.rad
چهارشنبه 18 خرداد 1390, 23:25 عصر
دوست عزیز تبدیل واضافه کردن روز به تاریخ رو میدونم
میخوام دو تا تاریخ جمع یا تفریق کنم جواب را بر حسب سال ماه روز برگردونه
01/01/1389 -23/05/1382
01/01/1389 +02/22/1390

mahdidabaghi
پنج شنبه 19 خرداد 1390, 00:52 صبح
nدوست عزیز
اگه تو کدها دقت کنی میبینی که اضافه کردن روز به یه تاریخ رو داره
شما خیلی راحت میتونی هرچندروز دلخواه رو به تاریخ موردنظزت اضافه کنی!!!!!!!!!!!!!

ma.rad
پنج شنبه 19 خرداد 1390, 11:40 صبح
من نمی خوام روز اضافه کنم من میخوام اختلاف صحیح دو تا تاریخ رو بدست بیارم
دوستان نظر بدن

Directx
پنج شنبه 19 خرداد 1390, 12:24 عصر
منظورتونو فهمیدم می تونید از تلفیق کلاس persian calendare و این کد می تونید دو تارخ شمسی رو از هم کم کنید و مقدار رو به روز ، ساعت و ... به دست بیارید البته اینم یادتون باشه که اگه فقط اختلاف رو می خوایید لازم نیس که از persian calendare استفاده کنید.


DateTime dt1 = DateTime.Now;
DateTime dt2 = dateTimePicker1.Value;
TimeSpan ekhtelaf = dt1 - dt2;

int day = ekhtelaf.Days;
int hours = ekhtelaf.Hours;
int second = ekhtelaf.Seconds;
...
...
...

ma.rad
جمعه 20 خرداد 1390, 19:16 عصر
دوستان کسی کلاس کاملی برای بگردوندن اختلاف تاریخ به روز ماه سال نوشته؟
ویه سوال دیگه بشه از یه تاریخ چند سال چند ماه چند روز کم کرد ونتیجه رو به شمسی درست برگردونه؟

morteza271
جمعه 20 خرداد 1390, 20:15 عصر
سلام.
برای اینکه به یه تاریخ روز یا ماه یا سال اضافه کنی که با استفاده از توابع زیر میتونی :

DateTime dt = DateTime.Now;
dt = dt.AddDays(10);
dt = dt.AddMonths(1);
dt = dt.AddYears(1);
برای کم کردن هم کافیه عدد رو منفی بهشون پاس بدی.
در مورد تاریخ شمسی هم درست جواب میده.من قبلا ازش استفاده کردم.
در مورد تفریق یا جمع دو تاریخ هم فک کنم دوستان جواب دادن و از روی کداشون به نتیجه دلخواه میرسی.
موفق باشید.

ma.rad
یک شنبه 22 خرداد 1390, 16:22 عصر
دوستان برا بدست اوردن ماه و روز وسال راهنمایی کنن روش هایی که استفاده میکنم برا ما ههای 31 و29 جواب نمی ده

morteza271
یک شنبه 22 خرداد 1390, 16:31 عصر
شما هنوز به به جوابتون نرسیدیم؟
به این طریق میتونی تعداد روزهای هر کدوم از ماه های یک سال رو بدست بیارید:

System.Globalization.PersianCalendar pc = new System.Globalization.PersianCalendar();
int CountDayOfMonth = pc.GetDaysInMonth(Year, Month);

ma.rad
یک شنبه 22 خرداد 1390, 16:39 عصر
نه دوست عزیز من اختلاف دو تاریخ ب حسب روز بدست اوردم مثلا 481 روز
حالا میخوام ببینم این 481 روز چند سال وچند ماه وچند روز هستش
البته سال وماه مشکلی نیست ولی روز اشتباه در میاد به خاطر ماه های 31 29 روزه

morteza271
یک شنبه 22 خرداد 1390, 16:52 عصر
خوب طبیعتا این مشکل هست ولی به نظرم شما باید یه قانون کلی براش در نظر بگیرین و بر اساس اون تعداد سال و ماه رو بدست بیارید.
مثلا اینکه همه ی ماه ها رو 30 روزه درنظر بگیرید.
چون شما تعداد سال و ماه یک عدد رو میخواین بدست بیارید مطمعنا نمیتونید دقیق بدست بیارید چون نمیتونید چه سالی هست وگرنه با استفاده از همون کدی که گذاشتم میتونستید بفهمید که هر ماه از سال چند روز داره حتی یه نابع دیگه هم داره که تعداد روزهای یک سال رو میده ولی چون شما در این مسئله سال رو نمیدونید نمیشه ازش استفاده کرد.
به نظرم یا کلا در نظر بگیر که همه ی ماه ها 30 روزه هستش و یا اینکه سال رو سال جاری درنظر بگیر و تعداد روزهای سال رو بدست بیار و بعد تعداد سالها رو محاسبه کن.
موفق باشید.

ma.rad
یک شنبه 22 خرداد 1390, 18:16 عصر
دوست عزیز کشف کردم برا بدست اوردن روز باید تقسیم 365.25 بشه :قلب:

sobaisobai
یک شنبه 13 آذر 1390, 21:12 عصر
دوست عزیز کشف کردم برا بدست اوردن روز باید تقسیم 365.25 بشه :قلب:
سلام
چی تقسیم بر 365.25 بشه؟

ma.rad
دوشنبه 14 آذر 1390, 00:43 صبح
مثلا اختلاف دوتا تاریخ بشه 800 روز حالا میخواید ببینید چند روز وچند ماه وچند ساله
سال وماه که بدست اوردنش سادس میمونه روز (که با توجه به ما ه ها 29 و31) سال کبیسه با روش زیر درست درمیومد

(days % 365.25) % 30);

mohammad272005
دوشنبه 14 آذر 1390, 02:14 صبح
یه نگاهی به اینجا (http://www.codeproject.com/KB/cs/PersianDateTime.aspx) بنداز. شاید به دردت بخوره

saeidfar
پنج شنبه 29 دی 1390, 08:49 صبح
اينجا يه مشكل كوچيك وجود داره
شما اول بايد سالهاي كبيسه بين دو تاريخ رو محاسبه كني حتما هر 4 سال يكبار كبيسه نميشه بلكه بعد از 32 سال بعد از 5 سال يك سال كبيسه ميشه
به نظر من يه خورده پيچيدس
ببينيد با اين تفاسير آيا تفاوت تاريخ 01/01/1340 تا 01/01/1420 - 80 سال و 0 ماه و 0 روز دقيق در مياد ؟ براي تاريخ هاي ديگر هم تست كنيد.
به نظر شما وقتي ميگن طرف مثلا 55 سالشه يعني چي؟ آيا سالهاي كبيسه رو هم محاسبه كردن؟
ما توي توابع تابعي داريم كه فقط اختلاف روز و ساعت و دقيقه و ثانيه رو نشون ميده اما نميگه كه چند ماه و چند سال دو تاريخ با هم اختلاف دارن
مثلا سيستم بازنشستگي كشور براي افرادي كه 30 سال خدمتشون تموم ميشه همه سالهاي كبيسه رو هم محاسبه ميكنن؟
و يا وقتي تو تقويم تاريخ ميگه در چنين روزي آيا دقيقا معادل همين روز در چندصدسال قبل اتفاق افتاده براي محاسبه سالهاي كبيسه چطوري عمل ميشه؟
شما وقتي تاريخ تولد يك نفر رو داري و ميخاي با اين روش محاسبه كنيد كه چند سالشه بنظر شما محاسبه دقيق در مياد؟ من كه امتحان كردم و جواب منفي است؟
يا بهتر بگويم
كسي كه الآن تو ديماه 5 ماهشه با كسي كه در تاريخ 31 شهريور امسال 5 ماهش شده سن اوناها در 5 ماهگي يكي نيست چرا كه اولي 5 ماهش 31 روزه بودن اما اوني كه تو ديماه 5 ماهش ميشه، براي اون فقط شهريور 31 روزه بوده و بقيه ماهاش 30 روزه پس يكي 5 ماهش ميشه 155 روز و يكي ديگه 5 ماهش ميشه 151روز !.
تو دنياي امروز محاسبات ما اينجوريه سال كبيسه كه برا خودت ماههاي اول سال و آخر سال كه تعدادروزهاشون باهم متفاوته هم درست حساب نميشه! يا بهتر بگم براي مردم عادي كه نيازي به محاسبات دقيق وجود نداره مهم نيست و لي وقتي دودوتا چهارتا ميكني ميبيني جور در نمياد.

در هر صورت روش بهتري كسي سراغ نداره؟!

ma.rad
پنج شنبه 24 فروردین 1391, 10:18 صبح
من خیلی روی این موضوع فکر کردم وبهترین نتیجه همین بود که بدست اوردم

mehran_337
شنبه 26 فروردین 1391, 10:54 صبح
با سلام
بنده هم توسط روشهایی مشابه روش های فوق ابتدا رشته تاریخ شمسی را توسط toDateTime به میلادی تبدیل می کنم و سپس توسط تابع AddMonth تعدادی روز به آن اضافه می کنم سپس نتیجه را بصورت رشته شمسی بر می گردونم . اما انتظار می رفت که مثلا اگر ورودی 1390/01/01 باشه وتوسط AddMonth یک ماه بهش اضافه کنیم خروجی 1390/02/01 باشه اما 1390/01/31 بر می گردونه.
معلومه که 30 روزه حساب کرده.
آیا راه حلی دوستان می دونن که راهنمایی کنن؟
با تشکر

ma.rad
چهارشنبه 30 فروردین 1391, 10:25 صبح
این رو نگاه کنید من آخرش مجبور شدم برا مشکلی که شما کفتید یه تابع بنویسم
http://barnamenevis.org/showthread.php?335986-تغییر-در-نحوه-عملکرد-توابع-PersianCalendar&p=1482383#post1482383

modern_amin
سه شنبه 24 مرداد 1391, 12:16 عصر
مثلا اختلاف دوتا تاریخ بشه 800 روز حالا میخواید ببینید چند روز وچند ماه وچند ساله
سال وماه که بدست اوردنش سادس میمونه روز (که با توجه به ما ه ها 29 و31) سال کبیسه با روش زیر درست درمیومد

(days % 365.25) % 30);


منظورتون از % تقسیم هست یااااا باقیمانده (mod)