using System;
namespace Dpz.Core.Infrastructure
{
public struct Date:IFormattable
{
public Date(int year,int month,int day)
{
Year = year;
Month = month;
Day = day;
}
public int Year { get; set; }
public int Month { get; set; }
public int Day { get; set; }
public override string ToString()
{
return ToDateTime(this).ToString("yyyy-MM-dd");
}
public string ToString(string? format, IFormatProvider? formatProvider)
{
return ToDateTime(this).ToString(format, formatProvider);
}
public string ToString(string format)
{
return ToDateTime(this).ToString(format);
}
public Date AddDay(int day)
{
var date = ToDateTime(this).AddDays(day);
return new Date { Day = date.Day, Month = date.Month, Year = date.Year };
}
public Date AddMonth(int month)
{
var date = ToDateTime(this).AddMonths(month);
return new Date { Day = date.Day, Month = date.Month, Year = date.Year };
}
public Date AddYear(int year)
{
var date = ToDateTime(this).AddYears(year);
return new Date { Day = date.Day, Month = date.Month, Year = date.Year };
}
public static Date ToDate(DateTime dateTime)
{
return new Date(dateTime.Year, dateTime.Month, dateTime.Day);
}
public static DateTime ToDateTime(Date date)
{
return new DateTime(date.Year, date.Month, date.Day);
}
public override bool Equals(object? obj)
{
if (obj == null) return false;
if (obj is Date date)
{
return date.Year == Year && date.Month == Month && date.Day == Day;
}
return false;
}
public bool Equals(Date other)
{
return Year == other.Year && Month == other.Month && Day == other.Day;
}
public override int GetHashCode()
{
return HashCode.Combine(Year, Month, Day);
}
public static Date operator +(Date lhs, TimeSpan t)
{
var dtLhs = ToDateTime(lhs);
var result = dtLhs + t;
return new Date(result.Year,result.Month,result.Day);
}
public static TimeSpan operator -(Date lhs, Date rhs)
{
var dtLhs = ToDateTime(lhs);
var dtRhs = ToDateTime(rhs);
var result = dtLhs - dtRhs;
return result;
}
public static bool operator ==(Date d1, Date d2) => d1.Equals(d2);
public static bool operator !=(Date d1, Date d2) => !d1.Equals(d2);
public static bool operator <(Date d1, Date d2)
{
var t1 = ToDateTime(d1);
var t2 = ToDateTime(d2);
return t1 < t2;
}
public static bool operator <=(Date d1, Date d2)
{
var t1 = ToDateTime(d1);
var t2 = ToDateTime(d2);
return t1 <= t2;
}
public static bool operator >(Date d1, Date d2)
{
var t1 = ToDateTime(d1);
var t2 = ToDateTime(d2);
return t1 > t2;
}
public static bool operator >=(Date d1, Date d2)
{
var t1 = ToDateTime(d1);
var t2 = ToDateTime(d2);
return t1 >= t2;
}
}
}