Avatar billede tangveje Nybegynder
07. januar 2003 - 21:14 Der er 19 kommentarer og
1 løsning

Måneder i anden rækkefølge

Hej, hvis jeg har variablen $m der indeholder måneden (et tal fra 1 til 12), og jeg skal have lavet om i rækkefølgen så 1 = marts, 2 = april og så videre? OK måske svært at forstå, prøver at uddybe det lidt :)

$m skal omdannes til et tal mellem 3 og 14 (istedet for 1-12). Hvis $m = 1 skal den laves om til 14, er $m = 2 skal den laves om til 13, er $m = 3 skal den laves om til 1, er $m = 4 skal den laves om til 2 og så videre.

Kan ikke lige regne ud hvordan det gøres, selvom det vel er ganske simpelt når man ved det :) Og nej, jeg vil ikke bruge en IF-ELSE løsning, må kunne gøres med en formel af en art.
Avatar billede dgivoni Nybegynder
07. januar 2003 - 21:31 #1
jeg forstår ikke hvad du mener???
paa den ene side siger du, at "$m skal omdannes til et tal mellem 3 og 14" og paa den anden side siger du at "er $m = 3 skal den laves om til 1".
Det er lidt selvmodsigende, saa kunne du ikke forklare lidt bedre, evt. stille alle 'omregningerne' op?
Avatar billede jakoba Nybegynder
07. januar 2003 - 21:36 #2
$kodearray = array( 0, 14, 13, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 );

$nym = $kodearray[ $m ];

de tal jeg har fyldt i er sikkert gale, men mon ikke du kan se ideen :-))

mvh JakobA
Avatar billede tangveje Nybegynder
07. januar 2003 - 21:36 #3
Ja det kan jeg kun give dig ret i, men er selv lidt forvirret over den, og kom vist til at vrøvle :) Jeg omformulerer den lige, så den skulle være korrekt

$m skal omdannes til et tal mellem 3 og 14 (istedet for 1-12). Hvis $m = 1 skal den laves om til 14, er $m = 2 skal den laves om til 13, er $m = 3-12 skal den ikke laves om.

Hvilket jo egentlig kunne laves med en

if ( $m == 1 ) {
  $m = 14 ;
} else if ( $m == 2 ) {
  $m = 13 ;
}

Damn, det går godt for mig... Men vil alligevel høre om det ikke kan laves med en lille formel, så jeg slipper for at have nogen IF'er
Avatar billede tangveje Nybegynder
07. januar 2003 - 21:38 #4
Jakoba > Jo kan sagtens se ideen, og den er vel ikke helt dårlig :)
Avatar billede tangveje Nybegynder
07. januar 2003 - 21:42 #5
Kan ikke bestemme mig for hvilken af de 2 løsninger jeg vil bruge... Men uanset hvad må du gerne lægge et svar jakoba :)
Avatar billede tangveje Nybegynder
07. januar 2003 - 21:52 #6
Jeg er da godt nok lidt for forvirret... Vi prøver på en anden måde, for jeg kan slet ikke tænke i dag... Her er et link til det jeg forsøger at omskrive til PHP

http://oldwww.cs.umu.se/tdb/kurser/TDBA42/VT96/zeller.html

Det er lykkedes mig meget godt ind til videre, og min funktion ser således ud

// int zellers( int month, int day, int year )
function zellers( $m, $d, $y ) {
  $c = substr( $y, 0, 2 ) ;
  $y = substr( $y, 2, 2 ) ;

  if ( $m == 1 ) {
    $m = 14 ;
  } else if ( $m == 2 ) {
    $m = 13 ;
  }

  $v = ( floor( 2.6 * $m - 0.2 ) + $d + $y + floor( $y / 4 ) + floor( $c / 4 ) - 2 * $c ) % 7 ;

  return $v ;
}

