Avatar billede michaelbn Juniormester
03. april 2015 - 12:37 Der er 8 kommentarer og
1 løsning

Lægge to timer til + vise danske måneder

Jeg har noget kode, der viser de fem seneste indlæg fra et forum. Det ligger på avfc.dk, øverst til højre.

Jeg har lavet forskellige rettelser i koden, så det vises på den måde og med den opstilling, jeg ønsker, men jeg har to rettelser tilbage, jeg ikke kan finde ud af.

Dels skal der lægges to timer til tiden, så et indlæg, der lige nu vises som skrevet kl. 18.15, bliver til kl. 20.15. Og dels vil jeg gerne have rettet månederne. Jeg ved, man kan lægge sine egne betegnelser ind i koden, så man selv kan bestemme, om det skal være jan., Januar eller januar osv.

Jeg har prøvet forskellige ting for at få de to ting ind i PHP-koden, men enten gør jeg det forkert, eller også skriver jeg det forkerte sted. Jeg har ikke skrevet hele koden ind, men kun den del, jeg lige kan se, der handler om tid og dato - jeg vil tro, det er her, rettelserne skal laves, men som sagt kan jeg være galt på den.

    static function rdate($param, $time = 0) {
        if (intval($time) == 0) {
            $time = time();
        }
        $monthM = JText::_('MOD_PHPBB_LAST_MONTH_M');

        if ($monthM != 'MOD_PHPBB_LAST_MONTH_M') {
            $MonthNamesM = preg_split("/[\s,]+/", $monthM);
        }
        $monthF = JText::_('MOD_PHPBB_LAST_MONTH_F');
        if ($monthF != 'MOD_PHPBB_LAST_MONTH_F') {
            $MonthNamesF = preg_split("/[\s,]+/", $monthF);
        }
        if (strpos($param, 'F') > 0 && $MonthNamesF[0] != "") {
            return date(str_replace('F', $MonthNamesF[date('n', $time) - 1], $param), $time);
        } elseif (strpos($param, 'M') > 0 && $MonthNamesM[0] != "") {
            return date(str_replace('M', $MonthNamesM[date('n', $time) - 1], $param), $time);
        } else {
            return date($param, $time);
        }
    }
Avatar billede hanibald Mester
04. april 2015 - 17:44 #1
Hver gang jeg skal lave noget med datoer bruger jeg denne kodestump:


$dato = date("Y-n-d", strtotime($row['ind_dato']));
$arr = explode("-", $dato);
list($year, $month, $date) = $arr;
$ud_dato = $date . ". " . $mdr[$month] . " " . $year;
echo "<td>$ud_dato</td>";

Ovenover placerer jeg denne array;
$mdr = array(1 => "Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");

Med koden har jeg hidtil kunnet lave alle de formater af dato og tid, jeg har haft behov for.

De 2 timer ville jeg nok undlade at gøre noget ved. Udover timerne skal der også opbygges logik til at kunne ændre både dato, måned og år, når timeændrigen medfører ændring af en eller flere af dem.
Avatar billede michaelbn Juniormester
04. april 2015 - 21:38 #2
Det er ikke fordi, jeg mangler koden til at lave danske måneder. Der er masser af eksempler rundt om på nettet, og jeg har også selv lavet det før i anden sammenhæng. Mit problem er, jeg kan ikke finde ud af at implementere det i ovenstående kode.

Det med de to timer, ved jeg, kan lade sig gøre. Jeg har også gjort det i anden sammenhæng, hvor jeg så hentede tiden og lagde 3600 sekunder til, når det var vintertid og 7200 ved sommertid. Så rettede jeg det manuelt de to gange om året. Så det er ikke noget problem - udfordringen er igen at implementere det i ovenstående.
Avatar billede moddi100 Seniormester
06. april 2015 - 01:33 #3
1) Tidsforskellen løses ved at definere tidszonen:
date_default_timezone_set('Europe/Copenhagen');


Hvilket også gerne skulle tage højde for sommertid/vintertid.

2a) Din kode beror på phpBB, hvilket også har understøttelse af danske måneder/tekst:
https://www.phpbb.com/customise/db/translation/danish/

Koden du selv har angivet udnytter nemlig muligheden for at anvende flere sprog, uden at den hackes.

2b) Ser vi bort fra at det ikke er best practice at ændre direkte i koden fremfor at benytte en oversættelse, kan koden se ud som følger. Bemærk at dette er utestet, og at jeg har tilladt mig at lave et par forbedringer i forhold til den oprindelige kode.

