[VB] Datum berekenen vanuit jaar en weeknummer

Pagina: 1
Acties:
  • 812 views sinds 30-01-2008
  • Reageer

Acties:
  • 0 Henk 'm!

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 10:34
Als je mijn topictitel bekijkt lijkt het niet zo heel erg moeilijk, maar ik ben hier nu al een paar uur mee bezig en ik krijg het niet voor elkaar. Ik heb in mijn code een aantal waarden van waaruit ik een datum wil bepalen.

Om een voorbeeld te geven; ik heb als waardes het jaar 2006 en weeknummer 50. Nu wil ik dat mijn code de eerste dag van deze week teruggeeft, in dit geval dus 11-dec-2006. Nu heb ik al ontzettend veel geprobeerd met allerlei functies (datepart, format), maar ik krijg het niet voor elkaar. Probleem is dat ik altijd de datum van het jaar 1899 terug krijg, terwijl de data van de weken in elk jaar anders zijn.

Weet iemand van jullie hoe je dit moet doen?

offtopic:
Even ter info; ik weet dat dit lijkt op een verkapt 'schrijf aub mijn code topic', maar dat is het absoluut niet. Ik heb erg veel gezocht op GOT, google, groups.google, etc, maar ik kan echt niet vinden hoe ik dit moet doen. Als iemand mij op een juist spoor kan zetten zou ik al heel blij zijn.

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

• Week 1 is de eerste week waar minimaal 4 dagen van januari inzitten.
• Een week heeft zeven dagen.
• Tel het aantal dagen dat je nodig hebt op bij de eerste dag van week 1.
• Tip: van week 1 naar 2 is 7 dagen, van 1 naar 3 is 14 dagen.
• Pas op voor Fencepost fouten

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Paul
  • Registratie: September 2000
  • Laatst online: 15:53
Heb je Google al geprobeerd? Ik heb "vb date weeknumber" ingegeven en het stroomt over van de voorbeelden? Vul letterlijk die zoekstring in en bekijk bijvoorbeeld de 3e hit

"Your life is yours alone. Rise up and live it." - Richard Rahl
Rhàshan - Aditu Sunlock


Acties:
  • 0 Henk 'm!

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 21-09 18:14
Ik heb toevallig al zoiets liggen:


Visual Basic:
1
2
3
4
5
6
7
8
9
10
11
12
13
Function DateFromWeekNumber(Year As Integer, WeekNumber As Integer) As Date
'Determines the date of the monday of a given year and weeknumber.


Dim StartDate As Date

' set startdate at 4 january of the given year
StartDate = DateValue("4 jan " & Year)
' determine the date of monday of the 4-jan week
StartDate = StartDate - (Weekday(StartDate, vbMonday) + 6) Mod 7
' add the weeknumbers to the first monday (1st week) of the given year
DateFromWeekNumber = DateAdd("ww", WeekNumber - 1, StartDate)
End Function

Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

Voorkauwen! Nuttig!

[ Voor 140% gewijzigd door een moderator op 24-10-2006 12:50 ]

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • Masch
  • Registratie: Augustus 2002
  • Laatst online: 10:34
Bedankt voor de informatie. Zoals Kenneth al aangeeft is nu mijn probleem opgelost, maar snap ik nog niet goed hoe het nou moet. Ik zal aan de hand van Rizzy's code mijn vragen hier neerleggen. Even ter info, ik ben geen progger, vb is een uit de hand gelopen hobby voor mij. Het kan dus zijn dat ik voor jullie domme vragen stel. :D

Visual Basic:
1
2
3
4
Function DateFromWeekNumber(Year As Integer, WeekNumber As Integer) As Date
'Determines the date of the monday of a given year and weeknumber.

Dim StartDate As Date
Dit stuk snap ik helemaal.
Visual Basic:
1
2
' set startdate at 4 january of the given year
StartDate = DateValue("4 jan " & Year)
Hier ging ik al de fout in; ik was er niet opgekomen dat 4 januari altijd in week 1 valt. Vanuit hier kun je dus verder gaan met de berekening waarbij ik dus iets niet snap :p
Visual Basic:
1
2
' determine the date of monday of the 4-jan week
StartDate = StartDate - (Weekday(StartDate, vbMonday) + 6) Mod 7

Okay, deze regel is dus even abacadabra voor mij. Ik snap dat je hier de eerste datum van week 1 in de variabele StartDate wilt hebben, logisch, omdat je vanuit die datum verder kunt gaan rekenen. Het stukje wat ik dus niet snap is hetgene 'mod' doet?
Visual Basic:
1
2
3
' add the weeknumbers to the first monday (1st week) of the given year
DateFromWeekNumber = DateAdd("ww", WeekNumber - 1, StartDate)
End Function

Ook dit stuk code is mij duidelijk. Ik kende alleen de functie DateAdd niet, maar een stuk lezen in de help heeft mij dat duidelijk gemaakt.

Mijn vraag dus om dit allemaal te begrijpen; wat doet het stuk 'mod' in dit geheel?

(\__/) Ik wist totaal niet wat hier neer te zetten....
(='.'=) Dus het werd....
("")("") Een konijn!!


Acties:
  • 0 Henk 'm!

  • kenneth
  • Registratie: September 2001
  • Niet online

kenneth

achter de duinen

mod is modulus, wat de rest van 'n deling is. Je kan dus voor (x mod 7) zeggen dat de uitkomst altijd [0..6] is (voor positieve getallen)

Trouwens, mooi voorbeeldje van slecht commentaar:
Visual Basic:
1
2
' set startdate at 4 january of the given year
StartDate = DateValue("4 jan " & Year) 
Leg dan uit wáárom je 4 januari neemt, dat 4 januari als StartDate wordt gezet, is gewoon letterlijk zeggen wat de code doet :)

offtopic:
Waarom is mijn bericht 140% gewijzigd door 'Een moderator'? Terwijl de originele tekst er nog staat??

Look, runners deal in discomfort. After you get past a certain point, that’s all there really is. There is no finesse here.


Acties:
  • 0 Henk 'm!

  • riZZy
  • Registratie: Februari 2004
  • Laatst online: 21-09 18:14
Kenneth, wat betreft de commentaarregels heb je helemaal gelijk. Dat is inderdaad niet heel nuttig om te documenteren. Was ook meer even een snel quick en dirty projectje.

Ook snap ik dat de TS hier zo niet veel van leert; maar als hij dat wil, dan kan hij zich zelf nog wel verdiepen in de code.

Om verdere opmerkingen te voorkomen: bovenstaande code is maar 1 van de mogelijke oplossingen. en dan heb ik het niet over de implementatie (hoe de code is geschreven), maar over de weeknummer definitie. Deze kan namelijk heel erg verschillen van bedrijf tot bedrijf.

Overigens is bovenstaande oplossing de ISO standaard. Als je zoekt op weeknummer en ISO dan zul je daar dan ook vinden dat 4 jan altijd in de eerste week valt.



nog even een paar voorbeeldjes over mod

9 mod 7 = 2 (negen gedeeld door zeven = 1 en dan hou je nog 2 over)
14 mod 7 = 0 (veertien gedeeld door zeven = 2 en dan hou je nog 0 over)

14 mod 2 = 0
15 mod 2 = 1

(offtopic: met de mod 2 kun je dus ook bekijken of een getal even of oneven is)

[ Voor 17% gewijzigd door riZZy op 24-10-2006 14:41 ]

Pagina: 1