Files
BeWoPlaner/Shared/Core/DateTimeUtils.cs
2026-06-18 11:05:29 +02:00

221 lines
6.7 KiB
C#

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 static string GetTwoDateString(this DateTime date1, DateTime date2)
{
if (date1.Date.Equals(date2.Date))
{
return date2 > date1 ? $"{date1:dd.MM.yyyy HH:mm} - {date2:HH:mm}" : $"{date2:dd.MM.yyyy HH:mm} - {date1:HH:mm}";
}
return date2 > date1 ? $"{date1:dd.MM.yyyy HH:mm} - {date2:dd.MM.yyyy HH:mm}" : $"{date2:dd.MM.yyyy HH:mm} - {date1:dd.MM.yyyy HH:mm}";
}
public static bool IsOverlapping(DateTime? startDate1, DateTime? endDate1, DateTime? startDate2, DateTime? endDate2)
{
var start1 = startDate1 ?? DateTime.MinValue;
var end1 = endDate1 ?? DateTime.MaxValue;
var start2 = startDate2 ?? DateTime.MinValue;
var end2 = endDate2 ?? DateTime.MaxValue;
if (start1 <= end2 && end1 >= start2)
{
return true;
}
return false;
}
}
public class AnzahlMonate
{
public decimal AnzahlMonateGesamt { get; set; }
public int GanzeMonate { get; set; }
public decimal RestTageAnfang { get; set; }
public decimal RestTageEnde { get; set; }
}
}