Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何像Outlook一样获取日期的日历周数?_C#_Date_.net Core_Calendar - Fatal编程技术网

C# 如何像Outlook一样获取日期的日历周数?

C# 如何像Outlook一样获取日期的日历周数?,c#,date,.net-core,calendar,C#,Date,.net Core,Calendar,我必须使用Outlook中使用的相同编号显示日期的日历周。 编号必须遵循意大利it文化。 Outlook日历使用星期一作为一周的第一天进行配置,并且一月一日始终在第一周。 例如,使用相同编号逻辑的另一个日历可能需要启用周编号 我尝试过不同的方法,但我没有得到正确的周数和一些日期。 特别是,我尝试使用: 从CultureInfo.GetCultureit返回的日历 格雷戈里安卡伦达 等周 我试过的一些日期是: 200年12月31日 2021年3月29日 2012年12月31日 1992年12月21

我必须使用Outlook中使用的相同编号显示日期的日历周。 编号必须遵循意大利it文化。 Outlook日历使用星期一作为一周的第一天进行配置,并且一月一日始终在第一周。 例如,使用相同编号逻辑的另一个日历可能需要启用周编号

我尝试过不同的方法,但我没有得到正确的周数和一些日期。 特别是,我尝试使用:

从CultureInfo.GetCultureit返回的日历 格雷戈里安卡伦达 等周 我试过的一些日期是:

200年12月31日 2021年3月29日 2012年12月31日 1992年12月21日 2019年12月30日 我发现获得正确周数的唯一可靠方法是自己计算周数,但我不太喜欢依赖于日期计算代码的想法。我无法100%确定是否找到了正确的逻辑。我无法测试所有可能的日期

下面有一个程序显示了我尝试的每种方法的各种结果,以及我如何手动计算周数。

示例的输出为显示各种颜色的图像:

所以问题是:是否有一种内置的方法可以使用Outlook使用的相同编号逻辑从日期获取周数

编辑:

我已经尝试使用CalendarWeekRule.FirstFourDayWeek和CalendarWeekRule.FirstFullWeek

我提到的示例程序:

