给出C#中的周数和年份,计算一周的开始和结束日期(基于ISO规范)

时间:2009-08-04 07:58:37

标签: c# vb.net datetime vb6 calendar

我需要生成一份报告,显示一年中的52周(或某些年份为53周)及其开始和结束日期。有一个ISO规范要做到这一点,但看起来非常复杂!我希望有人知道在C#或Visual Basic中实现它的方法(它实际上用于Visual Basic 6,但我会尝试移植它)

8 个答案:

答案 0 :(得分:5)

您可以使用Calendar.GetWeekOfYear方法获取日期的周数,CalendarWeekRule.FirstFourDayWeek值指定周数的确定方式,DayOfWeek.Monday指定第一个工作日。这符合ISO规范。

示例:

int week = Calendar.GetWeekOfYear(DateTime.Today, CalendarWeekRule.FirstFourDayWeek, DayOfWeek.Monday);

要获得一年中第一周的第一个日期,您可以从1月4日开始,然后回到找到星期一:

DateTime t = new DateTime(DateTime.Today,Year, 1, 4);
while (t.DayOfWeek != DayOfWeek.Monday) t = t.AddDays(-1);

答案 1 :(得分:2)

如果您想手动执行此操作,请查看this post

答案 2 :(得分:2)

这应该有效。我过去曾在报道中使用它。我同意它不是很漂亮:

DateTime GetWeekStartDate(int year, int week)
{
    DateTime jan1 = new DateTime(year, 1, 1);
    int day = (int)jan1.DayOfWeek - 1;
    int delta = (day < 4 ? -day : 7 - day) + 7 * (week - 1);

    return jan1.AddDays(delta);
}

计算某一周的开始日期。结束日期时间显然是7天后(独家)。

您可能会发现this code of mine有用。它几乎没有记录,但它在它定义的WeekAndYear结构上实现了一些其他操作。有很大的改进空间。最值得注意的是,它定义了<>运算符,但没有其他运算符,这非常糟糕......但它应该让你开始。

虽然移植到VB6 ......嗯,也许不是:P

答案 3 :(得分:2)

这些功能涵盖了我的要求(适用于ASP Classic,因此适用于数据类型) 希望他们也帮助别人......

Function WeekNumber(dDate)
    Dim d2
    d2 = DateSerial(Year(dDate - WeekDay(dDate - 1) + 4), 1, 3)
    WeekNumber = Int((dDate - d2 + WeekDay(d2) + 5) / 7)
End Function

Function YearStart(iWhichYear)
    Dim iWeekDay
    Dim iNewYear
    iNewYear = DateSerial(iWhichYear, 1, 1)
    iWeekDay = (iNewYear - 2) Mod 7
    If iWeekDay < 4 Then
        YearStart = iNewYear - iWeekDay
    Else
        YearStart = iNewYear - iWeekDay + 7
    End If
End Function

Function WeeksInYear(iYear)
    WeeksInYear = WeekNumber(DateAdd("d", -1, YearStart(iYear + 1)))
End Function

Function WeekStart(iYear, iWeek)
    WeekStart = DateAdd("ww", iWeek - 1, YearStart(iYear))
End Function

Function WeekEnd(iYear, iWeek)
    WeekEnd = DateAdd("d", 6, DateAdd("ww", iWeek - 1, YearStart(iYear)))
End Function

答案 4 :(得分:1)

使用Calendar.GetWeekOfYear方法获取当前日期时间的一周,其余的应该是微不足道的。

对于vb6来说,它不那么琐碎,你最好的办法是找到一个能为你付出辛勤劳动的好图书馆。

答案 5 :(得分:1)

这将为您提供本周的开始

dateAdd(DateAdd(DateInterval.Day, (Now.Day * -1), Now)

要在本周结束时将7天添加到本周开始

答案 6 :(得分:0)

答案 7 :(得分:0)

答案如下,是最容易理解的

	'1 declaramos las variables 
	Public firstdayweek As Date 'variable para capturar el valor de inicio de semana de una fecha dada
	Public lastdayweek As Date 'variable para el valor de la fecha final de una semana de una fecha dada
  

	Friend Property _NSemana As Integer 'indica el numero de la semana 

	Friend Property _iniciosemana As Date 'contiene la primer fecha de la semana dada
  
  'Fuciones para codigo 
  'Funcion para calcular la semana actual en la que estamos
	Function semana() As Date
          _NSemana = (DateDiff(DateInterval.WeekOfYear, DateTime.Today,                                                           New DateTime(DateTime.Today.Year, 1, 1)) *-1)
	End Function
  
  'esta funcion es la que llamaremos para setear cada valor puedes colocarlo en cualquier evento
  
  Public Sub damerangosemana()
		semana()
		_iniciosemana = RangoSemana((_NSemana + 1), Today.Year)
		firstdayweek = _iniciosemana
		lastdayweek = FinSemana(_iniciosemana)
	End Sub
  
  'con esta funcion capturamos el dia de la semana y asignamos la fecha incial 
  Public Function RangoSemana(ByVal WeekNumber As Integer, ByVal year1 As Integer) As Date
		Dim numdia As Integer = 0
		Dim oneDate As String
		Dim PrimerDia As Date

		oneDate = "1/1/" & year1.ToString
		PrimerDia = DateAndTime.DateValue(oneDate)
		'dayOfYear = inDate.DayOfYear
		Select Case PrimerDia.DayOfWeek
			Case DayOfWeek.Sunday
				numdia = 7
			Case DayOfWeek.Monday
				numdia = 1
			Case DayOfWeek.Tuesday
				numdia = 2
			Case DayOfWeek.Wednesday
				numdia = 3
			Case DayOfWeek.Thursday
				numdia = 4
			Case DayOfWeek.Friday
				numdia = 5
			Case DayOfWeek.Saturday
				numdia = 6
		End Select

		Dim x As Date = DateAdd(DateInterval.Day, 0 - numdia, CType(oneDate, Date))
		Dim startdate As Date = DateAdd(DateInterval.WeekOfYear, WeekNumber - 1, x)
		Return startdate
	End Function
  
  'funcion para calcular la fecha final
  Public Function FinSemana(ByVal Date1 As Date) As Date
		Return DateAdd(DateInterval.Day, 7, Date1)
	End Function