105 lines
3.4 KiB
C#
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;
|
|||
|
}
|
|||
|
}
|
|||
|
|
|||
|
}
|