File: FormatWeekHelper.cs
Web Access
Project: src\src\Mvc\Mvc.ViewFeatures\src\Microsoft.AspNetCore.Mvc.ViewFeatures.csproj (Microsoft.AspNetCore.Mvc.ViewFeatures)
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.
 
using System.Globalization;
 
namespace Microsoft.AspNetCore.Mvc.ViewFeatures;
 
internal static class FormatWeekHelper
{
    public static string GetFormattedWeek(ModelExplorer modelExplorer)
    {
        var value = modelExplorer.Model;
 
        if (value is DateTimeOffset dateTimeOffset)
        {
            value = dateTimeOffset.DateTime;
        }
 
        if (value is DateTime date)
        {
            var calendar = Thread.CurrentThread.CurrentCulture.Calendar;
            var day = calendar.GetDayOfWeek(date);
 
            // Get the week number consistent with ISO 8601. See blog post:
            // https://blogs.msdn.microsoft.com/shawnste/2006/01/24/iso-8601-week-of-year-format-in-microsoft-net/
            if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
            {
                date = date.AddDays(3);
            }
 
            var week = calendar.GetWeekOfYear(date, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);
            var year = calendar.GetYear(date);
            var month = calendar.GetMonth(date);
 
            // Last week (either 52 or 53) includes January dates (1st, 2nd, 3rd)
            if (week >= 52 && month == 1)
            {
                year--;
            }
 
            // First week includes December dates (29th, 30th, 31st)
            if (week == 1 && month == 12)
            {
                year++;
            }
 
            return $"{year:0000}-W{week:00}";
        }
 
        return null;
    }
}