private static IAge CreateAge(AgeUnits unit, int first, int second) { switch (unit) { case AgeUnits.Year: { var age = new Age(first, InvalidAge, InvalidAge, InvalidAge, AgeUnits.Year); return(age); } case AgeUnits.YearAndMonth: { var age = new Age(first, second, InvalidAge, InvalidAge, AgeUnits.YearAndMonth); return(age); } case AgeUnits.MonthAndWeek: { var age = new Age(InvalidAge, first, second, InvalidAge, AgeUnits.MonthAndWeek); return(age); } case AgeUnits.WeekAndDay: { var age = new Age(InvalidAge, InvalidAge, first, second, AgeUnits.WeekAndDay); return(age); } } return(null); }
public void AgeWithUnits_ShouldSupportCalculatingAgeInSpecificUnits(AgeUnits units) { //Arrange var date = DateTime.Now; //Act var age = date.Age(units); //Assert age.GetType().ShouldBe(typeof(int)); }
/// <summary> /// Calculate age of object in certain units. /// </summary> /// <param name="startDate">Start date.</param> /// <param name="units">Units of age measurement.</param> /// <returns>Age in specific units.</returns> /// <exception cref="ArgumentOutOfRangeException"></exception> public static int Age(this DateTime startDate, AgeUnits units) { if (DateTime.Now < startDate) { throw new ArgumentOutOfRangeException(nameof(startDate)); } var zeroTime = new DateTime(1, 1, 1); var span = zeroTime + (DateTime.Now - startDate); return(units switch { AgeUnits.Year => span.Year - 1, AgeUnits.Month => span.Month - 1, AgeUnits.Week => span.Day % 7 - 1, AgeUnits.Day => span.Day - 1, AgeUnits.Hour => span.Hour - 1, AgeUnits.Minute => span.Minute - 1, AgeUnits.Second => span.Second - 1, _ => throw new ArgumentException(nameof(startDate)), });
public Age(int value, AgeUnits ageUnits) { Value = value; Units = ageUnits; }