Page 1 sur 1

Calculer la date de demain.

Posté : 01 déc. 2008, 04:25
par Azanek
Bonjour à tous,

Pour un premier message ici, je vais passer pour un vrai débutant, et c'est vrai, je le suis, j'ai commencé le php la semaine dernière. Je ne doute pas que ce problème sera résolu en 2 lignes par des spécialistes.
J'ai commencer php avec un livre : "Je me lance en php mysql"

Un petit travail au début du livre me demande de faire écrire la date de demain.

Donc voici mon code :

Code : Tout sélectionner

<?php //Tableau de conversion des mois $mois[1] = "janvier" ; $mois[2] = "février" ; $mois[3] = "mars" ; $mois[4] = "avril" ; $mois[5] = "mai" ; $mois[6] = "juin" ; $mois[7] = "juillet" ; $mois[8] = "août" ; $mois[9] = "septembre" ; $mois[10] = "octobre" ; $mois[11] = "novembre" ; $mois[12] = "décembre" ; //tableau de correspondance des jours $jour[0] = "dimanche"; $jour[1] = "lundi"; $jour[2] = "mardi"; $jour[3] = "mercredi"; $jour[4] = "jeudi"; $jour[5] = "vendredi"; $jour[6] = "samedi"; //On transforme le jour en chiffre en jour francais $jour_francais = $jour[date("w")]; //On recuper le mois en chiffre par rapport au mois courant $mois_chiffre = date("n"); //On transforme le moi en chiffre en mois en francais $mois_francais = $mois[$mois_chiffre]; //On prend le jour courant $jour = date("j"); //On soustrait le mois et jour a année $annee_heure = date("Y, H:i:s"); //On assemble le tout echo $jour_francais." ".$jour." ".$mois_francais." ".$annee_heure; //On récupere la date de demain en secondes depuis le 1er janvier 1970 // aujourd'hui + 3600*24 $demain_secondes = time() + (3600 * 24); //Mois en chiffre $mois_chiffre_demain = date("n", $demain_secondes); //Mois en lettre $mois_lettre_demain = $mois[$mois_chiffre_demain]; //Jour en lettre $jour_lettre_demain = $jour[date("w", $demain_secondes)]; //Jour du mois $jour_mois_demain = date("j", $demain_secondes); //année $annee_demain = date("Y", $demain_secondes); //Afficher la date au format vendredi 3 juin 2008 echo "Demain nous serons le "; echo $jour_lettre_demain." ".$jour_mois_demain." ".$mois_lettre_demain." ".$annee_demain; ?>
Le truc bizarre, c'est que c'est exactement ce qu'ils me disent d'écrire dans le livre, et pourtant voici ce que ça renvoi :
jeudi 27 novembre 2008, 19:02:19
Notice: Uninitialized string offset: 5 in D:\Guylou\Documents\InVivo\Site In Vivo\Sitetest2\pagephp\index.php on line 83
Demain nous serons le 28 novembre 2008
La ligne 83 en question :
$jour_lettre_demain = $jour[date("w", $demain_secondes)];

Après quelques essais divers, je me suis rendu compte que la conversion de jour en chiffre à jour en lettre s'aidant du tableau de conversion se fait pas.

Je n'aurais pas poser la question si le livre m'aurait donner la bonne réponse, mais je bloque. Je pourrais aussi faire semblant que tout va bien, mais je n'y arrive pas, si je comprends pas ça, alors pourquoi passer à la suite ? ^^

Merci.

Posté : 01 déc. 2008, 08:37
par Patriboom
Il y a une bête erreur de nommination des variables.
Les lignes
      //On prend le jour courant 
      $jour = date("j"); 
redéfinissent la variable $jour qui en devient non plus un tableau, mais une simple variable.
Si tu corrigeais cette ligne et celle qui exploite sa valeur ainsi:
      //On prend le jour courant 
      $jour_numerique = date("j"); 
...

      //On assemble le tout 
      echo $jour_francais." ".$jour_numerique." ".$mois_francais." ".$annee_heure; 


tu obtiendrais le résultat souhaité.

Posté : 01 déc. 2008, 09:18
par blof
salut,

pour éviter les "bidouillages" avec les dates en français, on peut utiliser strftime().

http://fr3.php.net/strftime

Posté : 01 déc. 2008, 15:27
par Azanek
Merci à tous les deux.
Je vais changer ça alors !

