web-dev-qa-db-fra.com

Comportement étrange avec des dates

Je voudrais stocker l'entrée du champ calendar dans mon JTable :: store.

Pour ce faire, je fais ceci:

Déclaration de forme:

    <field name="creationdate"
           type="calendar"
           default="NOW"
           label="COM_BESTIA_FIELDS_CREDITCREATIONDATE_LABEL"
           description="COM_BESTIA_FIELDS_CREDITCREATIONDATE_DESC"
           format="%d.%m.%Y %H:%M"
           filter="user_utc"/>

Méthode Store dans JTable:

    if ( !empty( $input[ 'creationdate' ] ) && !( $input[ 'creationdate' ] == "0000-00-00 00:00:00" ) )    // Prepare date to be saved in database
    {
        // Set this to a format the sql-table is able to save
        $date               = JFactory::getDate($input[ 'creationdate' ]);
        $this->creationdate = $date->toSql();
    }
    else
    {
        throw new Exception(JText::_('COM_BESTIA_ERROR_INCORRECTDATES'));
    }

Cela fonctionne bien. Si je var_dump la sortie faire

    var_dump(JFactory::getDate($input[ 'creationdate' ])->toSql());
    var_dump(JFactory::getDate($this->creationdate)->toSql());

J'obtiens ce résultat:

string(19) "2016-05-13 09:30:00" string(19) "2016-05-13 09:30:00"

C'est correct.

Mais sous une autre forme, j'obtiens ce résultat pour:

XML:

var_dump:

    var_dump(JFactory::getDate($input[ 'creationdate' ])->toSql());
    var_dump(JFactory::getDate($this->creationdate)->toSql());

Résultat:

string(16) "13.05.2016 09:41" string(19) "2016-05-13 07:41:00"

Une idée pourquoi je reçois des valeurs différentes?

Edit: La raison pour laquelle j’utilise parfois l’entrée au lieu de $this->creationdate c'est que j'utilise un script CLI pour créer des éléments. Et jusqu'à présent, je ne pouvais pas obtenir les valeurs de la base de données si j'utilisais $this->creationdate et non l'entrée.

2
MyFault

J'ai regardé le code pour cela. JDate :: dateformat est public, ce qui signifie que TOUT code peut modifier la valeur. Je commencerais à faire un grep/search dans mon arbre source (et dans tous les plugins/modules/bibliothèques) pour rechercher des assignations.

En ce qui concerne le décalage horaire, je pense que JFactory () construit la date de deux manières différentes. Le premier, avec la valeur de $ input ['creationdate'], transmet une chaîne de caractères. La seconde passe une valeur numérique. Si vous examinez le constructeur de JDate (), si l'argument de date est numérique, il convertit l'horodatage en UTC.

Ce que vous devez également faire est de vider la valeur de date-> getTimezone () pour les examiner.

2
George Sexton