Räkna tid med PHP
2008-08-29 - atlas, php
0
calendar
Om du någonsin försökt räkna tid via ett program så vet du kanske att det är inte lätt att ta hänsyn till hur folk räknar tid och hur tid är uppbyggd med sekunder. För även om det är X antal sekunder mellan datum ett och två så betyder det inte att tiden mellan dem beskrivs som en matematisk funktion av sekunderna. Vi vet att det går 60 sekunder på en minut, 60 minutr på en timme, 24 timmar på ett dygn och 30 dygn på en månad och 365 dygn på ett år.
Tyvärr så är det inte så enkelt. Inte nog med att var och varannan månad har olika antal dagar, vi har också skottår där åren har olika antal dagar, samt vinter/sommartid där VISSA dagar har olika antal timmar. Och ska man då räkna tiden mellan 2003-01-01 och 2008-01-01 så är det ju fem år, men i sekunder i ett program så är det 157766400 sekunder, vilket blir exakt 5,00273972603 år om man räknar med att ett år är 60 x 60 x 24 x 365 sekunder långt. Nu är det ju så att 2004 var ett skottår, så vi får ju en hel dag extrasekunder där, vilket gör att resultatet blir fel.
Samma övning med åren 2006-01-01 och 2008-01-01 ger svaret 63072000, vilket är jämt delbart med antal sekunder per år (enligt ovanstående multiplikation).
Och när man väl löst problemet med skottår så kommer problemet med att månader har olika antal dagar. Det betyder att det är 28 dagar mellan 2007-02-01 och 2007-03-01 men vi säger att det är en månad ändå. Vi kan alltså inte längre avgöra hur många månader det är mellan två datum genom att räkna dagar.
Jag har letat högt och lågt efter funktioner som löser detta i PHP men inte hittat några, så jag fick till slut lov att utveckla min egen. Nedanstående funktion tar hänsyn till allt det här, och den klarar nu min egenutvecklade test-svit för datumberäkningar som man kan hitta här (om ni kan komma på fler datum att jämföra, eller hittar datum som funktionen inte kan jämföra, hör av er i så fall).
Min inline-php-highlight-funktion fixade inte att korrekt visa syntax för hela funktionen (det krockade med en hög andra saker jag gör med texten), så den färdiga koden finns här:
Lite kommentarer kanske är på sin plats. Notera att jag använde AdoDB-biblioteket för att hantera tiderna, det är för att PHP's inbygga mktime() och strtotime() kan inte hantera datum utanför epoken (i.e. innan 1970) vilket blir klurigt om man ska räkna ut hur gammal någon är som är född på sextiotalet. AdoDB-bibliotekets motsvarighet till mktime() hanterar dock det, och det underlättar.
Notera också att funktionen kan anropas med enbart:
print counttime("2008-01-01", "2008-03-01", "days");
För att få antalet dagar mellan datumena som en siffra helt enkelt. Om du har några andra frågor så kan du ju slänga iväg en kommentar. Eller om du hittar en bugg till exempel.

Uppdatering

Micael Bolognini upptäckte att min funktion räknande månader fel, om man valde att bara visa antalet månader mellan två datum, baserat på att månader räknades som 28 dagar. Men det är fixat nu.
Lite imponerad hur mycket Apple Watch kan hålla reda på bär man simmar faktiskt
Får lite välbehövlig hjälp att fixa med elen i verkstaden
Improvisationsteater på Västmanlandsteatern. Lika delar pinsamt och skoj :)
Har ryggskott som börjar bli bättre. Nyser nu på morgonen och det hugger till i ryggen och gör ont som fan. Kollapsar på golvet, och när jag reser mig upp så har jag råkat få igång Siri som tror sig ha hört detta. Ok, det gör ont som fan, men jag är ok, Siri :)
Har en trappa hemma som måste renoveras, menrenoveringskit är dyra som tusan, tanken är att jag ska bygga eget renoveringskit, får se hur det går…
Bakbunden
Även en ordentlig geringsfräs för att kunna bygga hållbara trappnosar
Har införskaffat mig en planopress inför kommande bordsprojekt samt ett test för en trapprenovering.
Byggde en pokalhylla till dotterns alla danspokaler
Pricken över i:et :)
Bakbord
Nytt projekt på gång, bakbord till svärfar :)
“Gå och lägg dig” - ”Nej jag kollar på TV med Leia” :)
Extrabord till jul
Extrabord till julafton klart! Byggvideo kommer inom kort på min youtube :)
Weehoo, jag har en egen stämpel nu. Det ni!
Bordskiva oljad och vaxad, ben borstade och betsade. Kanske blir ett bord till slut?
Bordsskiva betsad. Ska slipas/borstas och sen oljas.
Renoverat vardagsrumsbord
Favoritbild från dansuppvisningen igår
Nattduksbord
PanPastel-porträtt
Crock Pot
PanPastel
Tron för Sigge
Road Trip Italien!
Verkstad Remake
Jonas och Jenna
Brud som chillar
Showing off
Undressing
Touch thyself
Hot Love
Profilporträtt
Resa utan kamera?
Paus
Supernöjd med folieringen!
Bilen ska folieras!
Ny såg
PHP och BankID
Jack Skellington
Verkstadsplaner
Magnettavla
Verandatak och grillhörna!
Vardagsrumsbord
Knivblock
Kökshylla
Ny ikon för karta
PC-bygge
Kerlee 35mm f/1.2
Objektivhylla
Natalie Dormer
Hållare till kattmatsskålar
Hälsningar från Norge
With a little help from my friends...
The Most Incredible Fantasy Maps You've Ever Seen
Cityfestivalen
Mitakon Speedmaster 50mm/f0,95
10 minuter vatten
Sony A7R II
Petzval 58 Bokeh Control Art Lens
Scrawlrbox
Nya skärmar till jobbet
Nikon Df - ny leksak
Boba Fett
First Order Storm Trooper
Mikisen
#inlineditbutton