Pen datoformatering i PHP

Jeg har alltid vært av den oppfatning at unødig informasjon bør fjernes. Dette kommer spesielt til sin rett på Internett, hvor brukerne er mer utålmodige enn noe annet sted. Da snakker jeg ikke primært om unødig data i artikler e.l., men i form av presentasjon av data. Eksempler på dette kan være å erstatte lange datolinjer dersom innholdet er publisert inneværende dag med "I dag" og å strippe vekk ledende 0-siffer fra datoer mellom 1.-9.

Til datoformatering bruker jeg PHP-funksjonen strftime(), men å få identiske resultater på tvers av plattformer var ikke så lett som jeg hadde ventet. I utgangspunktet så datofunksjonen jeg brukte slik ut:

<?php 
function formatDate($timestamp) {
return
strftime(EBA_TIME_FORMAT, $timestamp);
}
?>

Funksjonen over er helt banal, og tar bare imot et tidspunkt som parameter og returnerer datoen formatert med EBA_TIME_FORMAT, en konstant som inneholder en formatverdi, f.eks. %m/%d/%y.

Neste steg i prosessen var å sjekke om datoformatet kun viste dag, måned og år, for deretter å erstatte det med "I dag"-oversettelsen fra den valgte språkfilen, samt legge inn klokkeslettet informasjonen ble publisert:

<?php 
function formatDate($timestamp) {
$template = template::getInstance();

if (
date('d.m.Y') == date('d.m.Y', $timestamp)) {
return
$template->getLng('dateToday') . ', ' . date('H:i', $timestamp);
}

return
strftime(EBA_TIME_FORMAT, $timestamp);
}
?>

Og nå kommer den vanskelige delen. Dersom datoformatet i EBA_TIME_FORMAT benytter seg av %e-specifieren, er det ulike tolkninger på Windows og Linux. Rettere sagt: Den fungerer ikke på Windows, hvilket var årsaken til at jeg fikk blankt resultat lokalt, mens det fungerte fint her på skriblerier.net. Synd, for på Linux returnerer den datoen uten 0-prefikset, og problemet ville vært løst på en ren måte.

Resultatet ble at jeg måtte fortsette å bruke %d, men legge inn en sjekk om første tegn i den formaterte datoen var 0. Hvis ja, stripp den vekk og returner resten, hvis nei, bare returner svaret som det er. På den måten fikk jeg også bukt med det ledende (og unødvendige) 0-tegnet for artikler postet før den 10. i hver måned.

Den endelige koden ser slik ut og virker å gjøre jobben feilfritt:

 <?php
function formatDate($timestamp) {
$template = template::getInstance();

if (
date('d.m.Y') == date('d.m.Y', $timestamp)) {
return
$template->getLng('dateToday') . ', ' . date('H:i', $timestamp);
}

$date = strftime(EBA_TIME_FORMAT, $timestamp);

if (
$date{0} == 0) {
return
substr($date, 1, strlen($date));
}

return
$date;
}
?>

RSS Kommentarer (2)

# – av Per Båtnes – 22. november 2008

Ahh… herlig. Godt å se at du ikke bruker global! Jeg kommer å ødelegger alle filmene dine hvis jeg ser det i EBA noen sted! Altså, den neste versjonen.

# – av David Steinsland – 22. november 2008

Vising som "i går", "i forgårs" er også gode – fremfor å dytte inn en lang dato, for å si at innlegget ble postet for én dag siden. Så lenge du ikke er av typen som liger "x uker/måneder/år", så skal det gå bra.



Legg til kommentar


— Ingen HTML
— [em], [b], [u]
— [quote], [quote=navn]
— [url], [url=]

 
 
Grunnet omfattende spamangep må førstegangskommentatorer godkjennes manuelt. Vennligst ikke lagre samme kommentaren flere ganger om den ikke vises umiddelbart.