Avatar billede compac Seniormester
16. maj 2020 - 14:39 Der er 15 kommentarer og
2 løsninger

Konvertering af dato

Hvordan får jeg udskrevet min måned til dansk format?
I min database står der felttype date og 2020-05-16
I mit script udtrækker jeg datoen med:
            select ...
                while ($a = mysqli_fetch_object($tur)) {
                $turd = $a ->dato;
                $turdate = date('d-M-Y',strtotime($turd));   
      }
        -det giver 16-may.2020
Hvordan skal koden skrives for at blive med dansk måned? 16-maj-2020
og hvis det skal være dette format 16.maj 2020
Avatar billede Slater Ekspert
16. maj 2020 - 14:46 #1
Der findes PECL extension'en IntlDateFormatter som kan, men den er altså ikke indbygget.
Normalt vil du skulle skrive den slags selv, men det er dog heldigvis også nemt.

F.eks. kan du få måneden ud sådan:

$monthNames = [
    1 => 'januar',
    'februar',
    'marts',
    'april',
    'maj',
    'juni',
    'juli',
    'august',
    'september',
    'oktober',
    'november',
    'december'
];

echo $monthNames[date('n')];

Så skal du bare sammensætte en streng med dato og år på hver side.
Avatar billede arne_v Ekspert
16. maj 2020 - 14:59 #2

<?php
$ds1 = '2020-05-16';
$t = strtotime($ds1);
$ds2 = date('d-M-Y', $t);
$ds3 = strftime('%d-%B-%Y', $t);
echo "$ds2\r\n";
echo "$ds3\r\n";
setlocale(LC_TIME, 'dan_DNK'); // Win
//setlocale(LC_TIME, 'da_DK');  // *nix
$ds2 = date('d-M-Y', $t);
$ds3 = strftime('%d-%B-%Y', $t);
echo "$ds2\r\n";
echo "$ds3\r\n";
?>


output:

16-May-2020
16-May-2020
16-May-2020
16-maj-2020
Avatar billede Slater Ekspert
16. maj 2020 - 15:06 #3
Også en mulighed, men setlocale er dog noget møg at bruge, fordi den er platformafhængig og ikke isoleret til tråde. Jeg vil ikke anbefale den.
Avatar billede compac Seniormester
16. maj 2020 - 16:21 #4
Hvad hvis den skal konverteres til 16.maj 2020    -med arne_v's forslag?
Avatar billede arne_v Ekspert
16. maj 2020 - 17:43 #5
@slater

Indrømmet - setlocale duer ikke hvis forskellige brugere skal have forskellige sprog.

@compac

Er det ikke bare at erstatte '-' med hvad du nu vil have?
Avatar billede Slater Ekspert
16. maj 2020 - 17:52 #6
#5: Ja, det er nok ikke et problem her. Det er sjældent folk på eksperten er i gang med at lave de helt store, skalerbare systemer - så fin løsning.

Jeg krummer bare tæer over tanken om, at man kan lave noget kode der fungerer fuldstændig perfekt lokalt, men så snart man smider det i produktion og flere brugere er på samtidig, kan man få nogle mystiske bugs, som er umulige at reproducere i et udviklingsmiljø. Derfor holder jeg mig langt fra den.
Avatar billede compac Seniormester
17. maj 2020 - 22:29 #7
$turdate = date('j. M Y',strtotime($turd)); 
        $turdate = str_replace('May','Maj',$turdate);
        $turdate = str_replace('Oct','Okt',$turdate);
-det er jo kun maj og oktober der er stavet anderledes på dansk.
Samtidig jar jeg løst spørgsmålet om punktum.
Derudover har jeg fået undertrykt de første nul.
-det er næsten som i et rigtigt dokument.
Avatar billede Slater Ekspert
17. maj 2020 - 22:34 #8
Ud over at måneder staves med stort begyndelsesbogstav på engelsk, hvilket de ikke gør på dansk.

Det er bare en rigtig dårlig måde at løse problemet på. Især når du faktisk allerede havde fået to løsninger der virkede bedre.
Avatar billede compac Seniormester
18. maj 2020 - 14:04 #9
Stort begyndelsesbogstav i måned, ja det havde jeg overset.
$monthNames = [
    1 => 'jan',
    'feb',
    'mar',
    'apr',
    'maj',
    'jun',
    'jul',
    'aug',
    'sep',
    'okt',
    'nov',
    'dec'
];
echo date('j'),'. ',$monthNames[date('n')],'&nbsp',date('Y');
Hvordan får jeg koblet det sammen med mit output fra databasen (date yy-mm-dd) ?
Avatar billede Slater Ekspert
18. maj 2020 - 14:35 #10
Den har du næsten allerede, du skal bare putte datoen ind i dine date() funktioner:

$date = strtotime('2020-05-18');  // Sæt denne til outputtet fra databasen

echo date('j', $date),'. ',$monthNames[date('n', $date)],' ',date('Y', $date);


Alternativt, med Arnes løsning kan du lave om til det format du ønsker meget let: ved at skrive
$ds3 = strftime('%d. %B %Y', $t);
i stedet.
Avatar billede arne_v Ekspert
18. maj 2020 - 14:50 #11
Og skal det kun være de første 3 bogstaver af måned, så skal det være %b ikke %B.
Avatar billede Slater Ekspert
18. maj 2020 - 15:21 #12
Nå ja, det glemte jeg igen. Tak, Arne.
Avatar billede compac Seniormester
18. maj 2020 - 16:57 #13
Mange tak til jer begge
Avatar billede compac Seniormester
18. maj 2020 - 21:49 #14
Ups! Det virker udmærket. Men da jeg så vi erstatte echo med en variabel
:

$turdate = date('j', $date),'. ',$monthNames[date('n', $date)],' ',date('Y', $date);

kommer der fejlmeddese: Syntax error unexpected ','

Mangler jeg en parentes? eller noget andet?
Avatar billede Slater Ekspert
18. maj 2020 - 22:27 #15
Kommaer mellem delene virker kun i en echo. Hvis du vil sætte en variabel, må du concat'e delene i stedet, hvilket er med punktum.
Avatar billede compac Seniormester
20. maj 2020 - 20:07 #16
Mange Tak!
Avatar billede showsource Seniormester
31. maj 2020 - 15:06 #17
Husker ikke helt, men i mysql kan man lave en query, inden dit egentlige kald til DB
"SET lc_time_names = 'da_DK'"
så får du dansk dato format og navnepå dage, måneder
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