static function rdate($param, $time = 0) {
        if (intval($time) == 0) {
            $time = time();
        }

        // Om muligt skal du gerne sætte tidszonen et andet
        // sted end her midt i koden
        date_default_timezone_set('Europe/Copenhagen');

        // Er tidszonen allerede korrekt, kan du eventuelt
        // justere tiden her (fraråder jeg på det kraftigste)
        #$time += 7200;


        // Definer måneder (F = fulde navn, M = 3 tegn)
        $monthNamesF = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
        $monthNamesM = array('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec');

       
        if (strpos($param, 'F') !== false) {
            $param = str_replace('F','#', $param);
            return str_replace('#', $MonthNamesF[date('n', $time) - 1], date($param, $time));
        } elseif(strpos($param, 'M') !== false){
            $param = str_replace('M','#', $param);
            return str_replace('#', $MonthNamesM[date('n', $time) - 1], date($param, $time));
        } else {
            return date($param, $time);
        }
    }
Avatar billede michaelbn Juniormester
06. april 2015 - 09:20 #4
Jeg havde tænkt, det er "date_default_timezone_set", der er den optimale løsning på tiden. Jeg havde også forsøgt det, men jeg må have skrevet noget forkert, for det virker i hvert fald nu med den kode, du har skrevet. Så tak for det!

Nu er jeg så spændt på, hvad der sker, når vi går tilbage til vintertid. I den tidligere version af phpBB fungerede det ikke ordentligt med sommertid/vintertid, men jeg tror, det er blevet bedre nu. Ellers må jeg skifte til den anden kode, hvor jeg selv tilføjer 1 eller 2 timer.

Til gengæld virker det med månederne ikke. Jeg kan godt se i den originale kode, der bliver forsøgt at hente noget fra phpBB, men det virker altså ikke hos mig. Måske fordi den originale kode er gammel, og phpBB er opdateret til en nyere version, hvor sprogfilerne måske er placeret et andet sted. Men i mit tilfælde, hvor der kun er mig, der skal ændre noget på hjemmesiden, kan jeg fint leve med en løsning i stil med den, du har lavet, og som jeg også selv har forsøgt.

Men når jeg indsætter din kode, kommer der slet ingen måned frem på hjemmesiden. Så står der bare f.eks. "4. . kl. 22:00", hvor der burde stå "4. apr. kl. 22:00".
Avatar billede moddi100 Seniormester
06. april 2015 - 12:25 #5
Hvilke parametre kalder dufunktionern med?
Avatar billede michaelbn Juniormester
06. april 2015 - 12:35 #6
Dato: j. M.
Tid: G:i
Avatar billede moddi100 Seniormester
06. april 2015 - 15:08 #7
Ahh, min fejl, jeg havde lige lavet forskel på store og små bogstaver:
static function rdate($param, $time = 0) {
        if (intval($time) == 0) {
            $time = time();
        }

        // Om muligt skal du gerne sætte tidszonen et andet
        // sted end her midt i koden
        date_default_timezone_set('Europe/Copenhagen');

        // Er tidszonen allerede korrekt, kan du eventuelt
        // justere tiden her (fraråder jeg på det kraftigste)
        #$time += 7200;


        // Definer måneder (F = fulde navn, M = 3 tegn)
        $monthNamesF = array("Januar", "Februar", "Marts", "April", "Maj", "Juni", "Juli", "August", "September", "Oktober", "November", "December");
        $monthNamesM = array('Jan', 'Feb', 'Mar', 'Apr', 'Maj', 'Jun', 'Jul', 'Aug', 'Sep', 'Okt', 'Nov', 'Dec');

       
        if (strpos($param, 'F') !== false) {
            $param = str_replace('F','#', $param);
            return str_replace('#', $monthNamesF[date('n', $time) - 1], date($param, $time));
        } elseif(strpos($param, 'M') !== false){
            $param = str_replace('M','#', $param);
            return str_replace('#', $monthNamesM[date('n', $time) - 1], date($param, $time));
        } else {
            return date($param, $time);
        }
    }
Avatar billede michaelbn Juniormester
06. april 2015 - 15:22 #8
Ja selvfølgelig... det burde jeg måske også selv have opdaget. Men nu virker det, ligesom jeg ønsker.

Tusind tak for hjælpen. Det er virkelig værdsat.

Smider du et svar, så du kan få dine point?
Avatar billede moddi100 Seniormester
06. april 2015 - 15:40 #9
Super, det var godt at høre :)
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

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