Eneste jeg mangler er at få det med måneden til at virke... Forhøjer forresten lige points, og håber i vil hjælpe mig så jeg kan sove i nat :)
Avatar billede tangveje Nybegynder
07. januar 2003 - 22:01 #7
Jeg går i seng! JakobA, din kode virkede jo selv med de værdier du havde proppet i den... Du har reddet min dag :)
Avatar billede jakoba Nybegynder
07. januar 2003 - 22:23 #8
jeg er lidt ked af at de to første værdier 'tæller nedad' når resten tæller opad. er du sikker på det du vil have ikke er:
  1 -> 13,  2 -> 14,  3 -> 3,  4 -> 4, ...
der rækkefølge kan laves ret nemt med:
  $nym = ( ( 9 + $m ) % 12 ) + 3;
Avatar billede tangveje Nybegynder
07. januar 2003 - 22:29 #9
JakobA > Jeg tør snart ikke sige hvad jeg er sikker på, i hvert fald ikke i dag, synes det blev forvirrende nok :) Men du kan jo tage et kig på mit link tidligere, jeg håber jeg har forstået det korrekt, og det ser også ud til at det virker sådan som jeg har forstået det.
Avatar billede jakoba Nybegynder
07. januar 2003 - 22:59 #10
Nu er jeg også forvirret :(  såvidt jeg kan se kræver Zeller slet ikke at $m transformeres?
men tak for points :-))
Avatar billede tangveje Nybegynder
07. januar 2003 - 23:08 #11
Så lidt :)

Det er i denne forklaring jeg mener at kunne læse at måneden skal transformeres

"där [x] betecknar heltalsdelen av x, v är veckodagen (0=söndag, 1=måndag osv), d dagen, m måndaden (1=mars, 2=april osv), y de två sista siffrorna i årtalet och c århundradet."

Helt præcist denne del "m måndaden (1=mars, 2=april osv)", så vidt jeg kan læse (på trods af at mit svenske er ret dårligt :), starter den med marts og ikke januar som man vel normalt ville gøre
Avatar billede jakoba Nybegynder
07. januar 2003 - 23:08 #12
nå jo "m måndaden (1=mars, 2=april osv)" så tror jeg faktisk det skal være:
  1 -> 11,  2 -> 12,  3 -> 1,  4 -> 2, ...
der rækkefølge kan laves ret nemt med:
  $nym = ( ( 9 + $m ) % 12 ) + 1;
Avatar billede tangveje Nybegynder
07. januar 2003 - 23:15 #13
Tja, dette er så et underligt forsøg på at stille det logisk op, hvilket bare gjorde mig mere forvirret, muligvis har du ret, jeg vil straks lave en lidt mere omfattende test for at få det afklaret :)

1 -> Marts (normalt 3)
2 -> April (normalt 4)
3 -> Maj (normalt 5)
4 -> Juni (normalt 6)
5 -> Juli (normalt 7)
6 -> August (normalt 8)
7 -> September (normalt 9)
8 -> Oktober (normalt 10)
9 -> November (normalt 11)
10 -> December (normalt 12)
11 -> Januar (normalt 1)
12 -> Februar (normalt 2)
Avatar billede tangveje Nybegynder
07. januar 2003 - 23:23 #14
OK, ingen af delene virker helt korrekt... Dette er så min kode nu, og hvis du selv prøver, kan du se at de 2 tal den printer ud ikke er ens, hvilket de vel burde være

function zellers( $m, $d, $y ) {
  $c = substr( $y, 0, 2 ) ;
  $y = substr( $y, 2, 2 ) ;

  $m = ( ( 9 + $m ) % 12 ) + 1 ;

  $v = ( floor( 2.6 * $m - 0.2 ) + $d + $y + floor( $y / 4 ) + floor( $c / 4 ) - 2 * $c ) % 7 ;

  return $v ;
}

echo zellers( 1, 24, 1981 ) . "<br>" ;
echo date( "w", mktime( 0,0,0,1,24,1981 ) ) ;
Avatar billede jakoba Nybegynder
07. januar 2003 - 23:26 #15
netop, men pas på med at vende pilen korrekt, du kommer med et femtal i hånden i maj og skal så transformere så der bliver sat et 3'tal i formelen
Avatar billede tangveje Nybegynder
07. januar 2003 - 23:35 #16
OK, så burde denne jo være rigtig

