[VB.Net] Weeknummer naar Date.

Pagina: 1
Acties:

Onderwerpen


90710

Topicstarter
Hallo mensen,

Ik zit met een probleem. Ik moet een datum van een weeknummer hebben. Dus als ik zou zeggen weeknummer 3 van 2010 dan wil ik dus de week van 18 januari hebben. Nu heb ik al op Google en GoT gezocht maar heb nog geen code gevonden die met jaren van 53 weken werken (zoals vorig jaar). Waardoor als ik nu week 1 opgeef ik dus week 53, bij 2 week 1, bij 3 week 2, enz. krijg.

Dit is de code die ik nu heb:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
    Public Function GetLastOccurenceOfDay(ByVal value As Date, ByVal dayOfWeek As DayOfWeek) As Date
        Dim daysToAdd As Integer = dayOfWeek - value.DayOfWeek
        If daysToAdd < 1 Then
            daysToAdd -= 7
        End If
        Return value.AddDays(daysToAdd)
    End Function

    Public Function GetFirstDateOfWeek(ByVal year As Integer, ByVal week As Integer)
        Return GetFirstDateOfWeek(year, week, Application.CurrentCulture)
    End Function

    Public Function GetFirstDateOfWeek(ByVal year As Integer, ByVal week As Integer, ByVal culture As CultureInfo) As Date
        Return GetLastOccurenceOfDay(New DateTime(year, 1, 1, culture.Calendar).AddDays(7 * (week)), culture.DateTimeFormat.FirstDayOfWeek)
    End Function

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        If nudWeekNumber.Value <> GetWeekNumber(MonthCalendar1.SelectionStart) Then
            Dim fDate As Date = GetFirstDateOfWeek(MonthCalendar1.SelectionStart.Year, nudWeekNumber.Value)
            MonthCalendar1.SelectionStart = fDate
        End If


Kan iemand me helpen?

  • BM
  • Registratie: September 2001
  • Laatst online: 22:00

BM

Moderator Spielerij
C#:
1
2
3
DateTime dt = new DateTime(2010,1,1);
dt.AddDays(<<hierhetaantalweken>>*7);
MessageBox.Show(dt.ToString());


Zoiets?
Hmmz, bedenk me net dat 01-01 niet altijd op een maandag valt :)

Edit: eventjes aan het knutselen geweest.
Welliswaar in C#, maar dat is wel te vertalen.

C#:
1
2
3
4
5
6
7
private static DateTime GetFirstDateFromWeek(int year, int week)
{
      DateTime janFirst = new DateTime(year, 1, 1);
      DateTime dt = ((janFirst.AddDays((int)janFirst.DayOfWeek * -1))).AddDays(1);
      dt = dt.AddDays(week* 7);
      return dt;
}

Dit geeft de maandag terug die in de week ligt die je opgeeft.

Niet uitgebreid getest, (en ook niet helemaal zelf bedacht), maar volgens mij is dit wat je zoekt.

Edit2: code gaat stuk in 2009, dus beter maar niet gebruiken :)

[ Voor 83% gewijzigd door BM op 11-02-2010 14:36 ]

Xbox
Even the dark has a silver lining | I'm all you can imagine times infinity, times three


90710

Topicstarter
De regel is dat wanneer 01-01 op een woensdag (schrikkeljaar) of donderdag valt, dat het nieuwe jaar 53 weken heeft en 01-01-2009 viel op een donderdag.

Wikipedia: Weeknummer

[ Voor 14% gewijzigd door 90710 op 11-02-2010 14:34 ]


  • MueR
  • Registratie: Januari 2004
  • Laatst online: 09:45

MueR

Admin Tweakers Discord

is niet lief

http://msdn.microsoft.com.../hcxe65wz%28VS.71%29.aspx moet je er mee uit kunnen komen.

Dat was overigens wel 10 seconden google op "vb.net date by weeknumber"

