strftime spaties bij 'single digits'

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Michael -

Michael -

11/02/2020 19:31:44
Quote Anchor link
Allen,

Het is me nooit eerder opgevallen, maar nu ineens wel.
Als je de functie strftime gebruikt worden er bij bijv %A (1-31) %k (0-23) %l (1-12) een spatie vooraf toegevoegd bij een 'single digit'. Dit staat ook op php.net dus betreft geen bug, maar ik snap de reden hiervan niet? Ik zie rare manieren om dit weer te voorkomen, wat me ook niet de manier lijkt.

Als je dit gewoon in je HTML gebruikt valt de spatie weg, maar als je het, in mijn geval, in een title attribuut van een link gebruikt, zie je 't wel.

Voorbeeldje:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<a href="" title="vrijdag  7 februari 2020">vrijdag  7 februari 2020</a><br>
<a href="" title="zaterdag  8 februari 2020">zaterdag  8 februari 2020</a><br>
<a href="" title="zondag  9 februari 2020">zondag  9 februari 2020</a><br>
<a href="" title="maandag 10 februari 2020">maandag 10 februari 2020</a><br>
<a href="" title="dinsdag 11 februari 2020">dinsdag 11 februari 2020</a><br>
<a href="" title="woensdag 12 februari 2020">woensdag 12 februari 2020</a><br>


En als je de spatie weglaat:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
vrijdag 7 februari 2020
zaterdag 8 februari 2020
zondag 9 februari 2020
maandag10 februari 2020
dinsdag11 februari 2020
woensdag12 februari 2020


Code die is gebruikt om te testen
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
setlocale(LC_TIME, "nl_NL");
for($i=0;$i<30;$i++) {
    $date = strftime("%A %e %B %Y", (new \DateTime('2020-02-01'))->modify('+'.$i.' day')->getTimestamp());
    
    echo '<a href="" title="' . $date . '">' . $date . '</a><br>'.PHP_EOL;
}

?>


Voornamelijk dus de vraag waarom dit bewust is gedaan. En twee of er een hele simpele fix voor is.
 
PHP hulp

PHP hulp

20/02/2020 15:37:38
 
Thomas van den Heuvel

Thomas van den Heuvel

11/02/2020 19:55:19
Quote Anchor link
Dit staat uitgelegd in de pagina waar je naar linkte? Discrepanties in standaards oid. En als je %#d oid gebruikt zoals daar wordt voorgesteld? Afhankelijk van het platform wat je gebruikt.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/02/2020 19:58:02
Quote Anchor link
Het enige dat ik me kan indenken waarom dit gedaan is is om zo aan een vaste lengte te komen als je geen namen voor bijvoorbeeld de maanden gebruikt.
 
Michael -

Michael -

11/02/2020 20:19:48
Quote Anchor link
Quote:
En als je %#d oid gebruikt zoals daar wordt voorgesteld?

Dit betreft een fix voor Windows. Het script draait op Linux.
%d is met 'leading zero' en sowieso al zonder spatie vooraf. %d en %#d geven dan ook het zelfde resultaat.
%#e maakt ook geen verschil.

Toevoeging op 11/02/2020 20:22:16:

Frank Nietbelangrijk op 11/02/2020 19:58:02:
Het enige dat ik me kan indenken waarom dit gedaan is is om zo aan een vaste lengte te komen als je geen namen voor bijvoorbeeld de maanden gebruikt.


Dat zou kunnen. Zoals het voorbeeld op php.net dat ze laten zien van een agenda. Maar dan kun je dit toch makkelijker zelf toevoegen, dan dat je 't moet verwijderen indien je 't niet wil. Dan lijkt mij. Met DateTime vervangen ze ook niet de 0 door een spatie.
 
Frank Nietbelangrijk

Frank Nietbelangrijk

11/02/2020 20:33:37
Quote Anchor link
Met je eens maar het PHP dev team bestond de eerste jaren volgens mij uit een paar C programmeurs van het eerste uur. Zij implementeerden PHP functies als een exacte kopie uit de C taal. En C bestond al lang voor Windows en PHP en zelfs het internet. In die tijd waren de pixels op een beeldscherm nog te tellen en waren er nog geen fonts en dergelijke. Elke letter of teken was even breed en dus was het wellicht geen onlogische keuze.
 
Michael -

Michael -

11/02/2020 20:43:46
Quote Anchor link
Ah kijk. Bedankt voor je verhelderende uitleg. Dan voor die keer dat strftime wordt gebruik maar een preg_replace gebruiken.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
preg_replace('/\s+/', ' ', $date);
?>
Gewijzigd op 11/02/2020 20:44:40 door Michael -
 
Rob Doemaarwat

Rob Doemaarwat

11/02/2020 20:44:14
Quote Anchor link
Simpele fix:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$date = str_replace('  ',' ',$date);


@Michael: dat moet waarschijnlijk preg_replace('/\s+/',' ',$date); zijn (al gefixt zie ik ;-) ), en is misschien wel heel ruig voor deze situatie (volgens mij is het altijd maximaal 2 spaties - dus nooit "meer")
Gewijzigd op 11/02/2020 20:46:24 door Rob Doemaarwat
 
Michael -

Michael -

11/02/2020 20:45:37
Quote Anchor link
@Rob; Dat kan inderdaad ook. Was ook wel benieuwd naar de achterliggende gedachte, vandaar het topic.

Toevoeging op 11/02/2020 21:00:44:

Rob Doemaarwat op 11/02/2020 20:44:14:
Simpele fix:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
$date = str_replace('  ',' ',$date);


@Michael: dat moet waarschijnlijk preg_replace('/\s+/',' ',$date); zijn (al gefixt zie ik ;-) ), en is misschien wel heel ruig voor deze situatie (volgens mij is het altijd maximaal 2 spaties - dus nooit "meer")


@Rob, Ja ik was te snel ;-) Ja, dat is zo. Dan zou jouw oplossing iets sneller zijn.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.