|
| [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.
| |
|
|