获取或转换一年中的第几周为 ISO 周
Get or convert Week of year to ISO week
在尝试获取一年中的周数时,我尝试了这个:
maxWeek = calendar.GetWeekOfYear(New Date(t_year, 12, 31),
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
这对我的目的来说效果不佳,但我注意到了一些奇怪的事情。对于 2014-12-31,它返回 53,对于 2015-01-01,它返回 1。对于 2015-01-05,它返回 2。这意味着第 53 周和第 1 周小于 7 天!
我需要结果 ISO Week 合规。我无法在网上找到任何遵循相同逻辑的日历示例。它们都显示从 2014-12-29 到 2015-01-04 的第 1 周。
你原来的post并没有提到你正在寻找ISO周,这可能让你不清楚你想要什么。
使用 FirstFourDayWeek
和 DayOfWeek.Monday
的 NET GetWeekOfYear
几乎 就像一个 ISO 周。区别在于 ISO 周始终为 7 天。请记住,ISO 日期不仅是一种不同的格式,而且是一种不同的 calendar,具有自己的术语(如闰周)。另一方面,您的默认 NET 日历是 Gregorian。
将 NET WOY 调整为 ISO 周并不难:
Public Shared Function GetISOWeekOfYear(dt As DateTime) As Integer
Dim cal As Calendar = CultureInfo.InvariantCulture.Calendar
Dim d As DayOfWeek = cal.GetDayOfWeek(dt)
If (d >= DayOfWeek.Monday) AndAlso (d <= DayOfWeek.Wednesday) Then
dt = dt.AddDays(3)
End If
Return cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
End Function
12/31/xxxx 的简单测试器:
For n As Integer = 1990 To 2016
Console.WriteLine("{0}: week:{1}", n.ToString,
GetISOWeekOfYear(New DateTime(n, 12, 31)).ToString)
Next
最后几个输出:
2005: week:52
2006: week:52
2007: week:1
2008: week:1
2009: week:53
2010: week:52
2011: week:52
2012: week:1
2013: week:1
2014: week:1
2015: week:53
2016: week:52
试试这个:
Dim maxWeek As Integer = Globalization.ISOWeek.GetWeekOfYear(New Date(t_year, 12, 31))
适用于 .NET 版本:.NET 5、.NET 6、.NET Core 3.0、.NET Core 3.1 和 .NET Standard 2.1
在此处获取详细信息:
https://docs.microsoft.com/en-us/dotnet/api/system.globalization.isoweek.getweekofyear?view=net-6.0
在尝试获取一年中的周数时,我尝试了这个:
maxWeek = calendar.GetWeekOfYear(New Date(t_year, 12, 31),
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
这对我的目的来说效果不佳,但我注意到了一些奇怪的事情。对于 2014-12-31,它返回 53,对于 2015-01-01,它返回 1。对于 2015-01-05,它返回 2。这意味着第 53 周和第 1 周小于 7 天!
我需要结果 ISO Week 合规。我无法在网上找到任何遵循相同逻辑的日历示例。它们都显示从 2014-12-29 到 2015-01-04 的第 1 周。
你原来的post并没有提到你正在寻找ISO周,这可能让你不清楚你想要什么。
使用 FirstFourDayWeek
和 DayOfWeek.Monday
的 NET GetWeekOfYear
几乎 就像一个 ISO 周。区别在于 ISO 周始终为 7 天。请记住,ISO 日期不仅是一种不同的格式,而且是一种不同的 calendar,具有自己的术语(如闰周)。另一方面,您的默认 NET 日历是 Gregorian。
将 NET WOY 调整为 ISO 周并不难:
Public Shared Function GetISOWeekOfYear(dt As DateTime) As Integer
Dim cal As Calendar = CultureInfo.InvariantCulture.Calendar
Dim d As DayOfWeek = cal.GetDayOfWeek(dt)
If (d >= DayOfWeek.Monday) AndAlso (d <= DayOfWeek.Wednesday) Then
dt = dt.AddDays(3)
End If
Return cal.GetWeekOfYear(dt, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
End Function
12/31/xxxx 的简单测试器:
For n As Integer = 1990 To 2016
Console.WriteLine("{0}: week:{1}", n.ToString,
GetISOWeekOfYear(New DateTime(n, 12, 31)).ToString)
Next
最后几个输出:
2005: week:52
2006: week:52
2007: week:1
2008: week:1
2009: week:53
2010: week:52
2011: week:52
2012: week:1
2013: week:1
2014: week:1
2015: week:53
2016: week:52
试试这个:
Dim maxWeek As Integer = Globalization.ISOWeek.GetWeekOfYear(New Date(t_year, 12, 31))
适用于 .NET 版本:.NET 5、.NET 6、.NET Core 3.0、.NET Core 3.1 和 .NET Standard 2.1
在此处获取详细信息: https://docs.microsoft.com/en-us/dotnet/api/system.globalization.isoweek.getweekofyear?view=net-6.0