namespace Domain.Helpers { public static class RelativeTimeHelper { public static List<Threshold> Thresholds = new() { new Threshold((d) => d.AddMinutes(-1), "{0} seconden", x => x.Seconds), new Threshold((d) => d.AddMinutes(-2), "één minuut ", x => x.Minutes), new Threshold((d) => d.AddMinutes(-60), "{0} minuten", x => x.Minutes), new Threshold((d) => d.AddMinutes(-120), "één uur", x => x.Hours), new Threshold((d) => d.AddDays(-1), "{0} uur", x => x.Hours), new Threshold((d) => d.AddDays(-2), "gisteren", x => x.Days), new Threshold((d) => d.AddMonths(-1), "{0} dagen", x => x.Days), new Threshold((d) => d.AddMonths(-2), "{0} maand", x => x.Months), new Threshold((d) => d.AddYears(-1), "{0} maanden", x => x.Months), new Threshold((d) => DateTime.MaxValue, "{0} jaar", x => x.Years) }; public static string RelativeDateTime(DateTime theDate) => FriendlyTimespan(theDate); public static string FriendlyTimespan(DateTime date, DateTime? now = null) { var current = now ?? DateTime.Now; var threshold = Thresholds.OrderByDescending(x => x.Condition(current)).FirstOrDefault(x => x.Condition(current) < date) ?? Thresholds.Last(); var tresholdRelativeValues = TresholdRelativeValues.Get(date, current); return string.Format(threshold.Description, threshold.Converter(tresholdRelativeValues)); } } public record TresholdRelativeValues(int Seconds, int Minutes, int Hours, int Days, int Months, int Years) { internal static TresholdRelativeValues Get(DateTime date, DateTime now) { var d = now - date; (var totalYears, var totalMonths )= GetYearAndMonthDifference(date, now); //= GetMonthDifference(date, now); return new TresholdRelativeValues((int)Math.Ceiling(d.TotalSeconds), (int)Math.Ceiling(d.TotalMinutes), (int)Math.Ceiling(d.TotalHours), (int)Math.Ceiling(d.TotalDays), totalMonths, totalYears); } static (int Years, int Months) GetYearAndMonthDifference(DateTime start, DateTime end) { // Bereken het aantal jaren en maanden verschil int yearsDifference = end.Year - start.Year; int monthsDifference = end.Month - start.Month; // Als de maand van de einddatum vóór de maand van de startdatum valt, betekent dat dat er nog geen volledig jaar is verstreken if (monthsDifference < 0) { yearsDifference--; monthsDifference += 12; // Correctie voor negatieve maandverschillen } // Controleer of de einddatum vóór de dag van de startdatum in de huidige maand valt if (end.Day < start.Day) { monthsDifference--; // Als het maandverschil nu negatief is, trek dan ook één jaar af en corrigeer het maandverschil if (monthsDifference < 0) { yearsDifference--; monthsDifference += 12; } } return (yearsDifference, monthsDifference); } } public class Threshold { public Threshold(Func<DateTime, DateTime> condition, string description, Func<TresholdRelativeValues, int> converter) { Condition = condition; Description = description; Converter = converter; } public Func<DateTime, DateTime> Condition { get; } public string Description { get; } public Func<TresholdRelativeValues, int> Converter { get; } } }
429100cookie-checkC# calculate / display relative time