Kādu laiku iepriekš jau rakstīju par problēmām, kuras man bija radušās izmantojot PHP funkcijas date() un strtotime(). Nesen saskāros ar vēl vienu problēmu strtotime() izmantošanā. Pēc savas būtības šī funkcija ir neaizvietojama daudzās situācijās. Varbūt ir aizvietojama, bet tādā gadījumā es labprāt uzzinātu par alternatīvām ar līdzīgu funkcionalitāti. Ko tad šī funkcija dara? Viņa paņem datumu, kas pierakstīts teksta formātā un pārvērš to sekundēs. Savukārt sekundes mēs varam ar date() funkciju pārvērst par mums nepieciešamā formātā esošu datumu.

Parasti, ja funkcijai strtotime() padod datumu kādā formātā, kuru tā nespēj apstrādāt, atbildē būs sekundes, kuras neatbilst konkrētajam datuma. Nu lūk – problēma radās apstāklī, ka visi datumi, kurus Web lapā jāredz lietotājam un kurus viņš ievada nepieciešamajos laukos, ir reprezentēti formātā dd.mm.yyyy. Daudz nedomājot es šādu datumu ar strtotime() pārvērtu uz sekundēm un tālāk ar date() uz yyyy-mm-dd. Viss strādāja ideāli. Taču uzliekot skriptus uz cita servera, korektā strādāšana bija kaut kur pazudusi. Sāku meklēt kur ir kļūda. It kā strtotime() atbalsta gan PHP4, gan PHP5. Piebildīšu, ka uz gala servera stāv PHP4. Iemetot aci php.net uzreiz nekādas īpašās atšķirības nepamanīju. Iespējams ne tā skatījos. Tad uzrakstīju mazu skriptu, kurš ņēma dažādi formatētus datumus un pārtaisīja tos par sekundēm un tad atpakaļ par datumu. Skriptu palaidu gan uz PHP5, gan PHP4. Rezultāti sekojoši:

Ievads | PHP5 | PHP4
2007-09-26 | 2007-09-26 | 2007-09-26
26-09-2007 | 2007-09-26 | 2032-02-28
09-26-2007 | 1970-01-01 | 2016-07-30

2007.09.26 | 1970-01-01 | 1970-01-01
26.09.2007 | 2007-09-26 | 1970-01-01
09.26.2007 | 1970-01-01 | 1970-01-01

Kā redzams – PHP5 dd.mm.yyyy formātu labprāt konvertē tā kā vajag, bet PHP4 nē. Tāpēc mācieties no citu kļūdām un atcerieties, ka maģiskā funkcija strtotime() strādā dažādi uz dažādām PHP versijām.

flattr this!


3 Comments

  1. Posted 27.09.2007 at 18:00 | Permalink

    strtotime ir varen noderīga ja vajag kaut ko līdzīgu : ” 1 day” utt. bet ja vaja samainit datumu vietam vienkasak varbut izmantot implode(“-“,array_reverse(explode(“.”,$datums))) …

  2. bubu
    Posted 27.09.2007 at 21:17 | Permalink

    Jep, tieši tā. Ja formāts vienmēr ir zināms, tad ātrāk būs uzrakstīt speciāli tam vajadzīgo konvertāciju.

  3. Posted 28.09.2007 at 07:59 | Permalink

    Man vienmēr ir bijušas kaut kādas slēptas pretenzijas pret šo funkciju un reti to esmu izmantojis, jo klusībā zināju, ka viņa varētu īsti labi nestrādāt dažādās situācijās :)

Leave a Reply

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>