РЕДАКТИРОВАТЬ
Просто проверьте, что ответил @Sam Axe:
using System;
public class Program
{
public static void Main()
{
double a = (new DateTime(2020, 9, 30) - new DateTime(1900, 1, 1)).TotalDays;
double b = (new DateTime(1994, 7, 31) - new DateTime(1900, 1, 1)).TotalDays;
Console.WriteLine(( a - 0.8 * b ) / 365.25) ; // 45.08!
}
}
ORIGINAL
У меня есть эта формула MS Excel:
=(AI14 - 80% * MAX(EOMONTH($J$12;12*18),"31/07/1994")) / 365.25
Где AI14 - последний день месяца дня рождения человека в текущем году; EOMONTH ($ J $ 12; 12 * 18) - последний день месяца дня рождения, когда человеку исполнилось 18 лет.
Я создал метод EOMONTH в stati c C# class:
public static class Helper
{
public static DateTime EOMonth(DateTime someDate)
{
return new DateTime(someDate.Year, someDate.Month, DateTime.DaysInMonth(someDate.Year, someDate.Month));
}
// Calculate age
public static int CalculateAge(DateTime dateOfBirth, DateTime refDate)
{
return (int)((refDate - dateOfBirth).TotalDays / 365.25);
}
}
Затем я использую Helper.EOMonth((dateOfBirth).AddYears(age))
, чтобы получить тот же результат от AI14 в MS Excel.
Чтобы получить результат от MAX(EOMONTH($J$12;12*18),"31/07/1994")
, я делаю следующее:
using System;
public class Program
{
public static void Main()
{
DateTime dateOfBirth = new DateTime(1961, 9, 3);
byte age = (byte)Helper.CalculateAge(dateOfBirth, DateTime.Now);
DateTime lastDayBirthdayMonthCurrentYear = Helper.EOMonth((dateOfBirth).AddYears(age));
DateTime dateWhenThePersonWas18 = Helper.EOMonth((dateOfBirth).AddYears(18));
DateTime referenceDate = new DateTime(1994, 7, 31);
DateTime maxDate = new DateTime(Math.Max(referenceDate.Ticks, dateWhenThePersonWas18.Ticks));
Console.WriteLine(lastDayBirthdayMonthCurrentYear);
Console.WriteLine(dateWhenThePersonWas18);
Console.WriteLine(maxDate);
// Putting all together
// It gives an error because I cannot apply '*' to DateTime and double
// double factor = (lastDayBirthdayMonthCurrentYear - 0.8 * maxDate ) / 365.25;
}
}
public static class Helper
{
public static DateTime EOMonth(DateTime data)
{
return new DateTime(data.Year, data.Month, DateTime.DaysInMonth(data.Year, data.Month)); ;
}
// Calculate age
public static int CalculateAge(DateTime dateOfBirth, DateTime refDate)
{
return (int)((refDate - dateOfBirth).TotalDays / 365.25);
}
}
Что меня действительно беспокоит, так это то, что человек, создавший эту формулу, вычисляет% от даты.
Для этого примера ( та же дата рождения) коэффициент, рассчитанный MS Excel, равен 45,08, но я даже не знаю, правильно ли это, потому что я никогда не сталкивался с такой ситуацией, когда человеку нужно было рассчитать процент от даты. Что это вообще значит?