Yankes Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 (endret) Muligens en litt dårlig emnetittel, men har et spørsmål ang. Unix Epoch.. Jeg har en side lagde for mange år siden, der jeg skrev inn registreringsdatoen på brukerne og alt annet med ren tekst. Altså ikke date("U"); men date("d.m.y H:i:s"); Dette er noe som irriterer meg at jeg gjorde, men fant ut at dette kunne jeg gjøre noe med med litt matte. Jeg lagde derfor en PHP snutt som regner ut datoen til sekunder. Jeg fikk det til, men fant ut noe underlig. Etter min mening så har det vært 10 skuddår siden 01.01.1970 00:00:00 (72, 76, 80, 84, 88, 92, 96, 00, 04, 08) Men jeg får kun kodesnutten min til å funke om jeg skriver inn at det har vært 9 skuddår :o Er det noen som sitter med svaret på hvordan det kan ha seg? <?php $minute = 60; // antall sekunder i ett minutt $hour = $minute * 60; // antall sekunder i en time $day = $hour * 24; // antall sekunder i en dag $year = $day * 365; // antall sekunder i et år $skudd_for_2008 = 8; // antall skuddår før 2008 $skudd_etter_2008 = 9; // antall skuddår fra og med 2008 (f.o.m Mars selvfølgelig) $skuddaar_for_2008 = $skudd_for_2008 * $day; $skuddaar_etter_2008 = $skudd_etter_2008 * $day; $timestamp = "01.03.08 15:36:51"; // Datoen som skal regnes om til sekunder $dager_maned = array( 1 => "31", 2 => "28", 3 => "31", 4 => "30", 5 => "31", 6 => "30", 7 => "31", 8 => "31", 9 => "30", 10 => "31", 11 => "30", 12 => "31" ); $klokkedato = explode(" ", $timestamp); $dato = $klokkedato[0]; $klokke = $klokkedato[1]; $dma = explode(".", $dato); $dag = $dma[0]; $maned = $dma[1]; $aar = "20".$dma[2]; $tms = explode(":", $klokke); $time = $tms[0]; $minutt = $tms[1]; $sekund = $tms[2]; $unix_years = $aar - 1970; $unix_years = $unix_years * $year; $unix_days = $dag * $day; $unix_hours = $time * $hour; $unix_minutes = $minutt * $minute; if($maned < 10) $maned = str_replace("0", "", $maned); $maned_dager[0] = 0; $i = 1; while($i < $maned) { $md = $i - 1; $maned_dager[$i] = $maned_dager[$md] + $dager_maned[$i]; $i++; } $i = $i - 1; $maned_dager = $maned_dager[$i] * $day; $sektot_am = $unix_years + $maned_dager; $sektot_amd = $unix_days + $sektot_am; $sektot_amdt = $unix_hours + $sektot_amd; $sektot_amdtm = $unix_minutes + $sektot_amdt; $sektot_amdtms = $sekund + $sektot_amdtm; $sektot_gmt1 = $sektot_amdtms - $hour; // trekker fra 1 time siden Unix Epoch er GMT og her er det GMT+1 if($aar == 2008) { if($maned > 2) $sektot_final = $sektot_gmt1 + $skuddaar_etter_2008; elseif($maned <= 2) $sektot_final = $sektot_gmt1 + $skuddaar_for_2008; } if($aar > 2008) $sektot_final = $sektot_gmt1 + $skuddaar_etter_2008; if($aar < 2008) $sektot_final = $sektot_gmt1 + $skuddaar_for_2008; print("Før utregning:<br>".$timestamp."<br><br>"); print("Etter utregning:<br>".date("d.m.y H:i:s", $sektot_final)); ?> Jeg forventer ikke at dere skjønner navngivningen på variablene, poenget er at nå står antall skuddår etter 2008 på 9 (og ikke 10 som den burde), og da funker koden. Har testa med masse forskjellige datoer og tider, og har ikke merka noen feil enda. Første brukeren ble registrert i 2006, så har bare tatt med før og etter skuddåret i 2008. Med årstall før skuddåret i 2004 vil datoen bli feil. Endret 21. januar 2010 av YaNkEs Lenke til kommentar
Ernie Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 (endret) Det er fordi det ikke alltid er skuddår hvert 4. år. De årene delelig med 100 er ikke skuddår, noe som vil gjelde for blant annet år 2000. Red.: Nei, vent nå litt. De delelig med 400 er allikevel skuddår Endret 21. januar 2010 av Ernie Lenke til kommentar
Ernie Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 Nei, ser ikke helt hvor det går galt der. Det er jo helt klart 10 skuddår etter 1970. Hvorfor bruker du ikke mktime forresten? Lenke til kommentar
AlecTBM Skrevet 21. januar 2010 Del Skrevet 21. januar 2010 Skulle til å spørre om det samme, mktime er jo laget til dette Lenke til kommentar
TheClown Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 2000 var skuddår Det var mitt bidrag i denne tråden Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 $ date -d "01/03/08 15:36:51" +"%s" 1199371011 Endret bare . til /, da date ikke taklet punktum.. Lenke til kommentar
AlecTBM Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Uhm sokkalf, er det noe jeg har oversett? Lenke til kommentar
Sokkalf™ Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Nei? Jeg burde kanskje spesifisert at dette var en shell-kommando og ikke PHP, siden vi er i PHP-forumet Uansett, PHP-utviklere har ofte tilgang til et shell, og det er en kjapp måte å løse problemet på. Lenke til kommentar
AlecTBM Skrevet 22. januar 2010 Del Skrevet 22. januar 2010 Du burde ha spesifisert det siden vi er i PHP-forumet (som du sier) Den kom bare som en overraskelse her uten noen forklaring Lenke til kommentar
JohndoeMAKT Skrevet 23. januar 2010 Del Skrevet 23. januar 2010 Spiser ikke også strtotime() datostrengen direkte? Dette er uansett noe du bruker interne funksjoner til, å finne opp hjulet på nytt i PHP ender bare med problemer. Hva gjør du med sommertid forresten? Og hva med skuddsekunder? Lenke til kommentar
Yankes Skrevet 25. januar 2010 Forfatter Del Skrevet 25. januar 2010 Godt spørsmål hvorfor jeg gjorde det på den måten egentlig. JohndoeMAKT; det har jeg ikke tatt høyde for, men har ikke støtt på noen problemer. Alle datoene jeg har gjort om ble riktig. Lenke til kommentar
Anbefalte innlegg
Opprett en konto eller logg inn for å kommentere
Du må være et medlem for å kunne skrive en kommentar
Opprett konto
Det er enkelt å melde seg inn for å starte en ny konto!
Start en kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå