|  | 		    
					
        
         
          
         
	
          | |  | [VB6] Ugenummer forvirring Fra : Jan Eliasen
 | 
 Dato :  21-04-03 21:30
 | 
 |  | Hejsa
 
 Jeg sidder og leger med en kalender, og har lidt problemer med at få VB til
 at give mig de rigtige ugenumre.
 
 Hvis jeg har en variabel dato af typen Date, der er sat til 27/12-2003 og et
 klokkeslet, så giver følgende kode mig noget forkert:
 
 For i = 1 To 10
 dato = dato + 1
 MsgBox ("Dato: " & dato & " er en " & Format$(dato, "dddd",
 vbMonday, vbFirstFourDays) & " i uge " & Format$(dato, "ww", vbMonday,
 vbFirstFourDays))
 Next
 
 Det jeg gør er bare at skrive de 10 næste datoer ud efter d. 27/12 og får
 følgende:
 28/12 er en søndag i uge 52
 29/12 er en mandag i uge 53
 30/12 er en tirsdag i uge 1
 31/12 er en onsdag i uge 1
 1/1 er en torsdag i uge 1
 2/1 er en fredag i uge 1
 3/1 er en lørdag i uge 1
 4/1 er en søndag i uge 1
 5/1 er en mandag i uge 2
 6/1 er en tirsdag i uge 2
 
 De tkan jo ikke passe. Hvordan kan det være, at den sætter d. 29/12 til at
 være i uge 53? Den skal være i uge 1, så vidt jeg kan se.
 
 Jeg takker for enhver hjælp!
 
 --
 Eliasen Jr.
 
 
 
 
 |  |  | 
  Tele Danmark (22-04-2003) 
 
	
          | |  | Kommentar Fra : Tele Danmark
 | 
 Dato :  22-04-03 16:24
 | 
 |  | Hej
 
 Samme problem i Excel. med funktionen UGE:NR
 
 Prøv bare at se returværdien for denne periode
 
 25-12-2004 52
 26-12-2004 53
 27-12-2004 53
 28-12-2004 53
 29-12-2004 53
 30-12-2004 53
 31-12-2004 53
 01-01-2005 1
 02-01-2005 2
 03-01-2005 2
 04-01-2005 2
 05-01-2005 2
 
 
 Jeg blev nød til at lave min egen funktion:
 
 (Dagen i måneden) + Månedsdage + Skuddag + Restdage
 
 Dagen i måneden er nem nok  27/12 = 27, 3/5 = 3 o.s.v.
 Månedsdage: Jan = 0, Feb = 31+0, Mar = 31+28+0, Apr = 31+28+31+0 o.s.v.
 Skuddag: Hvis månden ikke er jan eller feb samt året et skudår = +1
 Restdage afhænger af hvilken dag den 1/1 falder på: man = 0, tirs = 1, ons =
 2, tors = 3, fre = -3, lør = -2 og søn = -1
 
 Summen deles med 7 og rundes op til hele tal.
 
 Desvære skal man være forsigt med denne funktion hvis datoen er 29-31
 december samt 1-3 januar, idet de kan inddrages i næste/sidste år.
 Så til de datoer laves en speciel funktion
 Ligger den 29/12 på en Mandag så er den ugenr 1
 Ligger den 30/12 på en mandag eller tirsdag så er den ugenr 1
 Ligger den 31/12 på en mandag, tirsdag eller onsdag så er den ugenr 1
 Ligger den 1/1 på en fredag, lørdag eller søndag er den samme ugenr som
 31/12 sidste år
 Ligger den 2/1 på en lørdag eller søndag er den samme ugenr som 31/12 sidste
 år
 Ligger den 3/1 på en søndag er den samme ugenr som 31/12 sidste år
 
 SA
 
 "Jan Eliasen" <jan@eliasen.dk> skrev i en meddelelse
 news:cyYoa.27385$y3.2176814@news010.worldonline.dk...
 > Hejsa
 >
 > Jeg sidder og leger med en kalender, og har lidt problemer med at få VB
 til
 > at give mig de rigtige ugenumre.
 >
 > Hvis jeg har en variabel dato af typen Date, der er sat til 27/12-2003 og
 et
 > klokkeslet, så giver følgende kode mig noget forkert:
 >
 >    For i = 1 To 10
 >         dato = dato + 1
 >         MsgBox ("Dato: " & dato & " er en " & Format$(dato, "dddd",
 > vbMonday, vbFirstFourDays) & " i uge " & Format$(dato, "ww", vbMonday,
 > vbFirstFourDays))
 >     Next
 >
 > Det jeg gør er bare at skrive de 10 næste datoer ud efter d. 27/12 og får
 > følgende:
 > 28/12 er en søndag i uge 52
 > 29/12 er en mandag i uge 53
 > 30/12 er en tirsdag i uge 1
 > 31/12 er en onsdag i uge 1
 > 1/1 er en torsdag i uge 1
 > 2/1 er en fredag i uge 1
 > 3/1 er en lørdag i uge 1
 > 4/1 er en søndag i uge 1
 > 5/1 er en mandag i uge 2
 > 6/1 er en tirsdag i uge 2
 >
 > De tkan jo ikke passe. Hvordan kan det være, at den sætter d. 29/12 til at
 > være i uge 53? Den skal være i uge 1, så vidt jeg kan se.
 >
 > Jeg takker for enhver hjælp!
 >
 > --
 > Eliasen Jr.
 >
 >
 
 
 
 
 |  |  | 
  Tomas Christiansen (22-04-2003) 
 
	
          | |  | Kommentar Fra : Tomas Christiansen
 | 
 Dato :  22-04-03 21:53
 | 
 |  | Jan Eliasen skrev:
 > Jeg sidder og leger med en kalender, og har lidt problemer med at få VB
 til
 > at give mig de rigtige ugenumre.
 
 Den er go' nok: Den er dårlig.
 
 Det er desværre en kendt fejl i Microsoft's produkter som indeholder VB
 eller varianter heraf.
 Microsoft har kendt til fejlen i mange år, men mener åbenbart, at den lille,
 ubetydelige del af verden, som bruger ISO-metoden til at bestemme hvilket
 ugenummer en given dato hører til, godt kan leve med fejlen(e).
 
 Her er de første 20 fejl fra den dato som du selv nævner:
 (format: rigtig ugenr "/" MS ugenr ugedag dato)
 1: 52/52 sø 2003-12-28 1/53 ma 2003-12-29 1/1 ti 2003-12-30
 2: 52/52 sø 2007-12-30 1/53 ma 2007-12-31 1/1 ti 2008-01-01
 3: 52/52 sø 2019-12-29 1/53 ma 2019-12-30 1/1 ti 2019-12-31
 4: 52/52 sø 2031-12-28 1/53 ma 2031-12-29 1/1 ti 2031-12-30
 5: 52/52 sø 2035-12-30 1/53 ma 2035-12-31 1/1 ti 2036-01-01
 6: 52/52 sø 2047-12-29 1/53 ma 2047-12-30 1/1 ti 2047-12-31
 7: 52/52 sø 2059-12-28 1/53 ma 2059-12-29 1/1 ti 2059-12-30
 8: 52/52 sø 2063-12-30 1/53 ma 2063-12-31 1/1 ti 2064-01-01
 9: 52/52 sø 2075-12-29 1/53 ma 2075-12-30 1/1 ti 2075-12-31
 10: 52/52 sø 2087-12-28 1/53 ma 2087-12-29 1/1 ti 2087-12-30
 11: 52/52 sø 2091-12-30 1/53 ma 2091-12-31 1/1 ti 2092-01-01
 12: 52/52 lø 2101-01-01 52/53 sø 2101-01-02 1/1 ma 2101-01-03
 13: 52/52 sø 2103-12-30 1/53 ma 2103-12-31 1/1 ti 2104-01-01
 14: 52/52 sø 2115-12-29 1/53 ma 2115-12-30 1/1 ti 2115-12-31
 15: 52/52 sø 2127-12-28 1/53 ma 2127-12-29 1/1 ti 2127-12-30
 16: 52/52 sø 2131-12-30 1/53 ma 2131-12-31 1/1 ti 2132-01-01
 17: 52/52 sø 2143-12-29 1/53 ma 2143-12-30 1/1 ti 2143-12-31
 18: 52/52 sø 2155-12-28 1/53 ma 2155-12-29 1/1 ti 2155-12-30
 19: 52/52 sø 2159-12-30 1/53 ma 2159-12-31 1/1 ti 2160-01-01
 20: 52/52 sø 2171-12-29 1/53 ma 2171-12-30 1/1 ti 2171-12-31
 
 De rigtige ugenumre (dem lige før hver skråstreg) er fremkommet ved brug af
 følgende kode (som jeg ikke selv har skrevet):
 
 Private Function WeekNumber(InDate As Date) As Integer
 Dim DayNo As Integer
 Dim StartDays As Integer
 Dim StopDays As Integer
 Dim StartDay As Integer
 Dim StopDay As Integer
 Dim VNumber As Integer
 Dim ThurFlag As Boolean
 
 DayNo = Days(InDate)
 StartDay = Weekday(DateSerial(Year(InDate), 1, 1)) - 1
 StopDay = Weekday(DateSerial(Year(InDate), 12, 31)) - 1
 ' Number of days belonging to first calendar week
 StartDays = 7 - (StartDay - 1)
 ' Number of days belonging to last calendar week
 StopDays = 7 - (StopDay - 1)
 ' Test to see if the year will have 53 weeks or not
 If StartDay = 4 Or StopDay = 4 Then ThurFlag = True Else ThurFlag = False
 VNumber = (DayNo - StartDays - 4) / 7
 ' If first week has 4 or more days, it will be calendar week 1
 ' If first week has less than 4 days, it will belong to last year's
 ' last calendar week
 If StartDays >= 4 Then
 WeekNumber = Fix(VNumber) + 2
 Else
 WeekNumber = Fix(VNumber) + 1
 End If
 ' Handle years whose last days will belong to coming year's first
 ' calendar week
 If WeekNumber > 52 And ThurFlag = False Then WeekNumber = 1
 ' Handle years whose first days will belong to the last year's
 ' last calendar week
 If WeekNumber = 0 Then
 WeekNumber = WeekNumber(DateSerial(Year(InDate) - 1, 12, 31))
 End If
 End Function
 
 Private Function Days(DayNo As Date) As Integer
 Days = DayNo - DateSerial(Year(DayNo), 1, 0)
 End Function
 
 -------
 Tomas
 
 
 
 |  |  | 
  Tim Sørensen (23-04-2003) 
 
	
          | |  | Kommentar Fra : Tim Sørensen
 | 
 Dato :  23-04-03 07:20
 | 
 |  |  |  |  | 
  Tomas Christiansen (23-04-2003) 
 
	
          | |  | Kommentar Fra : Tomas Christiansen
 | 
 Dato :  23-04-03 21:48
 | 
 |  | 
 
            Tim Sørensen skrev:
 > Brug min metode:
 >
