Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: DateTime::diff() manuaalisesti implementoitua?

Paulus M [05.04.2012 16:37:12]

#

Moro kaverit!

Nyt sain vihdoin sivuni julkiseksi www.ustedvende.com, kiitokset jälleen kerran kaikkille putkalaisille, erityisesti Metabolixille.

Tässä hijoillessa vielä säätöjä kuntoon, tuli vastaan ongelma. Käytän siis Shared Hostausta (toistaseksi) ja siellä palvelun tarjoaja käyttää PHP 5.2.17 versiota.

Koodissani on PHP 5.3:sen funktio käytössä, nimelttä DateTime::diff().
Palvelun tarjoaja ei vielä aio päivittää 5.3:seen, niin mikä olisi järkevin tapa siihen asti korvata kyseessä olevat funktio kutsut?

Ajattelin manuaalisesti implementoida DateTime luokkaa ja tehdä sinne kyseisen funktion, jos se olisi mahdollista? (Itsellä ei kokemusta tästä)

Jos ei ole mahdollista, niin mitä suosittelisitte?
Funktio löytyy ainakin kahdesta tai kolmesta eripaikkaa koodia.

tsuriga [05.04.2012 17:12:24]

#

Manuskasta löytyy valmis korvaava funkkari. Voit wrapata sen seuraavanlaisesti, jotta sivusto ei hajoa, kun palveluntarjoaja päivittää PHP:n

<?php

if (!class_exists('DateTime', false)) {
    class DateTime
    {
        public function __construct() { ... }

        public function diff(DateTime $d1, DateTime $d2) { ... }
    }
}

Jos ko. versio ei toimi, tuosta löytyy varmasti n-kappaletta valmiita toteutuksia Interwebsin syövereistä.

Paulus M [05.04.2012 17:36:36]

#

Joo, täytyy varmaan kattoo tosiaan valmis funktio tuohon kun täytyis kelloaikoja tarkistella toisinaan.

Mites tuota ku versiossa 5.2 DateTime on jo olemassa, mutta funktio diff ei ole. Pitäiskö mun kokeilla jotain override:usta https://www.php.net/manual/en/function.override-function.php vai millä tavalla saan jälkikäteen implementoitua classiin DateTime funktion diff?


EDIT:

Itse asiassa mähän voin extendaa DateTimen ja lisäillä sinne noi tarvittavat funktiot ja käyttää sitten vain omaa extendattua luokkaa.


ONGELMA RATKAISTU

The Alchemist [05.04.2012 19:02:29]

#

Itse pidän tuota PHP:n DateTime-luokkaa niin täysin kelvottomana kasana paskaa, että olen joka tapauksessa tehnyt ja käyttänyt omaa implementaatiotani.

Diffi on koodillisesti helppoa toteuttaa esimerkiksi seuraavasti:

class DateTime {
  private $stamp;

  function __construct($stamp) {
    $this->stamp = $stamp;
  }

  function diff(DateTime $dt) {
    return new DateTime($this->stamp - $dt->stamp);
  }
}

Tämä ei siis ole yhteensopiva PHP:n oman DateTime-luokan vastaavan metodin kanssa, mutta sanoinkin koko luokan olevan mätä.

Paulus M [05.04.2012 20:11:36]

#

The Alchemist saattaa kyllä olla ihan oikeassa.

Tuolta dateTime:ltä on muun muassa todella hankala saada esimerkiksi aikaero päivinä, jos aika ero on tasan kuukausi, niin päiväero on olla.

Yleensä koodaria kiinnostaa tsekata, että onko viesti esim. yli 10 minuttia, yli 14 päivää, yli 2 kuukautta tai yli vuoden vanha, jolloin siihen olis hyvä olla näppärät funktiot, sen sijaat että tarkitelis interval:ssa olevia vuosia ja kuukausia, että ne on varmasti nolla ja sen jälkeen vasta tsekata päivät jne.

Jos olisin tiennyt asian, niin en oli alkanut käyttämäänkään tuota DateTime luokkaa. Nyt tein kuitenkin oman extendin siitä, että saan näppärästi tilalle omaa kamaa aina tarvittaessa.

Jos joku vastaavaa ongelmaa käy läpi, niin tässä vielä bittiavaruuteen tallelle kyseessä oleva luokka:

class DateTimeP extends DateTime
{
   function __construct($arg)
   {
       parent::__construct($arg);
   }
	//This function gives a time difference between two dates.
	//set measure like "years" or "minutes" or "days"...whatever you like to get.
	public function difference($dateTime2, $measure)
	{
		$stamp1 = strtotime($this->format("Y-m-d H:i:s"));
		$stamp2 = strtotime($dateTime2->format("Y-m-d H:i:s"));

		$interval = $stamp2 - $stamp1;

		$yearInS = 365 * 3600* 24;
		$monthInS = 30 * 3600* 24;
		$dayInS = 3600* 24;

		$hourInS = 3600;
		$minuteInS = 60;
		$secondInS = 1;

		switch($measure)
		{
			case "years":
				return (int)floor($interval / $yearInS);
			break;

			case "months":
				return (int)floor($interval / $monthInS);
			break;

			case "days":
				return (int)floor($interval / $dayInS);
			break;

			case "hours":
				return (int)floor($interval / $hourInS);
			break;

			case "minutes":
				return (int)floor($interval / $minuteInS);
			break;

			case "seconds":
				return (int)$interval;
			break;

			default:
				return "Wrong measure.";
			break;
		}

	}

}

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta