infostabil > edb.programmering.* > edb.programmering.general

Bertel Lund Hansen (11.09.2012, 00:11)
Hej alle

Jeg skal bruge en funktion der returnerer det korrekte ugenummer
når jeg kender datoen. Python har godt nok en indbygget mulighed,
men den svarer forkert efter dansk standard:

All days in a new year preceding the first Monday
are considered to be in week 0.

Er der nogen der har en færdig algoritme? Det er næsten
underordnet hvilket sprog den er skrevet i, men jeg arbejder mest
med C-lignende sprog.
Hans Kjærgaard (11.09.2012, 00:46)
Mener at man kigger efter hvor torsdagen (i du uge der ligger i
årsskiftet) er, er den i det nye år er det uge et, er den i det gamle
år er det først den følgende uge der er uge et.

/Hans

On Tue, 11 Sep 2012 00:11:05 +0200, Bertel Lund Hansen
<kanonsalut> wrote:
[..]
Bertel Lund Hansen (11.09.2012, 02:14)
Hans Kjærgaard skrev:

> Mener at man kigger efter hvor torsdagen (i du uge der ligger i
> årsskiftet) er, er den i det nye år er det uge et, er den i det gamle
> år er det først den følgende uge der er uge et.


Ja, men problemet er så at finde ud af ugenummeret hvis det ikke
er uge 1.
Hans Kjærgaard (11.09.2012, 07:19)
On Tue, 11 Sep 2012 02:14:40 +0200, Bertel Lund Hansen
<kanonsalut> wrote:

>Hans Kjærgaard skrev:
>> Mener at man kigger efter hvor torsdagen (i du uge der ligger i
>> årsskiftet) er, er den i det nye år er det uge et, er den i det gamle
>> år er det først den følgende uge der er uge et.

>Ja, men problemet er så at finde ud af ugenummeret hvis det ikke
>er uge 1.


Det burde være simpel regning når man først har fået placeret hvor uge
et starter.

/Hans
Andreas Andersen (11.09.2012, 07:29)
Den 11-09-2012 00:11, Bertel Lund Hansen skrev:
> Hej alle
> Jeg skal bruge en funktion der returnerer det korrekte ugenummer
> når jeg kender datoen. Python har godt nok en indbygget mulighed,
> men den svarer forkert efter dansk standard:
> All days in a new year preceding the first Monday
> are considered to be in week 0.


Det ugenummer du vil have fat i hedder ISO-ugenummer efter en eller
anden ISO-standard. Jeg har ikke en dyt forstand på Python, men hvis man
googler Python og ISO weeknumber får man
[..] - hvor der står at
datetime.isocalendar() returnerer ISO-ugenummeret.
JHB (11.09.2012, 08:32)
"Bertel Lund Hansen" <kanonsalut> skrev i en meddelelse news:6298
[..]
> --
> Bertel
> [..] [..]


Hej Bertel.

Her er en funktion som jeg bruger, der både returnere uge nummeret og året hvor uge nummeret tilhører. Funktionen er skrevet i VBA.

Mvh
Jørn

Function WeekNrAndYear(InputDate As Long) As String
'Denne funktion erstatter den indbyggede FORMAT-funktion for ugenumre da
'Format(En_dato, "ww", vbMonday, vbFirstFourDays), ikke returnere de korrekte uger prøv f.eks. 31-12-2007
'Her returneres uge nr. 53 - det skal være uge nr. 1
Dim a As Integer, B As Integer, C As Long, D As Integer
WeekNrAndYear = 0
If InputDate < 1 Then Exit Function
a = Weekday(InputDate, 1)
B = Year(InputDate + ((8 - a) Mod 7) - 3)
Aar = B
C = DateSerial(B, 1, 1)
D = (Weekday(C, 1) + 1) Mod 7
WeekNrAndYear = Format(CStr(Int((InputDate - C - 3 + D) / 7) + 1), "00") & "-" & CStr(Aar)
End Function
Bertel Lund Hansen (11.09.2012, 09:06)
Hans Kjærgaard skrev:

>>Ja, men problemet er så at finde ud af ugenummeret hvis det ikke
>>er uge 1.


> Det burde være simpel regning når man først har fået placeret hvor uge
> et starter.


Den foregående uge kan være 52 eller 53, og hvis nogen lå med en
færdig rutine, så kunne jeg spare mig det mas.
Bertel Lund Hansen (11.09.2012, 09:13)
JHB skrev:

> Her er en funktion som jeg bruger, der både returnere uge
> nummeret og året hvor uge nummeret tilhører. Funktionen er
> skrevet i VBA.