http://www.planet-source-code.com/vb/scripts/ShowCode.asp?txtCodeId=25685&ln > gWId=1
 Sig mig, har du en meget syg humor eller...
 Vi er nogle stykker, som har argumenteret for, at Microsofts rutiner til at
 udregne ugenummer efter ISO-metoden IKKE virker!
 Hvorfor så komme med et forslag, som:
 1. Beregner visse datoer forkert, som tidligere argumenteret for.
 2. Beregner ugenumre efter amerikansk standard, og derfor slet ikke kan
 bruges i Danmark.
 3. I princippet blot er en delmængde af hvad man kan med Format-funktionen -
 ikke noget "nyt".
 (stort spørgsmålstegn) ?
 -------
 Tomas
            
             |  |  | 
   Tim Sørensen (24-04-2003) 
 
	
          | |  | Kommentar Fra : Tim Sørensen
 | 
 Dato :  24-04-03 06:39
 | 
 |  | "Tomas Christiansen" <toc-01-nospam@blikroer.dk> wrote
 > Sig mig, har du en meget syg humor eller...
 
 Det har jeg sgu sikkert.
 Åbenbart har jeg misfortået sp.
 
 --
 Mvh.... Tim Sørensen
 56º 24'209 N / 10º 55'631 E
 
 
 
 
 |  |  | 
  Jan Eliasen (23-04-2003) 
 
	
          | |  | Kommentar Fra : Jan Eliasen
 | 
 Dato :  23-04-03 19:24
 | 
 |  | 
 "Jan Eliasen" <jan@eliasen.dk> wrote in message
 news:cyYoa.27385$y3.2176814@news010.worldonline.dk...
 > Jeg sidder og leger med en kalender, og har lidt problemer med at få VB
 til
 > at give mig de rigtige ugenumre.
 Tak til Jer alle for jeres svar... Men I kom for sent    Jeg fandt en calender-faq på nettet, der havde en algoritme til at bestemme
 ugenummeret, og de to timer jeg brugte på at fjolle rundt med VB's uge-dims
 blev gjort til skamme af de 3 minutter det tog lige at implementere den
 algoritme jeg fandt på nettet. Suk!    Ved nogen om det er rettet i VB.NET?
 --
 Eliasen Jr.
            
             |  |  | 
 |  |