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