De functie strftime() snapt geen objecten?
Quote:
strftime() expects parameter 2 to be long, object given
Hoe te fixxen? Typcasten helpt niet....
Ik wil 2012-11-10T19:02:00+0100 welke uit een XMLfeed (SimpleXML) komt een fatsoenlijke leesbare datum geven. Hoe?
Is er een betere functie?
Gewijzigd op 10/11/2012 19:12:00 door - Ariën -
http://stackoverflow.com/questions/5254553/warning-date-expects-parameter-2-to-be-long-string-given-in
Dat zou betekenen dat een object wel mag, maar jou datum format niet.
1. $item->Datum is geen long, maar een object
$item->Datum zal weer een SimpleXmlElement teruggeven. Om dit om te zetten naar een long moet je hem typecasten naar een int, dan zal je de tekst krijgen.
2. strftime() wil een long, geen string
Wat jij wilt is een string (2012-11-10T19:02:00+0100) omzetten, maar strftime wil geen string, het wel een long/integer. Om precies te zijn, het wil de waarde hebben die je terugkrijgt van time().
Oplossing
Gebruik geen strftime maar iets anders, zoals class.datetime:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$date = '2012-11-10T19:02:00+0100';
$datetime = DateTime::createFromFormat('Y-m-d*H:i:sT', $date);
echo $datetime->format('Y m d \o\m H:i');
?>
$date = '2012-11-10T19:02:00+0100';
$datetime = DateTime::createFromFormat('Y-m-d*H:i:sT', $date);
echo $datetime->format('Y m d \o\m H:i');
?>
Gewijzigd op 11/11/2012 00:43:43 door Wouter J
Ik heb het aangepast naar de DateTime class waarmee het wel werkt. Ik moet deze toch eens vaker gebruiken.
(en minder onder tijdsdruk PHP'en ;-) )
Gewijzigd op 11/11/2012 00:44:02 door - Ariën -
En ik zou het eerder op deze manier doen (als je strtotime gebruikt):
Zeker voordeel van strftime is dat het Nederlandse dagen/maanden kent... date doet dat niet.
Het DateTime object heeft 2 grote nadelen, a) het werkt niet in alle PHP 5.x versies en b) zoals Eddy al aangeeft houdt het geen rekening met locale settings, dat laatste vind ik een zeer grote tekortkoming.
Gewijzigd op 11/11/2012 10:36:28 door - Raoul -
Zodra ik weer items in mijn feed krijg ga ik naar Eddy's tip kijken. Dit lijkt me toch de beste manier dan, gezien ik toch wel graag de locales wil gebruiken.
Gewijzigd op 11/11/2012 12:28:00 door - Ariën -
Daarnaast vind ik Datetime mooi werken met het importen van een format, omdat je het format zelf kunt verzinnen, als je maar opgeeft waar welke data staat. Ik had mijn scriptje ook zo kunnen schrijven:
Code (php)
1
2
3
4
5
6
7
2
3
4
5
6
7
<?php
$date = '2012-11-10T19:02:00+0100';
$datetime = date_create_from_format('Y-m-d*H:i:sT', $date);
echo date_format($datetime, 'Y m d \o\m H:i');
?>
$date = '2012-11-10T19:02:00+0100';
$datetime = date_create_from_format('Y-m-d*H:i:sT', $date);
echo date_format($datetime, 'Y m d \o\m H:i');
?>
Op de $datetime parameter die je overal moet meegeven na vind ik dit precies dezelfde 'goedheid' hebben.
Merk overigens op dat ik niet wist dat deze klasse niet met locale werkt, dat is wel een nadeel inderdaad. Eventueel zou je dan een combinatie van het DateTime object en de strftime kunnen gebruiken, mocht je vreemde formats gebruiken.
Dat het niet met elke PHP5 versie werkt vind ik wel een klein beetje onzin. Het werkt vanaf PHP5.2 en ik als je nu nog een host heeft met 5.1.x zou ik heel snel gaan vragen of hij hem niet wilt updaten. Je hebt dan namelijk een PHP versie die ouder is dan 2 Nov 2006!!
@Raoul, de DateTime is wel OO. Het is 1 klasse, heb ook nog DateInterval en nog een paar en het is zeker een OO library.
Gewijzigd op 11/11/2012 13:29:04 door Wouter J