207 lines
6.2 KiB
C#
207 lines
6.2 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 class AnzahlMonate
|
|
{
|
|
public decimal AnzahlMonateGesamt { get; set; }
|
|
public int GanzeMonate { get; set; }
|
|
public decimal RestTageAnfang { get; set; }
|
|
public decimal RestTageEnde { get; set; }
|
|
}
|
|
}
|