Donc après avoir fait les modifs et utilisé la fonction strftime() mon code se résume à :
//On calcule la date de demain en seconde
$demain_secondes = time() + (3600 * 24);
//On affiche la date d'aujourd'hui, et on calcule la date de demain
setlocale(LC_TIME, "frc");		
echo strftime("%A %d %B %Y, %X") . "<br>";		
echo "Demain nous serons le : " . strftime("%A %d %B %Y", $demain_secondes);

EDIT : bon, finalement un nouveau problème apparait.

Je suis au Québec, mais le serveur de mon site web est anglophone, résultat, voilà ce qui est afficher avec le code juste au dessus :
Monday 01 December 2008, 09:29:18
Demain nous serons le : Tuesday 02 December 2008
Comment faire pour l'avoir en francais maintenant ?

Posté : 01 déc. 2008, 16:31
par Patriboom
Euh ... le [Résolu] ne doit pas être dans votre message, mais généré dans le titre par un clic sur le bouton correspondant lors de l'édition, correction ou réponse.

Posté : 01 déc. 2008, 16:33
par Azanek
Oui je sais, mais j'ai du enlever l'étiquette résolu, car un nouveau problème est apparu, voir plus haut.

Posté : 01 déc. 2008, 16:54
par Patriboom
T'aurais dû ouvrir un autre sujet.

En lisant la doc, tu verras que setlocale(LC_TIME, "frc"); devrait être:
setlocale(LC_TIME, "FR_CA"); 
ou quelque chose du genre.

Posté : 01 déc. 2008, 22:07
par Azanek
Malheureusement, ça ne marche pas.

J'ai essayé :
setlocale(LC_ALL, "frc")
setlocale(LC_ALL, "French")
setlocale(LC_ALL, "French_Canada")
setlocale(LC_ALL, "FR_CA")
setlocale(LC_ALL, "fr_FR")
setlocale(LC_ALL, "french-canadian")

Et d'autres choses un peu plus tirée par les cheveux. En tout cas, peut importe, la date apparait toujours en anglais.

Posté : 01 déc. 2008, 23:01
par Patriboom
As-tu essayé
setlocale(LC_TIME, "frc")
? ou encore

setlocale(LC_TIME, "FR_frc")
setlocale(LC_TIME, "frc")

Il serait préférable, je crois d'utiliser une définition mieux circonscrite afin de ne pas nuire aux autres usagers du même serveur (voir note rose de la page http://ca3.php.net/manual/fr/function.setlocale.php

Posté : 01 déc. 2008, 23:06
par Azanek
Donc,

J'avais bien utilisé LC_TIME et non LC_ALL. Erreur de retranscription. Et j'ai bien utilisé les différentes combinaisons avec frc.

Quand je suis en localhost, tout marche bien, dès que je suis sur le serveur distant, ça indique le jour en anglais :
Monday 01 December 2008, 16:02:54
Demain nous serons le : Tuesday 02 December 2008

Posté : 02 déc. 2008, 02:08
par Patriboom
Ouin, ben là .... :roll:

Il faut comprendre que les accès aux modif de ces config t'es interdit.
Je ne vois pas d'autre solution que de te rabattre sur les formes détaillées que tu avais au début, du genre

$Jour = array("dimanche","lundi","mardi","mercredi","jeudi","vendredi","samedi","dimanche");
$mois = array("","janvier","février","mars","avril","mai","juin","juillet","août","septembre","octobre","novembre","décembre");

echo $Jour[date("w")].' '.date("d").' '.$mois[date("m")].' '.date("Y").'<br>';

Désolé.

Si d'autres ont des solutions à offrir, je suis preneur aussi.

Posté : 02 déc. 2008, 03:21
par Azanek
Ok, merci beaucoup de t'être penché sur ce problème.

Le plus drôle dans tout ça, c'est que je veux pas particulièrement écrire la date de demain, mais c'était juste que je comprenais pas la solution de ce petit exercice dans mon livre. Et je pouvais pas passer à la suite sans comprendre ^^

Posté : 02 déc. 2008, 11:44
par caroube
Il y a la fonction strtotime() qui est faite pour ça

Code : Tout sélectionner

$demain = strtotime("+1 day"); $apresdemain = strtotime("+2 day"); $lasemainederniere = strtotime("-1 week"); $lundiprochain = strtotime("next monday");
Cela évite les 3600 * 24 ...

Posté : 02 déc. 2008, 15:39
par Azanek
Merci de t'être penché toi aussi sur le sujet. Mais le problème n'était malheureusement plus d'écrire la date de demain, mais de l'écrire en français quand le serveur de mon site web est en anglais.

J'ai essayé toutes les combinaisons qui me venaient à l'esprit pour la fonction setlocale() mais rien n'a marché.