C# 如何像Outlook一样获取日期的日历周数?
我必须使用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; }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
我根据您的要求修改了上面链接的答案。结果与上面提供的所有手动计算相匹配
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,此处有一篇博客文章解释并显示了您在此处提供的相同代码,以供参考: