C# 以C获取给定年份中的ISO周数#
我正在尝试获取给定年份/闰年的ISO周数。我看到,.NETCore3.0有C# 以C获取给定年份中的ISO周数#,c#,datetime,.net-core,C#,Datetime,.net Core,我正在尝试获取给定年份/闰年的ISO周数。我看到,.NETCore3.0有ISOWeek.GetWeeksInYear类,但我们正在运行.NETCore2.2.1。。。现在还不可能更新 我试过这个: var cultInfo = CultureInfo.CurrentCulture; var lastDayOfYear = new DateTime(2019, 12, 31); var numberOfWeeks = cultInfo.Calendar.GetWeekOfYear(
ISOWeek.GetWeeksInYear
类,但我们正在运行.NETCore2.2.1。。。现在还不可能更新
我试过这个:
var cultInfo = CultureInfo.CurrentCulture;
var lastDayOfYear = new DateTime(2019, 12, 31);
var numberOfWeeks = cultInfo.Calendar.GetWeekOfYear(
lastDayOfYear,
cultInfo.DateTimeFormat.CalendarWeekRule,
DayOfWeek.Monday);
对于2019
它返回53
,结果与我想要的结果不符(52
)。如果我把日期改为2020年,它就是53年,这是正确的,但是是的,不是ISO,这是我想要的
提前感谢。您可以查看源代码并自行实现此方法(因为您不能以.NET Core 3.x为目标)
private const int week singlongyear=53;
周内的私人常数短=52;
公共静态整数GetWeeksInYear(整数年)
{
如果(年份<1 | |年份>9999)
{
抛出新ArgumentOutOfRangeException(name of(year));
}
静态int P(int y)=>(y+(y/4)-(y/100)+(y/400))%7;
如果(P(年)==4 | | P(年-1)==3)
{
每年的回归周;
}
短时间返回周;
}
然后使用它
var weeks=GetWeeksInYear(2019年)//返回52
周=一年中的一周(2020年)//返回53
请记住,从C#8开始就支持这种方法,因此您应该切换到这个版本,或者稍微重写一段代码。您可以查看源代码并自己实现这种方法(因为您不能以.NET Core 3.x为目标)
private const int week singlongyear=53;
周内的私人常数短=52;
公共静态整数GetWeeksInYear(整数年)
{
如果(年份<1 | |年份>9999)
{
抛出新ArgumentOutOfRangeException(name of(year));
}
静态int P(int y)=>(y+(y/4)-(y/100)+(y/400))%7;
如果(P(年)==4 | | P(年-1)==3)
{
每年的回归周;
}
短时间返回周;
}
然后使用它
var weeks=GetWeeksInYear(2019年)//返回52
周=一年中的一周(2020年)//返回53
请记住,从C#8开始就支持这一点,因此您应该切换到此版本或稍微重写一段代码一年包含
53
当且仅当它包含53
周四;因此,为了返回53
,一年必须
周四开始
或周三开始
public static int GetWeeksInYear(int year) {
if (year < DateTime.MinValue.Year || year > DateTime.MaxValue.Year)
throw new ArgumentOutOfRangeException(nameof(year));
var dw = new DateTime(year, 1, 1).DayOfWeek;
return (dw == DayOfWeek.Thursday) ||
(dw == DayOfWeek.Wednesday) && DateTime.IsLeapYear(year)
? 53
: 52;
}
var report = string.Join(Environment.NewLine, Enumerable
.Range(1990, 2020 - 1990 + 1)
.Select(year => $"{year} : {GetWeeksInYear(year)}"));
Console.Write(report);
1990 : 52
1991 : 52
1992 : 53
1993 : 52
1994 : 52
1995 : 52
1996 : 52
1997 : 52
1998 : 53
1999 : 52
2000 : 52
2001 : 52
2002 : 52
2003 : 52
2004 : 53
2005 : 52
2006 : 52
2007 : 52
2008 : 52
2009 : 53
2010 : 52
2011 : 52
2012 : 52
2013 : 52
2014 : 52
2015 : 53
2016 : 52
2017 : 52
2018 : 52
2019 : 52
2020 : 53
结果:
public static int GetWeeksInYear(int year) {
if (year < DateTime.MinValue.Year || year > DateTime.MaxValue.Year)
throw new ArgumentOutOfRangeException(nameof(year));
var dw = new DateTime(year, 1, 1).DayOfWeek;
return (dw == DayOfWeek.Thursday) ||
(dw == DayOfWeek.Wednesday) && DateTime.IsLeapYear(year)
? 53
: 52;
}
var report = string.Join(Environment.NewLine, Enumerable
.Range(1990, 2020 - 1990 + 1)
.Select(year => $"{year} : {GetWeeksInYear(year)}"));
Console.Write(report);
1990 : 52
1991 : 52
1992 : 53
1993 : 52
1994 : 52
1995 : 52
1996 : 52
1997 : 52
1998 : 53
1999 : 52
2000 : 52
2001 : 52
2002 : 52
2003 : 52
2004 : 53
2005 : 52
2006 : 52
2007 : 52
2008 : 52
2009 : 53
2010 : 52
2011 : 52
2012 : 52
2013 : 52
2014 : 52
2015 : 53
2016 : 52
2017 : 52
2018 : 52
2019 : 52
2020 : 53
一年包含
53
当且仅当它包含53
周四时;因此,为了返回53
,一年必须
周四开始
或周三开始
public static int GetWeeksInYear(int year) {
if (year < DateTime.MinValue.Year || year > DateTime.MaxValue.Year)
throw new ArgumentOutOfRangeException(nameof(year));
var dw = new DateTime(year, 1, 1).DayOfWeek;
return (dw == DayOfWeek.Thursday) ||
(dw == DayOfWeek.Wednesday) && DateTime.IsLeapYear(year)
? 53
: 52;
}
var report = string.Join(Environment.NewLine, Enumerable
.Range(1990, 2020 - 1990 + 1)
.Select(year => $"{year} : {GetWeeksInYear(year)}"));
Console.Write(report);
1990 : 52
1991 : 52
1992 : 53
1993 : 52
1994 : 52
1995 : 52
1996 : 52
1997 : 52
1998 : 53
1999 : 52
2000 : 52
2001 : 52
2002 : 52
2003 : 52
2004 : 53
2005 : 52
2006 : 52
2007 : 52
2008 : 52
2009 : 53
2010 : 52
2011 : 52
2012 : 52
2013 : 52
2014 : 52
2015 : 53
2016 : 52
2017 : 52
2018 : 52
2019 : 52
2020 : 53
结果:
public static int GetWeeksInYear(int year) {
if (year < DateTime.MinValue.Year || year > DateTime.MaxValue.Year)
throw new ArgumentOutOfRangeException(nameof(year));
var dw = new DateTime(year, 1, 1).DayOfWeek;
return (dw == DayOfWeek.Thursday) ||
(dw == DayOfWeek.Wednesday) && DateTime.IsLeapYear(year)
? 53
: 52;
}
var report = string.Join(Environment.NewLine, Enumerable
.Range(1990, 2020 - 1990 + 1)
.Select(year => $"{year} : {GetWeeksInYear(year)}"));
Console.Write(report);
1990 : 52
1991 : 52
1992 : 53
1993 : 52
1994 : 52
1995 : 52
1996 : 52
1997 : 52
1998 : 53
1999 : 52
2000 : 52
2001 : 52
2002 : 52
2003 : 52
2004 : 53
2005 : 52
2006 : 52
2007 : 52
2008 : 52
2009 : 53
2010 : 52
2011 : 52
2012 : 52
2013 : 52
2014 : 52
2015 : 53
2016 : 52
2017 : 52
2018 : 52
2019 : 52
2020 : 53
看看源代码和特定的方法,它很小很简单,你可以自己实现。看看源代码和特定的方法,它很小很简单,你可以自己实现