Tak for det, men den kalder nogle specielle VBA-funktioner, så
det siger mig ikke så meget.
Andreas Andersen (11.09.2012, 09:51)
Den 11-09-2012 09:06, Bertel Lund Hansen skrev:
> Hans Kjærgaard skrev:
>>> Ja, men problemet er så at finde ud af ugenummeret hvis det ikke
>>> er uge 1.

>> Det burde være simpel regning når man først har fået placeret hvor uge
>> et starter.

> Den foregående uge kan være 52 eller 53, og hvis nogen lå med en
> færdig rutine, så kunne jeg spare mig det mas.


Virker det jeg sendte ikke? Nu har jeg lige hurtigt lært mig lidt Python
og med en online-fortolker, viser dette fejlen og fikset:

import datetime
print datetime.date(2011, 9, 11).isocalendar()[1]
print datetime.date(2011, 9, 11).strftime("%U")
Bertel Lund Hansen (11.09.2012, 10:17)
Bertel Lund Hansen skrev:

> Jeg skal bruge en funktion der returnerer det korrekte ugenummer


Jeg fandt selv en generel beskrivelse:

[..]

Se næstsidste afsnit.
Bertel Lund Hansen (11.09.2012, 10:52)
Bertel Lund Hansen skrev:

> Jeg fandt selv en generel beskrivelse:


> [..]


Men den er ikke enig med PHP's rutine.

Her er min uforenklede Python-implementation:

def week_number (year,month,day):
if month<3:
a=year-1
b=a/4-a/100+a/400
c=(a-1)/4-(a-1)/100+(a-1)/400
s=b-c
e=0
f=day-1+31*(month-1)
else:
a=year
b=a/4-a/100+a/400
c=(a-1)/4-(a-1)/100+(a-1)/400
s=b-c
e=s+1
f=day+(153*(month-3)+2)/5+58+s

g=(a+b)%7
d=(f+g-e)%7
n=f+3-d

if n<0:
return 53-(g-5)/5
elif n>364+s:
return 1
else:
return n/7+1

PHP er enig med min Android app.
Bertel Lund Hansen (11.09.2012, 13:32)
Bertel Lund Hansen skrev:

> Men den er ikke enig med PHP's rutine.


Jeg fandt fejlen:

> return 53-(g-5)/5


Det skal være

> return 53-(g-s)/5


altså lille S i stedet for 5.
Andreas Andersen (11.09.2012, 17:29)
Den 11-09-2012 09:51, Andreas Andersen skrev:
> Virker det jeg sendte ikke? Nu har jeg lige hurtigt lært mig lidt Python
> og med en online-fortolker, viser dette fejlen og fikset:
> import datetime
> print datetime.date(2011, 9, 11).isocalendar()[1]
> print datetime.date(2011, 9, 11).strftime("%U")


Jeg er ret sikker på at løsningen jeg angiver, er den rigtige, men jeg
har en mistanke om at jeg er havnet i Bertels killfilter. Det er lidt
fjollet med en egen implementation hvis det findes indbygget i Python,
så hvis nogen vil hjælpe ham, kan de evt. citere mit indlæg.
Anders Wegge Keller (11.09.2012, 19:08)
Andreas Andersen <andreas2411> writes:

> Den 11-09-2012 09:51, Andreas Andersen skrev:
> Jeg er ret sikker på at løsningen jeg angiver, er den rigtige, men jeg
> har en mistanke om at jeg er havnet i Bertels killfilter. Det er lidt
> fjollet med en egen implementation hvis det findes indbygget i Python,
> så hvis nogen vil hjælpe ham, kan de evt. citere mit indlæg.


Det kan også være at Bertel gerne vil lave sin egen implementation,
for derigennem at forstå matematikken bedre.
Bertel Lund Hansen (11.09.2012, 22:34)
Anders Wegge Keller skrev:

>>> import datetime
>>> print datetime.date(2011, 9, 11).isocalendar()[1]
>>> print datetime.date(2011, 9, 11).strftime("%U")


> Det kan også være at Bertel gerne vil lave sin egen implementation,
> for derigennem at forstå matematikken bedre.


Nej, det var ikke formålet. Jeg kender kun 'almindelig
programmering' med Python og vil gerne lære de indbyggede
funktioner og metoder at kende. Jeg har nu benyttet den fidus som
Andreas Andersen angav. Den løser mit problem.

Som jeg har skrevet før, er manualen ikke nem at finde rundt i
(for mig i hvert fald) hvis man leder efter en indbygget funktion
der skal kunne noget bestemt.

Lignende emner