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 :

Manipulation de date par semaine [PHP 5.3]


Sujet :

Langage PHP

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut Manipulation de date par semaine
    Bonjour,

    Sur une page, je souhaite lister toutes les lignes d'une table ayant une date de la semaine en cours. Quand je parle de semaine, il s'agit du lundi au dimanche inclus.

    Ainsi, quand j'affiche ma page le mardi 17, je voudrais avoir les lignes de ma table du lundi 16 au dimanche 22.

    Je voudrais savoir si vous avez un moyen simple pour écrire une fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public function getBornes($dateJour) {
     
    	/* ici $dateJour vaut '2012-04-17' */
     
    	// Début bloc à implémenter
    	$dateInf = ;
    	$dateSup = ;
    	// Fin bloc à implémenter
     
    	/* ici $dateInf vaut '2012-04-16' et $dateSup vaut '2012-04-22' */
     
    	return array($dateInf, $dateSup);
    }
    J'ai essayé de faire propre en utilisant ces fonctions mais en vain. En effet, il faut que cette fonction marche pour les cas aux limites comme le 28 février, le 1er janvier ou le 31 décembre...

    Merci pour vos pistes.

  2. #2
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    utilise la classe DatePeriod et ajoute la a ton DateTime

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    J'ai eu un peu de mal à comprendre le concept de ces classes, mais voici le bout de code que j'ai pu écrire avec celles-ci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    $now = new DateTime();
    $dateInf = $now->format('Y-m-d');
    $dateSup = $now->format('Y-m-d');
     
    if( date('N') > 1 ) { // Différent de lundi
     
    	$begin = new DateTime();
    	$interval = DateInterval::createFromDateString('previous monday');
    	$period = new DatePeriod($begin, $interval, 1);
     
    	foreach( $period as $dt )
    		$dateInf = $dt->format('Y-m-d');
    }
     
    if( date('N') < 7 ) { // Différent de dimanche
     
    	$begin = new DateTime();
    	$interval = DateInterval::createFromDateString('next sunday');
    	$period = new DatePeriod($begin, $interval, 1);
     
    	foreach( $period as $dt )
    		$dateSup = $dt->format('Y-m-d');
    }
    Cela me convient puisque ça fonctionne et n'est pas trop compliqué/hasardeux.
    Seul point "sale" c'est que mon objet $period contient deux dates à chaques fois : mon $begin et la date que je recherche. C'est pour cela que je foreach juste pour récupérer la 2e et dernière occurence; n'y a-t-il pas plus simple ?

  4. #4
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    J'aurais fait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $dt = new DateTime(date('Y\WW'));
    echo 'Lundi = '.$dt->format('d/m/Y');
     
    $dt->modify('Sunday');
     
    echo 'Dimanche = '.$dt->format('d/m/Y');
    Ca te donne le lundi et le dimanche de la semaine en cours. Si tu as besoin d'une semaine particulière suffit de fournir un timestamp à date().

    Dans ton exemple si tu es lundi à mon avis tu vas avoir des suprises avec l'utilisation de "previous monday"

    Pour avoir la liste de tous les jours tu peux boucler et faire modify('+1 day');
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    J'ai testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $dt = new DateTime(date('Y\WW'));
    $dateInf = $dt->format('Y-m-d');
    $dt->modify('Sunday');
    $dateSup = $dt->format('Y-m-d');
    Et en effet, ton code est plus simple...!
    Il semble fonctionner (pour la date du jour, je n'ai pas testé aux extrêmes).

    Dans ton exemple si tu es lundi à mon avis tu vas avoir des suprises avec l'utilisation de "previous monday"
    En revanche cela ne pose pas de problème dans mon code grace à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( date('N') > 1 ) { // Différent de lundi
    Si on est lundi, alors on a déjà trouvé la borne sans calcul (initialisation de $dateInf est déjà la bonne valeur).
    Le cas contraire, on applique l'algo qui utilise "previous monday".

    Merci à tous.

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    Bonjour,

    J'ouvre à nouveau ce topic puisque la solution ne semble pas fonctionne à 100%.
    En effet, au moment ou j'écris ce post il est 00:15 dans la nuit du dimanche au lundi, nous sommes donc lundi matin et ma méthode devrait me retourner $dateInf et $dateSup avec les dates de la semaine suivante, c'est à dire du lundi 23 au dimanche 29.
    Or les dates retournées sont toujours les même, celle de la semaine du lundi 16 au dimanche 22.

    J'ai envisagé un problème de fuseau horaire, cependant mon serveur est hébergé, via WAMP Server, sur ma machine qui est configurée en français avec l'heure française.

    Le code posant problème est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $date = new DateTime();
    $dt = new DateTime(date('Y\WW', $date->getTimestamp()));
    var_dump($dt->format('Y-m-d')); // Affiche '2012-04-16' or nous sommes le '2012-04-23' à 00:15.
    Merci pour votre aide complémentaire.

  7. #7
    Modérateur
    Avatar de grunk
    Homme Profil pro
    Lead dév - Architecte
    Inscrit en
    Août 2003
    Messages
    6 693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Lead dév - Architecte
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2003
    Messages : 6 693
    Par défaut
    J'ai envisagé un problème de fuseau horaire, cependant mon serveur est hébergé, via WAMP Server, sur ma machine qui est configurée en français avec l'heure française.
    date_default_timezone_set est il correctement défini ?
    Pry Framework php5 | N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Par défaut
    La ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    var_dump(date_default_timezone_get());
    Me retourne "UTC".
    J'ai donc fais un :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    date_default_timezone_set('Europe/Paris');
    Je vérifirai donc que le code fonctionne entre minuit et une heure, la prochaine fois.
    En attendant, je passe le topic à

    Merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Grouper des dates par semaines
    Par Nour08 dans le forum SAP Crystal Reports
    Réponses: 1
    Dernier message: 29/07/2011, 10h43
  2. Regroupement date par semaine
    Par lucazzo dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 14/10/2010, 09h30
  3. [Date] Grouper des dates par semaine
    Par KooKoolen dans le forum Langage
    Réponses: 3
    Dernier message: 06/12/2006, 11h05
  4. tri des dates par semaine
    Par syldudu dans le forum Access
    Réponses: 17
    Dernier message: 10/10/2006, 11h27
  5. [CR]grouper des dates par semaines, mais semaines FR !
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 18/05/2004, 20h43

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