{"id":2692,"date":"2019-10-23T14:04:54","date_gmt":"2019-10-23T13:04:54","guid":{"rendered":"https:\/\/solidt.eu\/site\/?p=2692"},"modified":"2026-01-08T12:51:23","modified_gmt":"2026-01-08T11:51:23","slug":"c-datetime-helpers","status":"publish","type":"post","link":"https:\/\/solidt.eu\/site\/c-datetime-helpers\/","title":{"rendered":"C# DateTime helpers"},"content":{"rendered":"\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">public static class DateTimeHelper\n{\n    public static DateTime? EnsureUtcDefaultUtc(DateTime? date) => EnsureUtc(date, DateTimeKind.Utc);\n    \n    public static DateTime? EnsureUtcDefaultLocal(DateTime? date)=> EnsureUtc(date, DateTimeKind.Local);\n    \n    public static DateTime? EnsureUtc(DateTime? date, DateTimeKind unspecifiedType)\n    {\n        if (!date.HasValue) return null;\n        var dt = date.Value;\n        return dt.Kind switch\n        {\n            DateTimeKind.Utc => dt,\n            DateTimeKind.Local => dt.ToUniversalTime(),\n            DateTimeKind.Unspecified => DateTime.SpecifyKind(dt, unspecifiedType).ToUniversalTime(),\n            _ => DateTime.SpecifyKind(dt, unspecifiedType).ToUniversalTime()\n        };\n    }\n\n    public static int ISO8601WeekNumber(DateTime fromDate)\n    {\n        \/\/ Get jan 1st of the year\n        var startOfYear = fromDate.AddDays(-fromDate.Day + 1).AddMonths(-fromDate.Month + 1);\n        \/\/ Get dec 31st of the year\n        var endOfYear = startOfYear.AddYears(1).AddDays(-1);\n        \/\/ ISO 8601 weeks start with **Monday**\n        \/\/ The first week of a year includes the first Thursday \n        \/\/ DayOfWeek returns 0 for sunday up to 6 for saterday\n        int[] iso8601Correction = { 6, 7, 8, 9, 10, 4, 5 };\n        var nds = fromDate.Subtract(startOfYear).Days + iso8601Correction[(int)startOfYear.DayOfWeek];\n        var wk = nds \/ 7;\n        switch (wk)\n        {\n            case 0:\n                \/\/ Return weeknumber of dec 31st of the previous year\n                return ISO8601WeekNumber(startOfYear.AddDays(-1));\n            case 53:\n                \/\/ If dec 31st falls before thursday it is week 01 of next year\n                if (endOfYear.DayOfWeek &lt; DayOfWeek.Thursday)\n                    return 1;\n                else\n                    return wk;\n            default: return wk;\n        }\n    }\n\n    public static YearWeek GetWeekFromDate(DateTime date, bool includeSunday = false)\n    {\n        if (includeSunday &amp;&amp; date.DayOfWeek == DayOfWeek.Sunday)\n            date = date.AddDays(1);\n        var week = ISO8601WeekNumber(date);\n        var year = GetYear(date, week);\n        return YearWeek.FromInts(year, week);\n    }\n\n    private static int GetYear(DateTime date, int week)\n    {\n        if (week &lt;= 1)\n            return date.AddMonths(1).Year;\n        else if (week >= 52)\n            return date.AddMonths(-1).Year;\n        return date.Year;\n    }\n\n    public static DateTime GetDateFromISO8601Week(YearWeek week) => GetDateFromISO8601Week(week.Year, week.Week);\n\n    public static DateTime GetDateFromISO8601Week(int year, int week)\n    {\n        var dayOfYear = (week - 1) * 7;\n        var result = new DateTime(year, 1, 1).AddDays(dayOfYear);\n        var dayOfWeek = (int)result.DayOfWeek;\n        if (dayOfWeek &lt;= (int)DayOfWeek.Thursday)\n        {\n            result = result.AddDays((-dayOfWeek) + 1);\n        }\n        else\n        {\n            result = result.AddDays(8 - dayOfWeek);\n        }\n        return result;\n    }\n\n    public static int YearWeekCount(int year)\n    {\n        var week = ISO8601WeekNumber(new DateTime(year + 1, 1, 1));\n        if (week == 53) return 53;\n        return 52;\n    }\n\n    public static IEnumerable&lt;YearWeek> EachWeek(YearWeek startWeek, YearWeek endWeek)\n    {\n        var currentWeek = startWeek.Copy();\n        while (currentWeek.AsInt() &lt; endWeek.AsInt())\n        {\n            yield return currentWeek;\n            currentWeek = GetNextWeek(currentWeek);\n        }\n    }\n\n    private static YearWeek GetNextWeek(YearWeek currentWeek)\n    {\n        var weeksInYear = YearWeekCount(currentWeek.Year);\n        var nextWeek = YearWeek.FromInts(currentWeek.Year, currentWeek.Week + 1);\n        if (nextWeek.Week > weeksInYear)\n            return YearWeek.FromInts(currentWeek.Year + 1, 1);\n        return nextWeek;\n    }\n\n    public static YearWeek AddWeeks(YearWeek yw, int numberOfWeeks)\n    {\n        if (numberOfWeeks == 0) return yw;\n\n        var year = yw.Year;\n        var week = yw.Week + numberOfWeeks;\n\n        while (week &lt; 1)\n        {\n            year--;\n            week += YearWeekCount(year);\n        }\n\n        while (week > YearWeekCount(year))\n        {\n            week -= YearWeekCount(year);\n            year++;\n        }\n        return YearWeek.FromInts(year, week);\n    }\n\n    public static int GetQuarterForMonh(int month)\n    {\n        if (month &lt; 1 || month > 12)\n            throw new ArgumentOutOfRangeException(nameof(month), \"Month must be between 1 and 12.\");\n        return (month - 1) \/ 3 + 1;\n    }\n\n    public static DateTime AddQuarters(DateTime date, int numberOfQuarters)\n    {\n        var dateCounter = GetQuarterDate(date);\n        return dateCounter.AddMonths(numberOfQuarters * 3);\n    }\n    public static DateTime GetQuarterDate(DateTime date) => new DateTime(date.Year, GetQuarterMonthFromMonth(date.Month), 1);\n\n    public static int GetQuarterMonthFromMonth(int month) => ((month - 1) \/ 3) * 3 + 1;\n\n    public static IEnumerable&lt;DateTime> EachQuarter(DateTime startTime, DateTime endTime)\n    {\n        var dateCounter = GetQuarterDate(startTime);\n        var endDateTarget = GetQuarterDate(endTime); ;\n\n        while (dateCounter &lt;= endDateTarget)\n        {\n            yield return dateCounter;\n            dateCounter = dateCounter.AddMonths(3);\n        }\n    }\n\n\n    public static string GetYearKey(DateTime date) => $\"{date.Year}\";\n    public static string GetMonthKey(DateTime date) => GetMonthKey(date.Year, date.Month);\n    public static string GetMonthKey(int year, int month) => $\"{year}-{month:D2}\";\n    public static string GetQuarterKey(DateTime date) => $\"{date.Year}-Q{GetQuarterForMonh(date.Month):D1}\";\n\n    public static IEnumerable&lt;DateTime> EachMonth(DateTime startTime, DateTime endTime)\n    {\n        var dateCounter = new DateTime(startTime.Year, startTime.Month, 1);\n        var endDateTarget = new DateTime(endTime.Year, endTime.Month, 1);\n        while (dateCounter &lt;= endDateTarget)\n        {\n            yield return dateCounter;\n            dateCounter = dateCounter.AddMonths(1);\n        }\n    }\n\n    public static IEnumerable&lt;DateTime> EachYear(DateTime startTime, DateTime endTime)\n    {\n        var dateCounter = new DateTime(startTime.Year, 1, 1);\n        var endDateTarget = new DateTime(endTime.Year, 1, 1);\n        while (dateCounter &lt;= endDateTarget)\n        {\n            yield return dateCounter;\n            dateCounter = dateCounter.AddYears(1);\n        }\n    }\n}\n\npublic class YearWeek : IComparable\n{\n    public YearWeek(int year, int week)\n    {\n        Year = year;\n        Week = Limit(week, 1, 53);\n    }\n    public int Year { get; private set; }\n    public int Week { get; private set; }\n\n    public static YearWeek FromInts(int year, int week) => new(year, week);\n    public string Key => ToString();\n\n    public int CompareTo(object o) => InternalCompareTo(o as YearWeek);\n    public int CompareTo(YearWeek other) => InternalCompareTo(other);\n\n    private int InternalCompareTo(YearWeek o) => AsInt().CompareTo(o?.AsInt() ?? 0);\n\n    private static int Limit(int val, int min, int max) => Math.Max(min, Math.Min(max, val));\n\n    public override bool Equals(object obj)\n    {\n        if (obj == null || obj is not YearWeek yw) return false;\n        return yw.AsInt() == AsInt();\n    }\n\n    public override int GetHashCode() => AsInt();\n    public int AsInt() => (Year * 100) + Week;\n    public override string ToString() => $\"{Year}-{Week:D2}\";\n    public YearWeek Copy() => (YearWeek)MemberwiseClone();\n\n    public static YearWeek FromInt(int? yearWeekInt)\n    {\n        if (yearWeekInt == null) return null;\n        var year = yearWeekInt.Value \/ 100;\n        var week = yearWeekInt.Value % 100;\n        return new YearWeek(year, week);\n    }\n\n    \/\/\tMust be overloaded in pairs as follows: == and !=, &lt; and >, &lt;= and >=.\n    public static bool operator ==(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) == (obj2?.AsInt() ?? 0);\n    public static bool operator !=(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) != (obj2?.AsInt() ?? 0);\n    public static bool operator &lt;(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) &lt; (obj2?.AsInt() ?? 0);\n    public static bool operator >(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) > (obj2?.AsInt() ?? 0);\n    public static bool operator &lt;=(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) &lt;= (obj2?.AsInt() ?? 0);\n    public static bool operator >=(YearWeek obj1, YearWeek obj2) => (obj1?.AsInt() ?? 0) >= (obj2?.AsInt() ?? 0);\n}<\/pre><\/div>\n\n\n\n<h2 class=\"wp-block-heading\">Older<\/h2>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">using System;\nusing System.Collections.Generic;\nusing System.Linq;\n\nnamespace Helpers\n{\n    public static class DateTimeHelper\n    {\n        public static DateTime? GetDateTimeFromInput(string dateTimeStr, DateTime? def = null)\n        {\n            if (string.IsNullOrWhiteSpace(dateTimeStr))\n                return def;\n            if (DateTime.TryParse(dateTimeStr.Trim(), CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out var dateTime))\n                return dateTime;\n            return def;\n        }\n\n\n        public static TimeSpan? GetTimeFromInput(string timeStr, TimeSpan? def = null)\n        {\n            if (string.IsNullOrWhiteSpace(timeStr))\n                return def;\n            if (TimeSpan.TryParse(timeStr.Trim(), CultureInfo.InvariantCulture, out var time))\n                return time;\n            return def;\n        }\n\n        public static DateTime? GetCombinedDateTime(DateTime? date, TimeSpan? time)\n        {\n            if (date == null) return null;\n            var d = date.Value.Date;\n            if (time == null) return d;\n            return d.Add(time.Value);\n        }        \n        \n        public static int ISO8601WeekNumber2(DateTime fromDate)\n        {\n            var culture = new System.Globalization.CultureInfo(\"nl-NL\"); \n            var format = culture.DateTimeFormat; \n            var weekOfYear = culture.Calendar.GetWeekOfYear(fromDate, format.CalendarWeekRule, format.FirstDayOfWeek);\n        }\n\n\n        public static int ISO8601WeekNumber(DateTime fromDate)\n        {\n            \/\/ Get jan 1st of the year\n            DateTime startOfYear = fromDate.AddDays(-fromDate.Day + 1).AddMonths(-fromDate.Month + 1);\n            \/\/ Get dec 31st of the year\n            DateTime endOfYear = startOfYear.AddYears(1).AddDays(-1);\n            \/\/ ISO 8601 weeks start with Monday \n            \/\/ The first week of a year includes the first Thursday \n            \/\/ DayOfWeek returns 0 for sunday up to 6 for saterday\n            int[] iso8601Correction = { 6, 7, 8, 9, 10, 4, 5 };\n            int nds = fromDate.Subtract(startOfYear).Days + iso8601Correction[(int)startOfYear.DayOfWeek];\n            int wk = nds \/ 7;\n            switch (wk)\n            {\n                case 0:\n                    \/\/ Return weeknumber of dec 31st of the previous year\n                    return ISO8601WeekNumber(startOfYear.AddDays(-1));\n                case 53:\n                    \/\/ If dec 31st falls before thursday it is week 01 of next year\n                    if (endOfYear.DayOfWeek &lt; DayOfWeek.Thursday)\n                        return 1;\n                    else\n                        return wk;\n                default: return wk;\n            }\n        }\n\n        public static YearWeek GetWeekFromDate(DateTime date)\n        {\n            return new YearWeek\n            {\n                Year = date.Year,\n                Week = ISO8601WeekNumber(date)\n            };\n        }\n\n        public static DateTime GetDateFromISO8601Week(YearWeek week)\n        {\n            return GetDateFromISO8601Week(week.Year, week.Week);\n        }\n\n        public static DateTime GetDateFromISO8601Week(int year, int week)\n        {\n            var dayOfYear = (week - 1) * 7;\n            var result = new DateTime(year, 1, 1).AddDays(dayOfYear);\n            var dayOfWeek = (int)result.DayOfWeek;\n            if (dayOfWeek &lt;= (int)DayOfWeek.Thursday)\n            {\n                result = result.AddDays((-dayOfWeek) + 1);\n            }\n            else\n            {\n                result = result.AddDays(8 - dayOfWeek);\n            }\n            return result;\n        }\n\n        public static Range&lt;DateTime> GetDateRangeFromISO8601Week(YearWeek week)\n        {\n            return GetDateRangeFromISO8601Week(week.Year, week.Week);\n        }\n\n        public static Range&lt;DateTime> GetDateRangeFromISO8601Week(int year, int week)\n        {\n            var range = new Range&lt;DateTime>();\n            range.Minimum = GetDateFromISO8601Week(year, week);\n            range.Maximum = range.Minimum.AddDays(6);\n            return range;\n        }\n\n\n        public static List&lt;DateTime> GetlistOfWeekDays(DateTime startDateParam)\n        {\n            DateTime startDate = startDateParam;\/\/ startDateParam.AddDays(-(((dow - (int)DayOfWeek.Monday) + 7) % 7));\n            while (startDate.DayOfWeek != DayOfWeek.Monday)\n            {\n                startDate = startDate.AddDays(-1);\n            }\n\n            var endDate = startDate.AddDays(7);\n\n            \/\/the number of days in our range of dates\n            var numDays = (int)((endDate - startDate).TotalDays);\n            List&lt;DateTime> myDates = Enumerable\n                       \/\/creates an IEnumerable of ints from 0 to numDays\n                       .Range(0, numDays)\n                       \/\/now for each of those numbers (0..numDays), \n                       \/\/select startDate plus x number of days\n                       .Select(x => startDate.AddDays(x))\n                       \/\/and make a list\n                       .ToList();\n\n            return myDates;\n        }\n\n        public static DateTime FirstDateOfWeek(int year, int weekOfYear, System.Globalization.CultureInfo ci)\n        {\n            DateTime jan1 = new DateTime(year, 1, 1);\n            int daysOffset = (int)ci.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek;\n            DateTime firstWeekDay = jan1.AddDays(daysOffset);\n            int firstWeek = ci.Calendar.GetWeekOfYear(jan1, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek);\n            if (firstWeek &lt;= 1 || firstWeek > 50)\n            {\n                weekOfYear -= 1;\n            }\n            return firstWeekDay.AddDays(weekOfYear * 7);\n        }\n        public static DateTime LastDateOfWeek(int year, int weekOfYear, System.Globalization.CultureInfo ci)\n        {\n            DateTime jan1 = new DateTime(year, 1, 1);\n            int daysOffset = (int)ci.DateTimeFormat.FirstDayOfWeek - (int)jan1.DayOfWeek;\n            DateTime firstWeekDay = jan1.AddDays(daysOffset);\n            int firstWeek = ci.Calendar.GetWeekOfYear(jan1, ci.DateTimeFormat.CalendarWeekRule, ci.DateTimeFormat.FirstDayOfWeek);\n            if (firstWeek &lt;= 1 || firstWeek > 50)\n            {\n                weekOfYear -= 1;\n            }\n            return firstWeekDay.AddDays((weekOfYear + 1 * 7) - 1);\n        }\n\n        public static IEnumerable&lt;DateTime> EachDay(DateTime start, DateTime end)\n        {\n            \/\/ Remove time info from start date (we only care about day). \n            DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);\n            while (currentDay &lt;= end)\n            {\n                yield return currentDay;\n                currentDay = currentDay.AddDays(1);\n            }\n        }\n\n        public static IEnumerable&lt;Tuple&lt;int, int, int>> EachDayOfMonth(DateTime start, DateTime end)\n        {\n            \/\/ Remove time info from start date (we only care about day). \n            DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);\n            while (currentDay &lt;= end)\n            {\n                yield return new Tuple&lt;int, int, int>(currentDay.Year, currentDay.Month, currentDay.Day);\n                currentDay = currentDay.AddDays(1);\n            }\n        }\n\n        public static IEnumerable&lt;Tuple&lt;int, int>> EachMonth(DateTime start, DateTime end)\n        {\n            \/\/ Remove time info from start date (we only care about day). \n            var firstMonth = new DateTime(start.Year, start.Month, 1);\n            var currentMonth = firstMonth;\n            while (currentMonth &lt;= end)\n            {\n                yield return new Tuple&lt;int, int>(currentMonth.Year, currentMonth.Month);\n                currentMonth = currentMonth.AddMonths(1);\n            }\n        }\n\n        public static IEnumerable&lt;YearWeek> EachWeek(YearWeek yearWeek, int numberOfWeeks)\n        {\n            var firstDateOfWeek = GetDateFromISO8601Week(yearWeek.Year, yearWeek.Week);\n            return EachWeek(firstDateOfWeek, numberOfWeeks);\n        }\n\n        public static IEnumerable&lt;YearWeek> EachWeek(DateTime start, int numberOfWeeks)\n        {\n            \/\/ Remove time info from start date (we only care about day). \n            DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);\n            int lastWeek = 0;\n            int weekCounter = 0;\n            while (weekCounter &lt; numberOfWeeks)\n            {\n                var week = DateTimeHelper.ISO8601WeekNumber(currentDay);\n                var year = currentDay.Year;\n                if (week == 1)\n                {\n                    year = currentDay.AddMonths(1).Year;\n                }\n                else if (week >= 52)\n                {\n                    year = currentDay.AddMonths(-1).Year;\n                }\n\n                if (week != lastWeek)\n                {\n                    lastWeek = week;\n                    weekCounter += 1;\n                    currentDay = currentDay.AddDays(7);\n                    yield return new YearWeek { Year = year, Week = week };\n                }\n                else\n                {\n                    currentDay = currentDay.AddDays(1);\n                }\n            }\n        }\n\n        public static IEnumerable&lt;YearWeek> EachWeek(DateTime start, DateTime end)\n        {\n            \/\/ Remove time info from start date (we only care about day). \n            DateTime currentDay = new DateTime(start.Year, start.Month, start.Day);\n            int lastWeek = 0;\n            while (currentDay &lt;= end)\n            {\n                var week = DateTimeHelper.ISO8601WeekNumber(currentDay);\n                var year = currentDay.Year;\n                if (week == 1)\n                {\n                    year = currentDay.AddMonths(1).Year;\n                }\n                else if (week >= 52)\n                {\n                    year = currentDay.AddMonths(-1).Year;\n                }\n\n                if (week != lastWeek)\n                {\n                    lastWeek = week;\n                    currentDay = currentDay.AddDays(7);\n                    yield return new YearWeek { Year = year, Week = week };\n                }\n                else\n                {\n                    currentDay = currentDay.AddDays(1);\n                }\n            }\n        }\n\n\n        public static int YearWeekCount(int year)\n        {\n            var week = ISO8601WeekNumber(new DateTime(year + 1, 1, 1));\n\n            if (week == 53)\n            {\n                return 53;\n            }\n            else\n            {\n                return 52;\n            }\n        }\n\n        public class YearWeek : IComparable\n        {\n            public int Year { get; set; }\n            public int Week { get; set; }\n\n            public int CompareTo(object o)\n            {\n                int c = 0;\n                var b = (YearWeek)o;\n                if (b != null)\n                {\n                    c = Year.CompareTo(b.Year);\n                    if (c == 0)\n                    {\n                        c = Week.CompareTo(b.Week);\n                    }\n                }\n                return c;\n            }\n\n            public override bool Equals(object obj)\n            {\n                if (obj != null &amp;&amp; obj is YearWeek)\n                {\n                    var yw = (YearWeek)obj;\n                    return yw.Year == Year &amp;&amp; yw.Week == Week;\n                }\n                return false;\n            }\n\n            public override int GetHashCode()\n            {\n                return Year.GetHashCode() + Week.GetHashCode();\n            }\n        }\n\n        public static bool IsGreaterThan&lt;T>(this T value, T other) where T : IComparable\n        {\n            return value.CompareTo(other) > 0;\n        }\n\n        public static bool IsLessThan&lt;T>(this T value, T other) where T : IComparable\n        {\n            return value.CompareTo(other) &lt; 0;\n        }\n\n        public static YearWeek AddWeeks(YearWeek yearWeek, int numberOfWeeks)\n        {\n            int weeksToGo = Math.Abs(numberOfWeeks);\n            int step = numberOfWeeks \/ Math.Abs(numberOfWeeks);\n            var current = new YearWeek { Year = yearWeek.Year, Week = yearWeek.Week };\n\n            while (weeksToGo > 0)\n            {\n                current.Week += step;\n                if (current.Week &lt; 1)\n                {\n                    current.Year -= 1;\n                    current.Week = YearWeekCount(current.Year);\n                }\n                else if (current.Week > 52)\n                {\n                    var wc = YearWeekCount(current.Year);\n                    if (current.Week > wc)\n                    {\n                        current.Week = 1;\n                        current.Year += 1;\n                    }\n                }\n                weeksToGo -= 1;\n            }\n            return current;\n        }\n\n        public static int GetWeekDiff(YearWeek a, YearWeek b)\n        {\n            int diff = 0;\n            int cmp = 0;\n            var c = new YearWeek { Year = b.Year, Week = b.Week };\n            while (true)\n            {\n                cmp = c.CompareTo(a);\n                if (cmp == 0)\n                {\n                    return diff;\n                }\n                else\n                {\n                    diff += cmp;\n                    c = AddWeeks(c, -cmp);\n                }\n            }\n        }\n\n        public static bool IsDateInRange(DateTime? val, DateTime? min, DateTime? max)\n        {\n            return val.HasValue &amp;&amp; (!min.HasValue || val.Value >= min.Value) &amp;&amp; (!max.HasValue || val.Value &lt;= max.Value);\n        }\n\n\n        public static bool DateRangeOverlap(DateTime? min1, DateTime? max1, DateTime? min2, DateTime? max2)\n        {\n            return DateRangeOverlap(min1.GetValueOrDefault(DateTime.MinValue), max1.GetValueOrDefault(DateTime.MaxValue),\n                                    min2.GetValueOrDefault(DateTime.MinValue), max2.GetValueOrDefault(DateTime.MaxValue));\n        }\n\n        public static bool DateRangeOverlap(DateTime min1, DateTime max1, DateTime min2, DateTime max2)\n        {\n            \/\/ from: http:\/\/stackoverflow.com\/questions\/7325124\/how-check-intersection-of-datetime-periods\n            if (min1 > max1 || min2 > max2)\n                throw new Exception(\"Invalid date range\");\n\n            if (min1 == max1 || min2 == max2)\n                return false; \/\/ No actual date range\n\n            if (min1 == min2 || max1 == max2)\n                return true; \/\/ If any set is the same time, then by default there must be some overlap. \n\n            if (min1 &lt; min2)\n            {\n                if (max1 > min2 &amp;&amp; max1 &lt; max2)\n                    return true; \/\/ Condition 1\n\n                if (max1 > max2)\n                    return true; \/\/ Condition 3\n            }\n            else\n            {\n                if (max2 > min1 &amp;&amp; max2 &lt; max1)\n                    return true; \/\/ Condition 2\n\n                if (max2 > max1)\n                    return true; \/\/ Condition 4\n            }\n\n            return false;\n        }\n\n        public static TimeSpan DateRangeOverlapTimeSpan(DateTime min1, DateTime max1, DateTime min2, DateTime max2)\n        {\n            if (min1 > max1 || min2 > max2)\n            {\n                throw new Exception(\"Invalid date range\");\n            }\n\n            \/\/ Cases: \n            \/\/            [---- Date1 ----]\n            \/\/                [--2C--]  \n            \/\/      [------------2D------------]   \n            \/\/      [----2A----]    [----2B----]\n            \/\/ [--E--]                        [--F--]\n\n            \/\/ 2E, 2F: skip\n            if (max2 &lt;= min1 || min2 >= max1)\n            {\n                return new TimeSpan(0);\n            }\n\n            \/\/ 2C\n            if (min1 &lt;= min2 &amp;&amp; max1 >= max2)\n            {\n                return (max2 - min2).Duration();\n            }\n            \/\/ 2D\n            if (min1 >= min2 &amp;&amp; max1 &lt;= max2)\n            {\n                return (max1 - min1).Duration();\n            }\n\n            \/\/ 2A\n            if (min1 >= min2 &amp;&amp; max1 >= max2 &amp;&amp; max2 >= min1)\n            {\n                return (max2 - min1).Duration();\n            }\n            \/\/ 2B\n            if (min1 &lt;= min2 &amp;&amp; max1 >= min2 &amp;&amp; max2 >= max1)\n            {\n                return (max1 - min2).Duration();\n            }\n\n            return new TimeSpan(0);\n        }\n\n        public static TimeSpan TimespanRangeOverlapTimeSpan(TimeSpan min1, TimeSpan max1, TimeSpan min2, TimeSpan max2)\n        {\n            if (min1 > max1 || min2 > max2)\n            {\n                throw new Exception(\"Invalid date range\");\n            }\n\n            \/\/ Cases: \n            \/\/            [---- Date1 ----]\n            \/\/                [--2C--]  \n            \/\/      [------------2D------------]   \n            \/\/      [----2A----]    [----2B----]\n            \/\/ [--E--]                        [--F--]\n\n            \/\/ 2E, 2F: skip\n            if (max2 &lt;= min1 || min2 >= max1)\n            {\n                return new TimeSpan(0);\n            }\n\n            \/\/ 2C\n            if (min1 &lt;= min2 &amp;&amp; max1 >= max2)\n            {\n                return (max2 - min2).Duration();\n            }\n            \/\/ 2D\n            if (min1 >= min2 &amp;&amp; max1 &lt;= max2)\n            {\n                return (max1 - min1).Duration();\n            }\n\n            \/\/ 2A\n            if (min1 >= min2 &amp;&amp; max1 >= max2 &amp;&amp; max2 >= min1)\n            {\n                return (max2 - min1).Duration();\n            }\n            \/\/ 2B\n            if (min1 &lt;= min2 &amp;&amp; max1 >= min2 &amp;&amp; max2 >= max1)\n            {\n                return (max1 - min2).Duration();\n            }\n\n            return new TimeSpan(0);\n        }\n\n\n        public static TimeSpan TimespanBetweenDatetimes(TimeSpan from, TimeSpan to)\n        {\n            \/\/ Next day\n            if (IsGreaterThan&lt;TimeSpan>(from, to))\n            {\n                TimeSpan timespanday = TimeSpan.FromDays(1);\n                to = to.Add(timespanday);\n            }\n\n            TimeSpan totaltime = new TimeSpan(to.Ticks - from.Ticks);\n            return totaltime;\n        }\n\n        public static Double GetUnixTimestampFromDate(DateTime targetDateTime)\n        {\n            DateTime zeroDateTime = new DateTime(1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);\n            TimeSpan timeDifference = targetDateTime.ToUniversalTime() - zeroDateTime;\n            return timeDifference.TotalSeconds;\n        }\n\n        public static DateTime? GetDateFromAS400(long date)\n        {\n            return GetDateFromAS400(date.ToString());\n        }\n\n        public static DateTime? GetDateFromAS400(string date)\n        {\n            if (date.Length == 8)\n                \/\/ formaat YYYYMMDDD\n                return new DateTime(Convert.ToInt32(date.Substring(0, 4)), Convert.ToInt32(date.Substring(4, 2)), Convert.ToInt32(date.Substring(6, 2)));\n            else\n                return null;\n        }\n\n        public static long SetDateToAS400(DateTime date)\n        {\n            return long.Parse(string.Format(\"{0:yyyyMMdd}\", date));\n        }\n\n    }\n\n}\n<\/pre><\/div>\n\n\n\n<div style=\"height: 250px; position:relative; margin-bottom: 50px;\" class=\"wp-block-simple-code-block-ace\"><pre class=\"wp-block-simple-code-block-ace\" style=\"position:absolute;top:0;right:0;bottom:0;left:0\" data-mode=\"csharp\" data-theme=\"monokai\" data-fontsize=\"14\" data-lines=\"Infinity\" data-showlines=\"true\" data-copy=\"false\">public class YearWeek : IComparable, IComparable&lt;YearWeek>\n{\n    public int Year { get; set; }\n    public int Week { get; set; }\n    public string Key => ToString();\n\n    public static YearWeek FromInts(int year, int week)\n    {\n        return new YearWeek { Year = year, Week = week };\n    }\n\n    public int CompareTo(object o) => InternalCompareTo(o as YearWeek);\n\n    public override bool Equals(object obj)\n    {\n        if (obj == null || obj is not YearWeek yw) return false;\n        return yw.Year == Year &amp;&amp; yw.Week == Week;\n    }\n\n    public override string ToString() => $\"{Year}-{Week}\";\n\n    public override int GetHashCode() => Year.GetHashCode() + Week.GetHashCode();\n\n    public int AsInt() => int.Parse($\"{Year}{Week:D2}\");\n\n    public YearWeek Copy() => (YearWeek)MemberwiseClone();\n\n    public int WeekCountTo(YearWeek yearWeek)\n    {\n        var i = 0;\n        var current = this;\n        while (current.IsLessThan(yearWeek))\n        {\n            current = DateTimeHelper.AddWeeks(current, 1);\n            i += 1;\n        }\n        return i;\n    }\n\n    public static YearWeek FromInt(int? yearWeekInt)\n    {\n        if (yearWeekInt == null) return null;\n        var yearWeekStr = yearWeekInt.ToString();\n        var year = int.Parse(yearWeekStr.Substring(0, yearWeekStr.Length - 2));\n        var week = int.Parse(yearWeekStr.Substring(yearWeekStr.Length - 2));\n        return new YearWeek { Year = year, Week = week };\n    }\n\n    public static YearWeek Now() => DateTimeHelper.GetWeekFromDate(DateTime.Now);\n\n    public int CompareTo(YearWeek other) => InternalCompareTo(other);\n\n    private int InternalCompareTo(YearWeek o) => this?.AsInt() ?? 0 - o?.AsInt() ?? 0;\n\n    public YearWeek AddWeeks(int count) => DateTimeHelper.AddWeeks(this, count);\n\n}<\/pre><\/div>\n","protected":false},"excerpt":{"rendered":"<p>Older<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"inline_featured_image":false,"footnotes":""},"categories":[6,4,1],"tags":[],"class_list":["post-2692","post","type-post","status-publish","format-standard","hentry","category-dotnet","category-programming","category-uncategorized"],"_links":{"self":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2692","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/comments?post=2692"}],"version-history":[{"count":8,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2692\/revisions"}],"predecessor-version":[{"id":10029,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/posts\/2692\/revisions\/10029"}],"wp:attachment":[{"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/media?parent=2692"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/categories?post=2692"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/solidt.eu\/site\/wp-json\/wp\/v2\/tags?post=2692"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}