if ( $m == 1 ) {
  $m = 11 ;
} else if ( $m == 2 ) {
  $m = 12 ;
} else {
  $m = $m - 2 ;
}

Ligesom din

$m = ( ( 9 + $m ) % 12 ) + 1 ;

De ser i hvert fald ud til at give samme resultat begge 2.

Men hvorfor virker det så ikke? Enten har vi gjort noget galt, eller også er folkene bag PHP galt på den, jeg tror mest oå det første, ved ikke helt hvorfor :)
Avatar billede jakoba Nybegynder
08. januar 2003 - 04:35 #17
Jeg har leget lidt med det: http://hjem.get2net.dk/Jakob.Aggernaes/temp/exp302230.html
og såvidt jeg kan se er der ikke nogen simpel regel der vil få zellers formel til at virke for januar og februar

mvh JakobA
Avatar billede tangveje Nybegynder
08. januar 2003 - 04:58 #18
Jeg har også selv søgt lidt... Det er dog ikke meget man finder på google om emnet. Det lykkedes mig dog at finde et eksempel i Perl og et i C++ men de virkede heller ikke optimalt. Ligeledes viser det sig at zellers også er brugt i et PEAR projekt, men det virker heller ikke helt optimalt, rent faktisk løb jeg ind i de samme problemer med alle 3 scripts... Enten ville det ikke virke for januar og februar, eller også ville det ikke virke hvis det 3. ciffer i årstallet er et 0 (f.eks. 1909 og 2002) om man kan løse det problem ved jeg ikke, men det kunne gå hen og blive svært når en sådan "fejl" umidelbart accepteres.

Eneste mulighed jeg lige kan se er at få fat i PHP-sourcen og grave sig igennem den, til man finder frem til hvordan de har gjort, og så kan det jo næsten være ligemeget :) Hvis vi altså tror på at PHP-teamet har fået udviklet en fejlfri metode :)
Avatar billede tangveje Nybegynder
08. januar 2003 - 05:36 #19
Hvis du skulle være interesseret i at rode yderligere med det, så fandt jeg dette, som muligvis kan være nyttigt

http://fn2.freenet.edmonton.ab.ca/~martinh/9bcalend.htm

Der er en rimelig god forklaring, samt et BASIC program (ved dog ikke om det virker). Der står også at for januar og februar skal der trække 1 fra årstallet.
Avatar billede tangveje Nybegynder
24. maj 2003 - 15:33 #20
Det lykkedes mig endelig at tage mig sammen og få kigget på det igen, og jeg har formået at få det til at virke. Følgende funktion har jeg testet med alle datoer fra 1970 - 2003 uden fejl, så jeg tør vidst godt sige at den virker nu :)

Ville bare lige poste det, hvis andre skulle sidde med samme problem

function zellers( $d, $m, $y )
{
    $m -= 2 ; // Subtract two from month?
 
    if ( $m <= 0 ) // Prior year?
    {               
        $m += 12 ; // adjust month
        $y-- ; // adjust year
    }
 
    $c = floor( $y / 100 ) ; // Extract century
    $y %= 100 ;    // extract year in century

    $f = ( floor( 2.6 * $m - 0.2 ) + $d + $y + floor( $y / 4 ) + floor( $c / 4 ) - 2 * $c ) % 7 ; // Zellers
 
    $f += ( $f < 0 ) ? 7 : 0 ;    // fix for negative number.
       
    switch( $f )
    {
        case 0 : return "Sunday" ; break ;
        case 1 : return "Monday" ; break ;
        case 2 : return "Tuesday" ; break ;
        case 3 : return "Wednesday" ; break ;
        case 4 : return "Thursday" ; break ;
        case 5 : return "Friday" ; break ;
        case 6 : return "Saturday" ; break ;
    }
}
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester