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] Numero de semaine ISO et dates ??


Sujet :

Langage PHP

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut [Dates] Numero de semaine ISO et dates ??
    Bonjour à vous!

    Voila, j'ai quelques problèmes avec les manipulations de date.

    Je cherche, à partir du numero ISO d'une semaine et d'une année, à trouver la date de debut et la date de fin de cette semaine là. (en considérant que la semaine commence un lundi et fini le dimanche)

    Par exemple, si j'indique que nous sommes la semaine 46 et en 2005, j'aimerais recuperer 2 valeurs: 14/11/2005 et 20/11/2005 (respectivement lundi, dimanche).

    Quelqu'un aurait-il déjà eu besoin d'une telle fonction? J'ai cru voir des sources sur certains sites qui pouvaient seulement retourner le mois correspondant, mais pas plus...et j'ai pas testé s'ils fonctionnaient...

    Merci pour vos futurs reponses et coups de pouce

    PS: Je mets résolu car les reponses données conviennent. Juste quelques trucs a modifier[/b]

  2. #2
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Rhaa, je galere...
    Je vois que personne n'a d'idée non plus

  3. #3
    Expert éminent Avatar de Mr N.
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    5 418
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 5 418
    Points : 6 449
    Points
    6 449
    Par défaut
    Si le coeur t'en dis :
    http://sqlpro.developpez.com/cours/gestiontemps/#L3.1

    Pour un numéro de semaine donné tu sais, si je lis bien, le jour de début et donc le jour de fin...
    Bon courage

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Merci, je vais regardé ca de plus pres...
    Mais je bosse sur une appli pour mon stage..et jai pas le droit de creer de base...je peux seulement consulter celles existantes ...

    D'ou ma recherche pour un algo ou plusieurs algo

    Enfin, merci qd meme, je vais deja lire ca, ca me donnera p-e des idées

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 44
    Points : 55
    Points
    55
    Par défaut
    Voici un petit code que je viens d'écrire, je pense que tu peux en sortir une fonction appropriée à tes besoins...

    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
    <?php
     
    $semaine         = isset($_GET['semaine']) && $_GET['semaine'] > 0 ? intval($_GET['semaine']) : 1;
    $prems_janvier	= mktime(0,0,0,1,1,date('Y'));
    $jour_1		    = date('w', $prems_janvier);
     
    if ($jour_1 == 0) { // si dimanche
    	$jour_1		= 7;
    }
     
    if ($jour_1 == 1) { // Lundi => rien à modifier
    	$deb		= $prems_janvier;
    }
    else {
    	$deb		= $prems_janvier + 86400 * (8 - $jour_1);
    }
     
    $lundi		= $deb + 7 * ($semaine-1) * 86400;
    $dimanche	= $deb + 7 * $semaine * 86400 - 86400;
     
    echo date('l d/m/Y', $prems_janvier).'<br>';
    echo date('l d/m/Y', $lundi).' - '.date('l d/m/Y', $dimanche);
    Je gère les dates au format timestamp unix. 86400 équivaut au nombre de secondes dans une journée.

    Si par hasard, tu ne comprends pas tout, n'hésite pas à me poser des questions ...

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Citation Envoyé par neby55
    Voici un petit code que je viens d'écrire, je pense que tu peux en sortir une fonction appropriée à tes besoins...
    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
     
    <?php
    $semaine         = isset($_GET['semaine']) && $_GET['semaine'] > 0 ? intval($_GET['semaine']) : 1;
    $prems_janvier	= mktime(0,0,0,1,1,date('Y'));
    $jour_1		    = date('w', $prems_janvier);
     
    if ($jour_1 == 0) { // si dimanche
    	$jour_1		= 7;
    }
     
    if ($jour_1 == 1) { // Lundi => rien à modifier
    	$deb		= $prems_janvier;
    }
    else {
    	$deb		= $prems_janvier + 86400 * (8 - $jour_1);
    }
     
    $lundi		= $deb + 7 * ($semaine-1) * 86400;
    $dimanche	= $deb + 7 * $semaine * 86400 - 86400;
     
    echo date('l d/m/Y', $prems_janvier).'<br>';
    echo date('l d/m/Y', $lundi).' - '.date('l d/m/Y', $dimanche);
    Je gère les dates au format timestamp unix. 86400 équivaut au nombre de secondes dans une journée.
    Si par hasard, tu ne comprends pas tout, n'hésite pas à me poser des questions ...
    Alors là, chapeau
    Le code marche bien avec les quelques tests que j'ai fais.
    Je vais vérifier sur des années ayant 53 semaines pour voir mais je pense qu'il n'y aura pas trop de probleme ^^.
    Mais sinon, le code est clair et assez facilement compréhensible. Je n'avais pas trop d'idée pour faire ce calcul, mais en fait, maintenant, ca me semble clair.
    Je vais transformer ca en fonction qui me retourne un tableau de 2 valeurs(date du lundi, date du dimanche)
    Gros merci à toi!!

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    Bon, apres un petit test avec la semaine 53 de 2004, il y a une petite erreur.
    Le 1er janvier de 2004 est bien un Jeudi (comme indiqué par le morceau de code ci-dessus)
    Mais retourne Lundi 03/01/2005 - Dimanche 09/01/2005 (correspond aussi a semaine 1 de 2005 dans le programme...)
    au lieu de Lundi 27/12/2004 - Dimanche 02/01/2005 (trouvé par la semaine 52 dans le programme...)

    Je vais essayer sur d'autres exemples de semaines 53 pour d'autres années...
    Si le probleme est identique, je "tricherai" en forçant la semaine 52:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if($semaine == 53)
            $semaine = 52;
    Je sais que ce n'est pas une solution tres "propre", mais si ca fonctionne pour tous les cas particulier de semaines 53, ca me suffira bien ^^

    PS: Dans le doute, j'ai refais le test mais au lieu de dire semaine = 53 et annee = 2004, jai indique semaine = 0 et année = 2005!
    Et je tombe sur le resultat de ma semaine 53 (27/12/2004 - 02/01/2005)
    J'approfondis ma recherche ^^

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 44
    Points : 55
    Points
    55
    Par défaut
    Cette "erreur" vient du fait que l'année n'est pas paramètrable actuellement.

    voilà le code avec l'année en paramètre :
    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
    24
    25
    26
    27
    <?php
     
    $semaine	= isset($_GET['semaine']) && $_GET['semaine'] > 0 ? intval($_GET['semaine']) : 1;
    // Début changements
    $annee		= isset($_GET['annee']) && $_GET['annee'] > 0 ? intval($_GET['annee']) : date('Y'); // Format YYYY (ex: 2005)
     
    $prems_janvier	= mktime(0,0,0,1,1,$annee);
    // FIN changements
     
    $jour_1		= date('w', $prems_janvier);
     
    if ($jour_1 == 0) { // si dimanche
    	$jour_1		= 7;
    }
     
    if ($jour_1 == 1) { // Lundi
    	$deb		= $prems_janvier;
    }
    else {
    	$deb		= $prems_janvier + 86400 * (8 - $jour_1);
    }
     
    $lundi		= $deb + 7 * ($semaine-1) * 86400;
    $dimanche	= $deb + 7 * $semaine * 86400 - 86400;
     
    echo date('l d/m/Y', $prems_janvier).'<br>';
    echo date('l d/m/Y', $lundi).' - '.date('l d/m/Y', $dimanche);

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Août 2005
    Messages
    161
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2005
    Messages : 161
    Points : 193
    Points
    193
    Par défaut
    J'avais déjà fais ce changement pour l'année ^^
    Et le probleme reste identique.

    En parametre:
    semaine = 53
    annee = 2004

    Et voici ce que la page m'affiche
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Thursday 01/01/2004
    Monday 03/01/2005 - Sunday 09/01/2005
    Alors que la semaine 53 pour l'année 2004 devrait donner
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Thursday 01/01/2004
    Monday 27/12/2004 - Sunday 02/01/2005

    Je continue à me renseigner sur ces cas particuliers de 53eme semaines...

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Septembre 2005
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 44
    Points : 55
    Points
    55
    Par défaut
    http://fr.wikipedia.org/wiki/ISO_8601
    Il est dit dans cette article que la première semaine de l'année est celle qui contient le 4 Janvier.
    Or, dans le script que je t'ai refilé, je prends pour première semaine de l'année celle contenant le premier lundi de l'année...

    Voici les modifs. J'ai testé, j'arrive au bon résultat.
    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
    24
    <?php
     
    $semaine	= isset($_GET['semaine']) && $_GET['semaine'] > 0 ? intval($_GET['semaine']) : 1;
    $annee		= isset($_GET['annee']) && $_GET['annee'] > 0 ? intval($_GET['annee']) : date('Y'); // Format YYYY (ex: 2005)
     
    $quatre_janvier	= mktime(0,0,0,1,4,$annee);
    $jour_1		= date('w', $quatre_janvier);
     
    if ($jour_1 == 0) { // si dimanche
    	$jour_1		= 7;
    }
     
    if ($jour_1 == 1) { // Lundi
    	$deb		= $quatre_janvier;
    }
    else {
    	$deb		= $quatre_janvier - 86400 * ($jour_1 - 1);
    }
     
    $lundi		= $deb + 7 * ($semaine-1) * 86400;
    $dimanche	= $deb + 7 * $semaine * 86400 - 86400;
     
    echo date('l d/m/Y', $quatre_janvier).'<br>';
    echo date('l d/m/Y', $lundi).' - '.date('l d/m/Y', $dimanche);
    Nous n'avions pas toutes les données, on ne pouvait pas arriver au bon résultat...

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 30/12/2014, 17h15
  2. Date numero semaine Texte en Date numero de semaine date
    Par alexandrebb dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 18/07/2013, 10h05
  3. Récupérer numero de semaine d'une date
    Par steph05 dans le forum SAS Base
    Réponses: 11
    Dernier message: 07/10/2010, 13h22
  4. Date , Numero de semaine
    Par SirDarken dans le forum Langage
    Réponses: 9
    Dernier message: 24/03/2010, 16h09
  5. Réponses: 10
    Dernier message: 20/09/2005, 15h32

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