簡體   English   中英

給出C#中的周數和年份,計算一周的開始和結束日期(基於ISO規范)

[英]Calculate the start and end date of a week given the week number and year in C# (based on the ISO specification)

我需要生成一份報告,顯示一年中的52周(或某些年份為53周)及其開始和結束日期。 有一個ISO規范要做到這一點,但看起來非常復雜! 我希望有人知道在C#或Visual Basic中實現它的方法(它實際上用於Visual Basic 6,但我會嘗試將其移植到其中)

您可以使用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);

如果您想手動完成,請查看此帖子

這應該工作。 我過去曾在報道中使用它。 我同意它不是很漂亮:

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天后(獨家)。

您可能會發現我的這段代碼很有用。 它幾乎沒有記錄,但它在它定義的WeekAndYear結構上實現了一些其他操作。 有很大的改進空間。 最值得注意的是,它定義了<>運算符,但沒有其他運算符,這非常糟糕......但它應該讓你開始。

移植到VB6雖然...嗯,也許不是:P

這些功能涵蓋了我的要求(適用於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

使用Calendar.GetWeekOfYear方法獲取當前日期時間的一周,其余的應該是微不足道的。

對於vb6來說,它不那么簡單,你最好的辦法是找到一個能為你付出辛勤勞動的好圖書館。

這將為您提供本周的開始

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

要在本周結束時添加7天到本周開始

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

  '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 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM