获取或转换年份为ISO周

时间:2015-01-02 16:06:30

标签: vb.net

在尝试获得一年中的周数时,我尝试了这个:

maxWeek = calendar.GetWeekOfYear(New Date(t_year, 12, 31), 
          CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday)

这对我的purpouse来说并不好用,但我注意到一些奇怪的东西。对于2014-12-31,它返回53并且2015-01-01它返回1.对于2015-01-05,它返回2.这意味着第53周和第1周比7天小!

我需要结果符合ISO Week。我无法在网上找到任何遵循同样逻辑的日历示例。他们都显示从2014年12月29日到2015-01-04的第1周。

1 个答案:

答案 0 :(得分:4)

您的原始帖子未提及您正在寻找ISO周,这可能已经让您想要的不清楚。

使用GetWeekOfYearFirstFourDayWeek的网络DayOfWeek.Monday 几乎就像ISO周一样。区别在于ISO周总是七天。请记住,ISO日期不仅仅是一种不同的格式,而是一个不同的日历,并附有自己的条款(如闰周)。另一方面,您的默认NET calandar是Gregorian。

将ISO 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:周:52
  2006:周:52
  2007年:周:1   2008年:周:1   2009:周:53
  2010:周:52
  2011:周:52
  2012年:周:1   2013年:周:1   2014年:周:1   2015年:周:53
  2016年:周:52