[ Voor 27% gewijzigd door MueR op 11-02-2010 14:33 ]

Anyone who gets in between me and my morning coffee should be insecure.


90710

Topicstarter
Thx. Ik zal er gelijk even een C# implementatie van maken.

C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        public DateTime AddWeeks(DateTime date, double weeks)
        {
            if (weeks >= 1)
            {
                weeks = Math.Floor(weeks);
            }
            else
            {
                return AddWeeks(date, 1);
            }
            int _weeks = (int)weeks;

            date = date.AddDays(_weeks * 7.0);

            return date.AddDays(-(int)date.DayOfWeek + 1);
        }


Dit is afgeleid van de werking van de VB code. :) Plus wordt hier altijd de eerste dag van de week gekozen.




Het grappige is, dat dit dus niet gaat werken. Volgens deze methode begint week 1 in 2009 op 5 januari. Wat dus niet klopt (check het wikipedia artikel).

Fix gevonden
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
    Private Function GetFirstDayOfTheWeek(ByVal year As Integer, ByVal week As Integer) As Date

        Dim January4th As Date = DateSerial(year, 1, 4)
        Dim January1th As Date = New Date(year, 1, 1)
        Dim DayOfInterest As Date
        Dim FirstDayWeek1 As Date

        FirstDayWeek1 = January4th.AddDays(1).AddDays(-Weekday(January4th, FirstDayOfWeek.Monday))
        DayOfInterest = January1th.AddDays(((week - 1) * 7 - DateDiff(DateInterval.DayOfYear, FirstDayWeek1, January1th, FirstDayOfWeek.Monday, FirstWeekOfYear.FirstFourDays)))

        Return DayOfInterest

    End Function

[ Voor 122% gewijzigd door 90710 op 11-02-2010 15:48 ]


  • pedorus
  • Registratie: Januari 2008
  • Niet online
Ik kan me voorstellen dat je nu een localisatie-issue krijgt als je bijvoorbeeld "ww" gebruikt met formatten, dus daar moet je dan op letten. Ik zou zelf sowieso iets andere logica gebruiken:
C#:
1
2
3
4
5
6
        public static DateTime GetFirstDayOfWeek(int year, int week)
        {
            var dt = new DateTime(year, 1, 1);
            return dt.AddDays(week * 7 - ((int)dt.DayOfWeek) + 
                ((dt.DayOfWeek > DayOfWeek.Thursday) ? 1 : -6));
        }

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


90710

Topicstarter
Thx dat werkt idd een stuk beter. :) Wel een vreemde manier van variabele declareren, die kende ik nog niet :+

[ Voor 50% gewijzigd door 90710 op 11-02-2010 23:12 ]


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 22:28

TeeDee

CQB 241

offtopic:
Hebben we het over de 'var'? Loopt ook een topic over op GOT!

Wellicht dat je de Gregoriann Calendar class ff moet doorlopen...

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

90710

Topicstarter
offtopic:
\[C#][discussie] Lekker veel var gebruiken? bedoel je? Ja die had ik even doorgelezen toen ik 'var' zag staan. Ziet er wel handig uit. Doet me wel denken aan 'Dim' in VB (en dat is goed)


Gregorian had ik al geprobeerd, maar wat pedorus poste werkt net zo goed :+

Zijn code omgezet naar VB.Net (want daar ging het om)
Visual Basic .NET:
1
2
3
4
    Public Shared Function GetFirstDayOfWeek(ByVal year As Integer, ByVal week As Integer) As DateTime
        Dim dt As New DateTime(year, 1, 1)
        Return dt.AddDays(CDbl(((week * 7) - dt.DayOfWeek) + If(dt.DayOfWeek > DayOfWeek.Thursday, 1, -6)))
    End Function


Bedankt iedereen, het probleem is opgelost :)

[ Voor 49% gewijzigd door 90710 op 12-02-2010 09:23 ]

Pagina: 1