using System; using BS.Shared.Extensions; using DevExpress.XtraScheduler; namespace BS.Shared.Core { public static class DateTimeUtils { public static AnzahlMonate GetTotalMonths(DateTime start, DateTime end) { int restTageStart = 0; int restTageEnd = 0; DateTime startDt = start; DateTime endDt = end; if (startDt.Day > 1) { var endMonat = new DateTime(startDt.Year, startDt.Month, 1).AddMonths(1).AddDays(-1); if (endDt < endMonat) { endMonat = endDt; } restTageStart = endMonat.Subtract(startDt).Days + 1; startDt = endMonat.AddDays(1); } if (startDt <= endDt && endDt.AddDays(1).Day != 1) { var startMonat = new DateTime(endDt.Year, endDt.Month, 1); restTageEnd += endDt.Subtract(startMonat).Days + 1; endDt = startMonat; } int fullMonths = 0; while (startDt < endDt) { fullMonths++; startDt = startDt.AddMonths(1); } decimal monthsTotal = fullMonths; if (restTageStart != 0) { monthsTotal += restTageStart / (decimal)DateTime.DaysInMonth(start.Date.Year, start.Date.Month); } if (restTageEnd != 0) { monthsTotal += restTageEnd / (decimal)DateTime.DaysInMonth(end.Date.Year, end.Date.Month); } var am = new AnzahlMonate(); am.GanzeMonate = fullMonths; am.RestTageAnfang = restTageStart; am.RestTageEnde = restTageEnd; am.AnzahlMonateGesamt = monthsTotal; return am; } public static WeekDays GetWeekDays(int number) { switch (number) { case 1: return WeekDays.Sunday; case 2: return WeekDays.Monday; case 4: return WeekDays.Tuesday; case 8: return WeekDays.Wednesday; case 16: return WeekDays.Thursday; case 32: return WeekDays.Friday; case 62: return WeekDays.WorkDays; case 64: return WeekDays.Saturday; case 65: return WeekDays.WeekendDays; case 127: return WeekDays.EveryDay; default: return WeekDays.Monday; } } public static DayOfWeek ConvertWeekDaysToDayOfWeek(WeekDays weekDays) { try { if((int) weekDays <= 64) { return (DayOfWeek) Convert.ToString((int) weekDays, 2).Length - 1; } } catch(Exception) { return DayOfWeek.Sunday; } return DayOfWeek.Sunday; } public static int GetNumberOfWeekEndDaysInBetween(DateTime pStart, DateTime pEnd) { var numberOfWeekEndDays = 0; var currentDate = pStart.Date; var b = pEnd.Date; while (currentDate <= b) { if (currentDate.DayOfWeek == DayOfWeek.Saturday || currentDate.DayOfWeek == DayOfWeek.Sunday) { numberOfWeekEndDays++; } currentDate = currentDate.AddDays(1); } return numberOfWeekEndDays; } public static DateTime GetNthDayOfWeekInMonth(DateTime date, int number, DayOfWeek dayOfWeek) { if (number <= 0) { throw new ArgumentOutOfRangeException(); } // Letzter Wochentag im Monat if (number > 3) { return GetNthDayOfWeekInMonth(date.AddMonths(1), 1, dayOfWeek).AddDays(-7); } var firstDayOfMonth = new DateTime(date.Year, date.Month, 1); var counter = 1; do { if (firstDayOfMonth.DayOfWeek == dayOfWeek) { if (counter == number) { return firstDayOfMonth; } counter++; } firstDayOfMonth = firstDayOfMonth.AddDays(1); } while (counter <= number); return firstDayOfMonth; } public static DayOfWeek ConvertAppointmentDayOfWeekToDayOfWeek(AppointmentDayOfWeek appointmentDayOfWeek) { return (DayOfWeek) (((int) appointmentDayOfWeek + 1) % 7); } public static ArbeitszeitEintragDateTimeObject GetAssistanceTimeComparisonDateTime(string uhrzeitVon, string uhrzeitBis, DateTime date) { var day = date.GetShortDateTime(); var isStartSuccessfullyParsed = DateTime.TryParse($"{day:dd.MM.yyyy} {uhrzeitVon}", out var start); var isEndSuccessfullyParsed = DateTime.TryParse($"{day:dd.MM.yyyy} {uhrzeitBis}", out var end); if (isStartSuccessfullyParsed && isEndSuccessfullyParsed) { return new ArbeitszeitEintragDateTimeObject(start, end); } return new ArbeitszeitEintragDateTimeObject(start, end); } } public class AnzahlMonate { public decimal AnzahlMonateGesamt { get; set; } public int GanzeMonate { get; set; } public decimal RestTageAnfang { get; set; } public decimal RestTageEnde { get; set; } } }