公开密封课程 { 私有静态日历=CultureInfo.getcultureinfo-IT.Calendar; 专用静态日历plainGregorianCalendar=新的GregorianCalendar; 公共静态真空总管 { var  stofdecember2000=新日期时间2000,12,31; var  thofmarch2021=新日期时间2021,3,29; Var31stofdecember2012=新日期时间2012,12,31; Var21stDecember1992=新日期时间1992,12,21; var_30th December2019=新日期时间2019,12,30; var 1stofanuary2013=新日期时间2013,1,1; 2000年12月的印刷周,53; 《印刷周刊》2021年第29期,第14页; 2012年12月1日印刷周; 《印刷周刊》1992年12月21日,52; 2019年12月30日印刷周,1; 2013年1月1日印刷周; Console.ReadKey; } 私有静态无效PrintWeekDateTime日期,int expectedWeek { var isoWeek=isoWeek.GetWeekOfYeardate; var意大利语CalendarWeek=意大利语Calendar.GetWeekOfYeardate,CalendarWeekRule.FirstDay,DayOfWeek.Monday; var gregorianCalendarWeek=plainGregorianCalendar.GetWeekOfYeardate,CalendarWeekRule.FirstDay,DayOfWeek.Monday; var manuallyCalculatedWeek=CalculateWeekdate; Console.ForegroundColor=ConsoleColor.White; Console.WriteLineDate:{0:yyyy-MMMM-dd}-预期的星期{1},日期,预期的星期; Console.ForegroundColor=isoWeek==expectedWeek?ConsoleColor.绿色:ConsoleColor.红色; Console.WriteLineISO Week:{0},isoWeek; Console.ForegroundColor=CalendarWeek==expectedWeek?ConsoleColor.绿色:ConsoleColor.红色; Console.WriteLineItalian日历周:{0},意大利语日历周; Console.ForegroundColor=GregoriacalendarWeek==expectedWeek?ConsoleColor.绿色:ConsoleColor.红色; Console.WriteLineGregorian日历周:{0},Gregorian日历周; Console.ForegroundColor=manuallyCalculatedWeek==expectedWeek?控制台颜色。绿色:控制台颜色。红色; Console.WriteLineManually计算周:{0},manuallyCalculatedWeek; Console.WriteLine; } 公共静态int CalculateWeekDateTime日期 { var firstDayOfFirstWeekOfDateYear=StartOfWeekOfYeardate.Year,1; var firstDayOfFirstWeekOfNextYear=StartOfWeekOfYeardate.Year+1,1; var lastDayOfLastWeekOfDateYear=firstDayOfFrstweeOfNextYear.AddDays-1; var timePassedSinceFirstWeek=日期-第二个日期的第一天; var daysPassedSinceFirstWeek=timePassedSinceFirstWeek.Days; var timePassedBetweenFirstAndEndOfYear=最后一个工作日DateYear的最后一天-第二个工作日的第一天; var DaysPassedBetween FirstandEndofyear=TimePassedBetween FirstandEndofyear.Days; var weeksOfDateYear=FirstandEndofyear之间的天数/7+1; //如果周数超过一年中的有效周数,则使用模运算符将其包装到下一年 //模将把周数包装在年周的周围,留下计算的提醒,作为下一年的周数。 var week=自第一周起的天数/7%的DateYear周数+1; 返回周; } 专用静态日期时间Sta rtOfWeekOfYearint year,int week { var Firstof一月=新的日期时间年,1,1; var dayOfWeekFirstOfJanuary=CultureInfo.InvariantCulture.Calendar.GetDayOfWeekfirstOfJanuary; //星期天是0而不是7,把计算搞砸了 var dayOfWeekOffset=dayOfWeekFirstOfJanuary==DayOfWeek.Sunday?-6:DayOfWeek.Monday-dayOfWeekFirstOfJanuary; var Daysofset=7*周-1+dayOfWeekOffset; 返回1月1日。AddDaysdaysOffset; }
我根据您的要求修改了上面链接的答案。结果与上面提供的所有手动计算相匹配

using System;
using System.Globalization;

public class Program
{
    public static void Main()
    {
        var today = new DateTime(2000, 12, 31);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
        today = new DateTime(2021, 3, 29);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
        today = new DateTime(2012, 12, 31);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
        today = new DateTime(1992, 12, 21);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
        today = new DateTime(2009, 12, 30);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
        today = new DateTime(2013, 1, 1);
        Console.WriteLine(string.Format("{0} {1} {2} {3}", today, today.GetWeekOfYear("it-it"), today.DayOfWeek, today.DayOfYear));
    }
}

static class DateTimeExtensions
{
    public static int GetWeekOfYear(this DateTime time, string languageTag)
    {
        // Seriously cheat.  If its Monday, Tuesday or Wednesday, then it'll 
        // be the same week# as whatever Thursday, Friday or Saturday are,
        // and we always get those right
        var culture = CultureInfo.GetCultureInfoByIetfLanguageTag(languageTag);
        var day = culture.Calendar.GetDayOfWeek(time);
        if (day >= DayOfWeek.Monday && day <= DayOfWeek.Wednesday)
        {
            time = time.AddDays(3);
        }

        // Return the week of our adjusted day
        return culture.Calendar.GetWeekOfYear(time, CalendarWeekRule.FirstDay, DayOfWeek.Monday);
    }
}

你读过答案了吗?我认为该页面上扩展方法的输出符合您的要求。@PranavNegandhi它似乎使用了ISO8601周编号,这是由静态类ISOWeek实现的,但我尝试了无效。此外,ISO周编号不允许在一年中分割周,这似乎是我的Outlook日历和意大利日历所做的。您是否尝试过使用CalendarWeekRule.FirstFourDayWeek?@AimusSage是的,同样没有多大成功。我已经更新了问题,添加了这个细节。你所做的基本上是计算星期四、星期五等。。如果日期不在其中一天,则获取新日期的周数?据你所知,这有什么特别的原因吗?为什么Calendar类还没有这样做?我自己还不太清楚。这段代码是从另一个答案中删除的,我所更改的只是参数GetWeekOfYear to CalendarWeekRule.FirstDay.Marked as answer,此处有一篇博客文章解释并显示了您在此处提供的相同代码,以供参考: