Gå til innhold

date("U"); Unix Epoch


Anbefalte innlegg

Skrevet (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 av YaNkEs
Videoannonse
Annonse
Skrevet (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 :hmm:

Endret av Ernie
Skrevet

Nei?

 

Jeg burde kanskje spesifisert at dette var en shell-kommando og ikke PHP, siden vi er i PHP-forumet :p

 

Uansett, PHP-utviklere har ofte tilgang til et shell, og det er en kjapp måte å løse problemet på.

Skrevet

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?

Skrevet

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.

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 konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...