CEL_Payroll/Payroll.BO/Basic/DateDifferenceInYearsMonthDays.cs
2024-09-17 14:30:13 +06:00

105 lines
3.4 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Payroll.BO
{
public struct DateDifferenceInYearsMonthDays
{
private readonly int years;
private readonly int months;
private readonly int days;
private readonly int hours;
private readonly int minutes;
private readonly int seconds;
private readonly int milliseconds;
public DateDifferenceInYearsMonthDays(int years, int months, int days, int hours, int minutes, int seconds, int milliseconds)
{
this.years = years;
this.months = months;
this.days = days;
this.hours = hours;
this.minutes = minutes;
this.seconds = seconds;
this.milliseconds = milliseconds;
}
public int Years { get { return years; } }
public int Months { get { return months; } }
public int Days { get { return days; } }
public int Hours { get { return hours; } }
public int Minutes { get { return minutes; } }
public int Seconds { get { return seconds; } }
public int Milliseconds { get { return milliseconds; } }
enum Phase { Years, Months, Days, Done }
public static DateDifferenceInYearsMonthDays CompareDates(DateTime date1, DateTime date2)
{
if (date2 < date1)
{
DateTime sub = date1;
date1 = date2;
date2 = sub;
}
DateTime current = date2;
int years = 0;
int months = 0;
int days = 0;
Phase phase = Phase.Years;
DateDifferenceInYearsMonthDays span = new DateDifferenceInYearsMonthDays();
while (phase != Phase.Done)
{
switch (phase)
{
case Phase.Years:
if (current.Year == 1 || current.AddYears(-1) < date1)
{
phase = Phase.Months;
}
else
{
current = current.AddYears(-1);
years++;
}
break;
case Phase.Months:
if (current.AddMonths(-1) < date1)
{
phase = Phase.Days;
}
else
{
current = current.AddMonths(-1);
months++;
}
break;
case Phase.Days:
if (current.AddDays(-1) < date1)
{
days++;
TimeSpan timespan = current - date1;
span = new DateDifferenceInYearsMonthDays(years, months, days, timespan.Hours, timespan.Minutes, timespan.Seconds, timespan.Milliseconds);
phase = Phase.Done;
}
else
{
current = current.AddDays(-1);
days++;
}
break;
}
}
return span;
}
}
}