آموزش های این وب سایت به صورت رایگان در دسترس است. اطلاعات بیشتر
بروز خطا
   [message]
اشتراک در سوال
رای ها
[dataList]

تفریق دو تاریخ به چه صورت هست؟

PandaStudio  11 سال پیش  11 سال پیش
0 0

سلام دوستان

من توی یه پروژه بنا به دلایلی مجبورم تاریخ را به صورت یک رشته مثلا 13930808 ذخیره کنم حالا توی دوتا مورد گیر کردم لطفا اگه کسی بلده راهنمایی کنه

1 - تفریق دو تاریخ از هم مثلا 13930516 - 13930808

2 - کم کردن یا اضافه کردن چند روز و محاسبه تاریخ جدید. مثلا میخوام 120 روز بعد و قبل از تاریخ 13930208 را بدست بیارم

 

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

 برای این سوال 2 پاسخ وجود دارد.
پاسخ به سوال 
hamed  11 سال پیش
+5 0

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

1- هر دو تاریخ را دریافت کنید!

2- تاریخ ها را به هم مقایسه کنید و تاریخ بزرگتر را مشخص کنید. (کافیست عدد بزرگتر انتخاب شود) و ادامه کار را بر اساس تاریخ بزرگتر انجام می دهید.
3- اگر یک سال یا بیشتر اختلاف بود باید مشخص کنید که این اختلاف چه مقدار است. و در چه سالی است. برای این کار کافی است چهار رقم اول را جدا کنید (یا دو رقم اول را (بسته به نوع عدد دهی تون)) و بعد از چهار رقم (یا دو رقم) تاریخ دیگر مقایسه کنید. اگر اختلاف بیش از دو نداشتند که هیچ (یعنی هر دو سال پشت سر هم یا در یک سال نباشند.)
4- سال های اختلافی را ببینید که کبیسه است یا عادی. (اختلاف بیش از دو را. یعنی هر دو سال پشت سر هم یا در یک سال نباشند.) برای فهمیدن این موضوع هم کافیه یه سرچی بزنید و ببینید تا صد سال آینده چه سال هایی کبیسه اند و آن ها را در یک آرایه بریزید و در موقع لزوم با جستجو در آرایه بفهمید سال کبیسه است یا نه) و محاسبات پیچیده نجومی هم نمی خواهد! و در آخر سال ها را در 365 یا 366 ضرب کنید و جمع.

5- خوب حالا باید ببینید سال بزرگتر چند روز از اول سال را گذرانده که خوب ساده است و باید بسته به عدد ماه آن را در یک عدد ضرب کنید. خیلی هم می توانید خشک بنویسید (با چند تا سوئیچ-کیس). مثلا بگویید اگر در ماه هشت بودیم می شود عدد 31*6+30*1 و این عدد هم بعلاوه تعداد روز های همین ماه. و تمام
6- حالا باید ببینید سال کوچکتر تا پایان سال چقدر فاصله دارد. که محاسبات مشابه بالا و کاملا خشک (با چند تا سوئیچ-کیس) می شود نوشته شود و فقط می ماند اینکه آیا این سال کوچکتر کبیسه هست یا نه؟ که اگر بود یکی هم بهآن اضافه می شود.
7- کافیه عدد های بالا را جمع بزنید می شود اختلاف.

این ساده ترین راه هست از آن جا که پیچیدگی ندارد. یه کم پیچیده ترش ولی کوتاه تر می شود این :

1- یک و دو مشابه قبل.2- اختلاف را مشابه قبل بسنجید. اگر صفر بود که هیچ ولی اگر یک یا بیشتر بود برو اختلاف ماه ها را چک کن. اگر ماه تارخ بزرگتر، بزرگتر بود که یه 365 یا 366 (بسته به کبیسه) باهاش جمع کنید و بعد تعداد ماه های اختلافی را هم باید محاسبه کنی و به روز تبدیل کنی و جمع کنی. حالا اگر کمتر از یک سال هم اختلاف بود، مقدار اختلاف را ببین چه ماههایی بوده و در تعداد روزهاش ضرب کن.

