IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

[Dates] Limite des fonctions natives DATE


Sujet :

Langage PHP

  1. #1
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut [Dates] Limite des fonctions natives DATE
    Bonjour,

    Voilà, j'utilise des timestamp unix pour stocker des dates précises dans une base de données. Il s'agit donc d'un entier (INT32) déterminant le nombre de secondes écoulées depuis 1970.

    Seulement voilà, un imprévu m'oblige à revoir ce système pour prendre en compte des date antérieures (a partir de 1900). Ca me fait hyper mal de devoir renoncer à ce système car hyper pratique compte tenu des fonctions dispos, précis et surtout tout le code de l'appli existante se base la dessus.

    Quand j'y pense, faut vraiment être radin pour stocker 60 ans en secondes sur un INT32... Un INT64 m'aurait épargné ce post !

    Existe t-il donc une solution pour faire en sorte que PHP travail sur des timestamp unix de 64 bits (paramémtrage PHP, recompilation apache, librairie indépendante) ??

    En vous remerciant par avance !

  2. #2
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut recherches et tests
    J'ai essayé de trouver un truc pour ton problème de dates antérieures à 1970 mais sans succés. Cependant, il y a une question qui m'est venu à l'esprit. Si le time stamp Unix retourne le nombre de secondes depuis 1970, alors au 1er janvier 1970 à 0h00 il retournait le nombre 0. Ce qui signifie qu'avant 1970, il devrait retourner un nombre négatif.

    exemple pour le 31 décembre 1969 à 23h59mn59s, il devrait retourner -1.

    Donc est-il possible que cela pose problème et que pour cette raison, je crains qu'il n'y ait pas de solutions en ce qui concerne un timestamp avant 1970...

  3. #3
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    A l'inverse de windows, le php sous linux est supposé gérer les date inférieur à zero... Alors comment, j'en ai aucune idée... mais le fait est que ça doit être possible (si ça se trouve, ils utilisent les nombres négatifs pour passer outre 2038... puisqu'apres tout, caster un int signé négatif correspond a une correspondance avec un int non signé !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut caster un négatif?
    Caster un float pour obtenir un int, je vois très bien comment faire. Mais caster un nombre négatif pour obtenir un nombre positif, j'aimerais bien que tu m'explique la manipulation.

  5. #5
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Les fourchettes de timestamp :
    • sous linux
      • -2147483648 (1901-12-13 20:45:52)
      • +2147483647 (2038-01-19 03:14:07)
    • sous windows
      • 0 (1970-01-01 01:00:00)
      • 2147483647 (2038-01-19 03:14:07)


    A noter que le timestamp 0 (zéro) correspond au 1er janvier 1970 à 1 heure du matin, et non pas à 0 heure, cotrairement à ce que dit ce message d'erreur bien connu sous windows :
    Windows does not support dates prior to midnight (00:00:00), January 1, 1970
    A noter aussi que la fonction mktime() semble buggée. En effet :
    • mktime(3, 14, 7, 1, 19, 2038); donne -3601 soit 1969-12-31 23:59:59
    • mktime(27, 14, 7, 1, 18, 2038); donne 2147483647 soit 2038-01-19 03:14:07


    Toutes ces remarques ne sont que d'un intérêt très limité. C'était simplement pour occuper une partie de matinée d'un 15 août très pluvieux, voire même automnal.

  6. #6
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut pas si inutile
    Bravo et merci pour ces précisions.
    Je me coucherai plus futé ce soir.

    Bon en ce qui concerne la demande de gloubi, ça continue encore. Et j'attends aussi qu'il me réponde sur le fait de comment il caste un nombre négatif en nombre positif. Surtout que PHP ne reconnaît pas les nombres entiers non signés.

  7. #7
    Membre expérimenté

    Profil pro
    Inscrit en
    Août 2002
    Messages
    1 060
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2002
    Messages : 1 060
    Points : 1 357
    Points
    1 357
    Par défaut
    Et comme il pleut toujours (bordel, merde), j'ai fait le même essai avec php 5.2.1 (sous windows), le précédent étant fait avec php 4.4.6.

    Le bug de mktime() n'existe plus, et les fourchettes de dates dispo sont les mêmes que sous linux, c'est à dire que les timestamp sont négatif à partir du 1er janvier 1970 à 0 heure pour les dates antérieures.

    Ah, une éclaircie. J'arrête là.

  8. #8
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut encore en PHP4???
    Citation Envoyé par jeca
    (...) le précédent étant fait avec php 4.4.6. (...)
    Oulaaaa, ça fait un bye que j'ai abandonné le PHP4 qui ne sera de toute façon, plus supporté à compter de 2008. Ce qui signifie, plus de mises à jour et plus de support.

  9. #9
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Vous plaignez pas pour le temps, moi, je suis en alerte cyclonique (Dean)

    Pour répondre au probleme du cast, je parle de ce qui se passe dans les coulisses de apache. Si la date est limité a 2147483648 seconde, c'est qu'il stock la valeur sur 31 bits, et utilise le 1er bit de la chaine (en partant de gauche) pour indiquer si c'est un nombre positif ou negatif, puisque de toute façon, ils auront pas inventer le type INT31 pour l'occasion (PHP étant désromais codé en C) !

    2147483649 s'écrira donc en binaire 1000(32 zero)001. Sur une variable INT 32 bits signés, ça correspond en décimal à -1 (le premier bit étant passé à 1).

    On pourrait donc écrire une fonction de cast de ce type en PHP

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    function castPlus32($val)
    {
       return $val < 0 ? 2147483648 + $val * -1 : $val;
    }
    EDIT : par contre, quand je parlais de caster, je parlais de ce qui se passe à l'interieur de PHP, en langage C, pas d'un cast direct en PHP

  10. #10
    Membre confirmé
    Inscrit en
    Mai 2002
    Messages
    673
    Détails du profil
    Informations forums :
    Inscription : Mai 2002
    Messages : 673
    Points : 624
    Points
    624
    Par défaut
    Confirmation de ce que je j'avance :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo date("d/m/Y", 2147483649);
    Warning: date(): Windows does not support dates prior to midnight (00:00:00), January 1, 1970 in c:\www\www\form\ajax\calcul.php on line 310
    Il traite donc bien la valeur du stamp comme des INT32 signés en interne

  11. #11
    Membre éprouvé
    Homme Profil pro
    Conseil - Consultant en systèmes d'information
    Inscrit en
    Juin 2003
    Messages
    909
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Conseil - Consultant en systèmes d'information
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 909
    Points : 1 014
    Points
    1 014
    Par défaut alors ça...
    ... je me croyais vicieux en ce qui concerne la prog PHP allant jusqu'à analyser les sources du moteur en C et je crois que j'ai trouvé pire que moi.

    En tout cas merci pour ces deux précédents posts gloubi, c'est enregistré dans ma mémoire.

  12. #12
    Membre habitué
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    150
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations forums :
    Inscription : Janvier 2006
    Messages : 150
    Points : 186
    Points
    186
    Par défaut
    Bonjour,

    Pour revenir à la question initiale, et au titre, les fonctions de dates sous php ne se limitent pas au timestamp unix.

    Pour gérer toute sorte de date, on peut utiliser la syntaxe classique "YYY-MM-DD HH:ii:ss" ... Surtout si c'est pour jouer avec MySQL derrière qui gère très bien.

    Ceci dit, j'espère que vous avez le cuir chevelu bien arnaché, avec vos histoires capilotractés il ne va pas tenir longtemps

Discussions similaires

  1. [AC-2010] Limiter des résultats en fonction d'une date dans un entête de formulaire
    Par docjo dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 25/04/2013, 20h18
  2. [Dates] Ajouter des jours à la date d'aujourd'hui
    Par swissmade dans le forum Langage
    Réponses: 5
    Dernier message: 14/10/2008, 11h31
  3. [Dates] Appeler des fonctions sans attendre leurs résultats
    Par ipeteivince dans le forum Langage
    Réponses: 6
    Dernier message: 05/02/2008, 12h22
  4. [Dates] Ajouter des mois à une date
    Par tiger63 dans le forum Langage
    Réponses: 8
    Dernier message: 25/05/2007, 16h42
  5. [Dates] Afficher des données à la date du jour
    Par rastatom dans le forum Langage
    Réponses: 10
    Dernier message: 18/05/2006, 11h37

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo