تقسیم کردن بازه زمانی به بازه های کوچکتر

- 4 ماه پیش
توسط سید محمد حسین موسوی آپدیت شد
Pouya Farahany ( 200 تجربه )
4 ماه پیش

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

بهترین پاسخ انتخاب شده توسط Pouya Farahany

این مسائل بیشتر جنبه الگورتمیک داره و کافیه یکم به روش های حل مسئله توجه کنید. خیلی کار سختی نیست. من یه مثالش رو می زنم ولی شاید بتونید n تا روش دیگه برای اینکار پیدا کنید.
من تو این روش بدون استفاده از توابع مخصوص به تاریخ و زمان اینکارو می کنم. مثلا فرض کن ساعت شروعت 14:21 دقیقه و زمان پایانت هم 19:46 دقیقه هست. فرمتش رو هم اصلا تاریخ در نظر نمی گیریم.
با دستور:

var startTime = "14:21";
var endTime = "19:46";
var t = 14;
var startTimeHour = parseInt(startTime.split(":")[0]);
var startTimeMinutes = parseInt(startTime.split(":")[1]);
var startTimeSumMinute = (startTimeHour * 60 ) + startTimeMinutes;

var endTimeHour = parseInt(endTime.split(":")[0]);
var endTimeMinutes = parseInt(endTime.split(":")[1]);
var endTimeSumMinute = (endTimeHour * 60 ) + endTimeMinutes;

شما تاریخ رو که رشته بود تبدیل به دوتا عدد می کنی که یکیش می شه ساعت و دومی هم می شه دقیقه.
t هم مقدار دقیقه ای هست که شما می خوای بر اساسش زمان رو تقسیم کنی و نوبت بدی که اینجا من 14 دقیقه رو مثال زدم.
تو مرحله بعد ساعت رو ضرب در 60 دقیقه کردم. مثلا فرض کن ساعت 02:40 دقیقه باشه مقدارش می شه 2 ضرب در 60 دقیقه که می شه 120 در نهایت + 40 دقیقه می شه و مقدار 160 رو خواهیم داشت.
پس ما اومدیم همه اینکارها رو کردیم که زمان رو به دقیقه داشته باشیم. حالا کافیه شما زمان شروع رو که به دقیقه است + زمان تقسیم که t هست بکنی و بعد چک کنی که مجموعشون بزرگتر از زمان پایان نشه.
می تونی داخل یه حلقه while بی نهایت بزاری و اگر شرط نقض شد از حلقه بیاد بیرون. زمان ها رو ما تبدیل کردیم به دقیقه و برای اینکه دوباره تبدیلش کنی به فرمت قبلی یعنی ساعت و دقیقه می تونی از این دوتا دستور استفاده کنی:

Math.floor(startTimeSumMinute / 60)
startTimeSumMinute % 60

اولی برای اینکه ساعت رو باهاش دوباره بدست بیاری و دومی هم برای اینکه دقیقه رو بدست بیاری. اینطوری می تونی یه لیستی داشته باشی که کل زمان ها رو باهاش بدست اولی که مثلا اینطوری شده:
14:21 - 14:35 - 14:49 و ...
فقط احتمالا در اخر زمان رند نشه و مثلا اخرش یه 13 دقیقه یا کمتر اضافه بمونه که برای اون می تونی تصمیم بگیری که نوبت بدی یا ندی. مثلا می تونی بگی اگر از نصف یعنی 7 دقیقه به پایین بود نوبت نده و اگر مثلا از 7 دقیقه بیشتر باقی مونده بود نوبت بده.

میلاد ( 74410 تجربه )
4 ماه پیش
تخصص : طراح رابط کاربری - Front-End

اگه میشه مثال عددی بزنید، من که متوجه نشدم صورت مسئله رو تا اگه تونستم حلش کنم.
نام تک تک متغیرهاتون رو بگین و مثال عددی بزنید.
ممنون

سید محمد حسین موسوی ( 17543 تجربه )
4 ماه پیش
تخصص : FullStack Developer

این مسائل بیشتر جنبه الگورتمیک داره و کافیه یکم به روش های حل مسئله توجه کنید. خیلی کار سختی نیست. من یه مثالش رو می زنم ولی شاید بتونید n تا روش دیگه برای اینکار پیدا کنید.
من تو این روش بدون استفاده از توابع مخصوص به تاریخ و زمان اینکارو می کنم. مثلا فرض کن ساعت شروعت 14:21 دقیقه و زمان پایانت هم 19:46 دقیقه هست. فرمتش رو هم اصلا تاریخ در نظر نمی گیریم.
با دستور:

var startTime = "14:21";
var endTime = "19:46";
var t = 14;
var startTimeHour = parseInt(startTime.split(":")[0]);
var startTimeMinutes = parseInt(startTime.split(":")[1]);
var startTimeSumMinute = (startTimeHour * 60 ) + startTimeMinutes;

var endTimeHour = parseInt(endTime.split(":")[0]);
var endTimeMinutes = parseInt(endTime.split(":")[1]);
var endTimeSumMinute = (endTimeHour * 60 ) + endTimeMinutes;

شما تاریخ رو که رشته بود تبدیل به دوتا عدد می کنی که یکیش می شه ساعت و دومی هم می شه دقیقه.
t هم مقدار دقیقه ای هست که شما می خوای بر اساسش زمان رو تقسیم کنی و نوبت بدی که اینجا من 14 دقیقه رو مثال زدم.
تو مرحله بعد ساعت رو ضرب در 60 دقیقه کردم. مثلا فرض کن ساعت 02:40 دقیقه باشه مقدارش می شه 2 ضرب در 60 دقیقه که می شه 120 در نهایت + 40 دقیقه می شه و مقدار 160 رو خواهیم داشت.
پس ما اومدیم همه اینکارها رو کردیم که زمان رو به دقیقه داشته باشیم. حالا کافیه شما زمان شروع رو که به دقیقه است + زمان تقسیم که t هست بکنی و بعد چک کنی که مجموعشون بزرگتر از زمان پایان نشه.
می تونی داخل یه حلقه while بی نهایت بزاری و اگر شرط نقض شد از حلقه بیاد بیرون. زمان ها رو ما تبدیل کردیم به دقیقه و برای اینکه دوباره تبدیلش کنی به فرمت قبلی یعنی ساعت و دقیقه می تونی از این دوتا دستور استفاده کنی:

Math.floor(startTimeSumMinute / 60)
startTimeSumMinute % 60

اولی برای اینکه ساعت رو باهاش دوباره بدست بیاری و دومی هم برای اینکه دقیقه رو بدست بیاری. اینطوری می تونی یه لیستی داشته باشی که کل زمان ها رو باهاش بدست اولی که مثلا اینطوری شده:
14:21 - 14:35 - 14:49 و ...
فقط احتمالا در اخر زمان رند نشه و مثلا اخرش یه 13 دقیقه یا کمتر اضافه بمونه که برای اون می تونی تصمیم بگیری که نوبت بدی یا ندی. مثلا می تونی بگی اگر از نصف یعنی 7 دقیقه به پایین بود نوبت نده و اگر مثلا از 7 دقیقه بیشتر باقی مونده بود نوبت بده.

برای ارسال پاسخ باید وارد سایت شوید