在尝试获取一年中的星期数时,我尝试了以下方法:
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周。
您的原始帖子没有提到您正在寻找ISO周,这可能使您想要的不清楚。
NET的GetWeekOfYear
使用FirstFourDayWeek
和DayOfWeek.Monday
是几乎像一个ISO周。不同之处在于,ISO周始终为7天。请记住,ISO日期不仅是不同的格式,而且是带有自己的术语(例如leap周)的不同日历。另一方面,您的默认NET calandar是Gregorian。
将NET WOY调整为ISO Week并不难:
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:周:52
2006:周:52
2007:周:1
2008:周:1
2009:周:53
2010:周:52
2011:周:52
2012:周:1
2013:周:1
2014:周:1
2015:周:53
2016:周:52
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句