بدست آوردن تفاضل دو مجموعه پیوسته
یک لیست از یک بازه زمانی (مطابق شکل زیر) (تاریخ و ساعت) در دیتابیس دارم که بیانگر آن است که تجهیزات در این فاصله زمانی دچار خرابی شده و متوقف شدند و پس از انجام تعمیرات مجدداً راه اندازی شدند. روز کاری که شامل دو شیفت است از ساعت 7 صبح شروع و تا ساعت 1 صبح طول میکشد.
حالا من میخواهم مدت زمانی که هر دستگاه جهت تعمیرات متوقف بوده را محاسبه کنم اما این مدت نباید شامل زمان 1 صبح تا 7 صبح (زمان خاموشی تجهیزات) و ساعت 16 تا 17 (زمان تغییر شیفت) باشد.
مثلا اگر یک دستگاه در محدوده زمانی 14:00 1401/09/02 الی 08:00 1401/09/03 متوقف باشد کل زمان توقف 18 ساعت است اما باید 7 ساعت از آن کم شود (یک ساعت تغییر شیفت و 6 ساعت زمان خاموشی) و مدت توقف جهت تعمیرات برابراست با 11 ساعت.
این گونه موارد در ریاضی برابر است با تفاضل دو مجموعه.آیا در سی شارپ برای حل این گونه مسایل راحل یا تابعی هست؟
پاسخ هوش مصنوعی
بله، در C# می توانید با استفاده از ترکیب کلاس های زمان و تاریخ (مانند DateTime
) و توابع منطقی، مدت زمان توقف دستگاه را محاسبه کنید. برای این کار می توانید مدت زمان را محاسبه کرده و زمان هایی که نباید مورد شمارش قرار گیرد را از آن کسر کنید.
در اینجا یک نمونه تابع برای محاسبه مدت زمان تعمیرات به صورت زیر ارایه شده است:
public TimeSpan CalculateDowntime(DateTime startTime, DateTime endTime)
{
// زمان خاموشی: 1 صبح تا 7 صبح
TimeSpan shutdownStart = new TimeSpan(1, 0, 0);
TimeSpan shutdownEnd = new TimeSpan(7, 0, 0);
// زمان تغییر شیفت: 16 تا 17
TimeSpan shiftChangeStart = new TimeSpan(16, 0, 0);
TimeSpan shiftChangeEnd = new TimeSpan(17, 0, 0);
TimeSpan totalDowntime = endTime - startTime;
// محاسبه زمان هایی که نباید لحاظ شوند
TimeSpan totalExclusions = TimeSpan.Zero;
// بررسی زمان خاموشی
if (startTime.TimeOfDay < shutdownEnd && endTime.TimeOfDay > shutdownStart)
{
TimeSpan exclusionTime = TimeSpan.FromHours(0);
if (startTime.TimeOfDay < shutdownEnd)
exclusionTime += shutdownEnd - startTime.TimeOfDay;
if (endTime.TimeOfDay > shutdownStart)
exclusionTime += endTime.TimeOfDay - shutdownStart;
totalExclusions += exclusionTime;
}
// بررسی زمان تغییر شیفت
if (startTime.TimeOfDay < shiftChangeEnd && endTime.TimeOfDay > shiftChangeStart)
{
TimeSpan exclusionTime = TimeSpan.FromHours(0);
if (startTime.TimeOfDay < shiftChangeEnd)
exclusionTime += shiftChangeEnd - startTime.TimeOfDay;
if (endTime.TimeOfDay > shiftChangeStart)
exclusionTime += endTime.TimeOfDay - shiftChangeStart;
totalExclusions += exclusionTime;
}
// محاسبه زمان نهایی با کسر زمان های مستثنی
TimeSpan finalDowntime = totalDowntime - totalExclusions;
return finalDowntime;
}
شما می توانید از این تابع با مشخص کردن زمان شروع و پایان مدت زمان توقف دستگاه، استفاده کنید و مدت زمان واقعی تعمیرات را دریافت نمایید.
- آموزش استفاده از پلاگین گردونه شانس در Asp.net core به همراه سورس
- نمایش متن به صورت فرمت شده در CkEditor
- آموزش استفاده از SignalR در Asp.net Core با مثال عملی
- ادغام چند گزارش استیمول سافت بصورت پی دی اف در یک فایل
- نحوه تغییر استایل کامپوننت select2 چگونه است ؟
- چگونه امنیت پروژه را در Asp.net Core افزایش دهیم ؟
- ارسال پارامتر در دستور window.open جی کویری
- ارسال پارامتر از طریق جاوااسکریپت با کلیک روی تگ a
- خطای 500 زمان اجرا شدن پروژه روی هاست
- کویری نویسی در استیمول سافت جهت فیلتر اطلاعات
- مشکل تاریخ شمسی در سی شارپ
- نمایش گزارش stimulsoft روی کلاینت
- تفاوت های سی شارپ 8 با نسخه های قبلی چیه؟
- انتخاب چند سطر دلخواه توسط چک باکس در DataGrid و محاسبه جمع سطرهای انتخاب شده
- نمایش نوتیفکیشن در سی شارپ
- ارسال پارامتر از سی شارپ به استیمول سافت
- عدم نمایش عکس در دیتاگرید ویو در wpf
- Library Animation برای کنترلهای WPF
- مشکل در تغییر مقدار Text کنترل RibbonBar در کامپوننت DevExpress
- قرار دادن مقادیر ارسالی یک ستون از جدول به صورت سطری در استیمول