3- اگر مقدار اختلاف سال ها بیشتر از یک سال بود روزهای اون ها را هم اضافه کن.

و تمام.

این الگوریتم دوم پیچیده تره ولی می تونه کوتاه تر و دینامیک تر نوشته بشه. ولی الگوریتم اول ساده نوشته می شود و خیلی هم می توان آن را خشک نوشت و اصلا در نوشتن کد آن هم اشتباه نمی شود.

پاسخ به سوال 
Criss  11 سال پیش
+4 0

باید تاریخ هارو دو تا دوتا جدا کنی و به تغیر int تبدیل کنی < و البته کلی دستور if و for نیاز هست < یک مثال میزنم <

13930516 - 13930808
13930516 = int d1 = 16 , int m1 = 05 , int y1 = 1393
13930808 = int d2 = 08 , int m2 = 08 , int y2 = 1393

حالا تفریق بصورت زیر هست <

توی کد زیر تعداد روز ها رو کم میکنیم < هرجا به صفر برسیم < از ماه یک مرتبه کم میکنم < و مقدار روز رو برابر با 30 قرار میدیم و اگر از i باز هم چیزی باقی مونده باشی باز از 30 کم میشه

این دستور if رو برای m ماه نیز میتونید بکار ببرید که اگر 0 شد از سال یک مرتبه کم کنه و ماه رو برابر 12 قرار بده <

 for (int i = d2 ; i > 0 ; i--) {
if (d1 - i = 0 ) {
m1 -1 && d1 = 30
if (m1 = 0){
y1 - 1 && m1 = 12
}
}
}

مثال ریاضی کد بالا این میشه < مثلا قرار از تاریخ زیر 15 روز کم بشه < طبق کد بالا اینطورپیش میره

1393/01/08

 8 - 16 = 0 (- 8)

از 16 واحدی که باید کم بشه وقتی تنها 8 واحد رو کم کنیم به صفر میرسیم پس تعداد روز رو تبدیل به 30 میکنیم و 8 واحد باقی مونده رو از 30 کم میکنیم و چون تعدا روز ها به 30 رسیده باید از ماه 01  هم یک واحد کم میکنیم که باز هم ماه بعد از اینکه یک واحد ازش کم کردیم تبدیل میشه به  0  ، پس باز هم ما تعداد ماه رو که صفر شده رو برابر 12 قرار میدیم و از سال  یک واحد کم میکنیم پس میشه

1392/12/22

 

+2 0
ایده خوبیه اما بیشتر برای حالت کسر کردن تعداد روز از تاریخ کاربردی به نظر می رسه. هر چند وقتی بخواهید تعداد روز های متنوع ماه ها (31 و 30 و 29) و سال کبیسه را در آن لحاظ کنید یه کم پیچیده می شه و احتمال اشتباه را می بره بالا. اما برای کسر دو تاریخ راه ساده تر فکر کنم همونی باشه که در بالا آورده ام. (11 سال پیش)
+2 0
برای 29 و 30 و 31 باید 3 تا دستور IF اضاف کرد برای 7 > m برابر 31 و برای 6 < m برابر 30 و برای m = 12 هم 29 < اما سال کبیسه رو باید یک آرایه قرار بدهند و عدد های سمت راست سال رو محاسبه کنند چون هر 4 سال یکبار اتفاق میافته < مثل جام جهانی میمونه < :D (11 سال پیش)

پاسخگویی و مشاهده پاسخ های این سوال تنها برای اعضای ویژه سایت امکان پذیر است .
چنانچه تمایل دارید به همه بخش ها دسترسی داشته باشید میتوانید از این بخش لایسنس این آموزش را خریداری نمایید .