在尝试获取一年中的周数时,我尝试了以下方法:
maxWeek = calendar.GetWeekOfYear(New Date(t_year, 12, 31),
CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)
Run Code Online (Sandbox Code Playgroud)
这不符合我的目的,但我注意到一些奇怪的事情。对于 2014-12-31,它返回 53,对于 2015-01-01,它返回 1。对于 2015-01-05,它返回 2。这意味着第 53 周和第 1 周小于 7 天!
我需要结果符合ISO Week标准。我在网上找不到任何遵循相同逻辑的日历示例。它们都显示了从 2014-12-29 到 2015-01-04 的第 1 周。
您的原始帖子没有提到您正在寻找 ISO 周,这可能使您不清楚想要什么。
NET的GetWeekOfYear
使用FirstFourDayWeek
和DayOfWeek.Monday
是几乎像一个ISO周。不同之处在于 ISO 周始终为 7 天。请记住,ISO 日期不仅是一种不同的格式,而且是一种具有其自身条件的不同日历(例如闰周)。另一方面,您的默认 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
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
最后几个的输出:
2005:周:52
2006:周:52
2007:周:1
2008:周:1
2009:周:53
2010:周:52
2011:周:52
2012:周:1
2013:周:1
2014:周:1
2015 年:周:53
2016 年:周:52