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 Perl Discussion :

Les jours a partir de la semaine/année


Sujet :

Langage Perl

  1. #1
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut Les jours a partir de la semaine/année
    Bonjour.

    J’ai besoin de faire une fonction qui prend en entrée un numéro de semaine et une année et qui me retourne la liste des dates de la semaine.

    Du coup, j’ai écrit une petite fonction, mais elle n’est pas satisfaisante dans le sens ou sur l’entrée week = 50 & year = 2020 elle se décale d’une semaine.
    Je pense que s’est dû aux 53 semaines de 2020 sinon sur les autres tests sont OK.

    Voici le code pour illustrer le problème :

    Code perl : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    use Modern::Perl;
    use DateTime;
     
    # data d'entrée
    my @data = (
        '50,2020'
      , '3,2021'
      , '18,2022'
      , '8,2021'
    );
     
    foreach my $i ( @data ) {
        my ($week, $year) = split ',', $i;
        my $aref_dt = get_dt( $week, $year );
        say 'week: ',$week, ' year: ', $year;
        say $_ for $aref_dt->@*;
        print "---\n";
    }
     
    sub get_dt {
        my $week = shift;
        my $year = shift;
     
        # init la date
        my $dt = DateTime->now( locale => 'fr' )
                         ->set_time_zone( 'Europe/Paris' );
     
        # recale sur la bonne semaine
        unless ( $dt->week_number == $week 
              && $dt->week_year == $year ) {
     
            $dt->add( weeks =>  $week - $dt->week_number,
                      years =>  $year - $dt->week_year );
        }
     
        # recale sur le lundi    
        if ( $dt->local_day_of_week > 1 ) {
             $dt->subtract( days => $dt->local_day_of_week - 1 )
        }
     
        # construction de la liste de dates
        my $r;
        foreach my $i ( 0..6 ) {
            my $dt_clone = $dt->clone;
            $dt_clone->add( days => $i );
            push $r->@*, $dt_clone->ymd('-');
        }
     
        $r
    }

    Si quelqu’un a une idée pour corriger ou même une autre solution, je suis preneur !

  2. #2
    Membre habitué
    Homme Profil pro
    Master Data Manager
    Inscrit en
    Février 2017
    Messages
    113
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : Master Data Manager
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 113
    Points : 148
    Points
    148
    Par défaut
    Ok … alors je vien me repondre XD.

    Le problème vient de la partie :
    Code perl : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
        # recale sur la bonne semaine
        unless ( $dt->week_number == $week 
              && $dt->week_year == $year ) {
     
            $dt->add( weeks =>  $week - $dt->week_number,
                      years =>  $year - $dt->week_year );
        }
    Car en modifiant l’année d’un objet datetime le numéro de semaine peut ne pas être le même que l’année courante. Donc pour résoudre le problème on doit d’abord modifier l’année puis le numéro de semaine.

    Voici le code corrigé :
    Code perl : 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    use Modern::Perl;
    use DateTime;
     
    # data d'entrée
    my @data = (
        '50,2020'
      , '3,2021'
      , '18,2022'
      , '8,2021'
    );
     
    foreach my $i ( @data ) {
        my ($week, $year) = split ',', $i;
        my $aref_dt = get_dt( $week, $year );
        say 'week: ',$week, ' year: ', $year;
        say $_ for $aref_dt->@*;
        print "---\n";
    }
     
    sub get_dt {
        my $week = shift;
        my $year = shift;
     
        # init la date
        my $dt = DateTime->now( locale => 'fr' )
                         ->set_time_zone( 'Europe/Paris' );
     
        # recale sur la bonne semaine
        unless ( $dt->week_number == $week 
              && $dt->week_year == $year ) {
     
            $dt->add( years => $year - $dt->week_year   );
            $dt->add( weeks => $week - $dt->week_number );
        }
     
        # recale sur le lundi    
        if ( $dt->local_day_of_week > 1 ) {
             $dt->subtract( days => $dt->local_day_of_week - 1 )
        }
     
        # construction de la liste des dates
        my $r;
        foreach my $i ( 0..6 ) {
            my $dt_clone = $dt->clone;
            $dt_clone->add( days => $i );
            push $r->@*, $dt_clone->ymd('-');
        }
     
        $r
    }

    Si vous avez des remarques ou propositions pour répondre au besoin d’une autre manière, je suis toujours preneur.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 07/08/2019, 15h32
  2. Réponses: 0
    Dernier message: 11/08/2010, 09h36
  3. Réponses: 9
    Dernier message: 21/07/2010, 08h43
  4. trouver date du jour a partir du numero de la semaine dans l'année
    Par JAMINF dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 19/06/2008, 16h41
  5. [D7] trouver un jour a partir d'une semaine et date
    Par raoulmania dans le forum Langage
    Réponses: 4
    Dernier message: 01/12/2005, 11h43

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