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 :

Remplacer " ", "/" et incrementer l'heure


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Par défaut Remplacer " ", "/" et incrementer l'heure
    Bonjour!

    Je suis actuellement confronté a un petit problème :
    J'ai une date sous cette forme :
    2012-03-31 23:58:54

    J'aimerai la transformer en : YYYY/MM/JJ.hh:mm:ss

    Il faut donc que j'utilise des expressions régulières mais après moulte test je n'ai toujours pas réussi a obtenir le résultat voulu.

    De plus cette chaine est dans une variable et j'aimerai l'incrémenter de 15 minutes jusqu'à une date donnée. Faut il que j'utilise un format de time special?

    Merci d'avance pour votre aide.

    Cordialement.

    Loic

  2. #2
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Par défaut
    J'ai finalement trouvé comment remplacer les caractères :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $maChaine =~ s/ /./g;     # remplace l'espace par un point
    $maChaine =~ s/-/\//g;    # remplace les - par des /
    Mais je ne sais toujours pas comment incrémenter cette chaine par tranche de 15 minutes.
    Il doit exister un moyen de convertir en timestamp et ainsi qu'il gere automatiquement l'incrementation des minutes/heures/jours... si nécessaire.

    Une idée?

    Cordialement

  3. #3
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Par défaut
    je me suis finalement résigné à faire mon propre programme :
    Je fournis une date sous la forme : YYYY MM JJ hh mm ss
    suivit de lq duree en minute à ajouter.
    Le programme me ressort alors la nouvelle date sous la forme : YYYY/MM/JJ.hh:mm:ss

    script :
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
     
    #!/usr/bin/perl 
     
     
    $year = $yearLeft= $ARGV[0];
    $month= $monthLeft = $ARGV[1];
    $day = $dayLeft = $ARGV[2];
    $hour = $hourLeft= $ARGV[3];
    $minute = $minuteLeft =$ARGV[4];
    $seconde= $secondeLeft = $ARGV[5];
    $minuteToAdd = $ARGV[6];
     
    $minuteLeft = ($minute+$minuteToAdd)%60;
    $hourToAdd = int(($minute+$minuteToAdd)/60);
    if ($hourToAdd != 0){
    	$hourLeft = ($hour+$hourToAdd)%24;
    	$dayToAdd = int(($hour+$hourToAdd)/24);
    	if ($dayToAdd != 0){
    		if ($month == 1 ||$month == 3 ||$month == 5 ||$month == 7 ||$month == 8 ||$month == 10||$month == 12){ 
    			$dayLeft = ($day+$dayToAdd)% 31;
    			if ($dayLeft == 0){$dayLeft =31;$monthToAdd = 0;}
    			else{$monthToAdd = int(($day+$dayToAdd)/ 31);}
    		}elsif($month == 2){
    			$dayLeft = ($day+$dayToAdd)% 28;
    			if ($dayLeft == 0){$dayLeft =28;$monthToAdd = 0;}
    			else{$monthToAdd = int(($day+$dayToAdd)/ 28);}
    		}else
    		{
    			$dayLeft = (($day+$dayToAdd)% 30);
    			if ($dayLeft == 0){
    				$dayLeft =30;
    				$monthToAdd = 0;
    			}else{
    			$monthToAdd = int(($day+$dayToAdd)/30);}
    		}
    		if ($monthToAdd !=0){
    			$monthLeft = ($month+ $monthToAdd)%12;
    			if ($monthLeft == 0){
    				$monthLeft = 12;
    				$yearToAdd=0;
    			}elsif($monthLeft ==1){
    				$yearToAdd = 1;
    			}else{$yearToAdd=0;}
    			if ($yearToAdd != 0){
    				$yearLeft = $year + $yearToAdd;	
    			}
    		}
    	}
    }
    if(length($monthLeft)==1){$monthLeft = "0".$monthLeft;}
    if(length($dayLeft)==1){$dayLeft = "0".$dayLeft;}
    if(length($hourLeft)==1){$hourLeft = "0".$hourLeft;}
    if(length($minuteLeft)==1){$minuteLeft = "0".$minuteLeft;}
     
    printf("$yearLeft/$monthLeft/$dayLeft.$hourLeft:$minuteLeft:$seconde");


    Dites moi si vous voyez une erreur.

    Ne gere pas les années bisextiles.



    EDIT : Mes tabulations ne s'affichent pas sur le forum. Mais j'espere que vous arriverai à vous y retrouver...

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    Pour obtenir l'heure en seconde depuis EPOCH à partir de ta chaine, tu utilises mktime du module POSIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use POSIX qw(mktime strftime);
    my $date_str = "2012-03-31 23:58:54";
    my ($year, $mon, $mday, $hour, $min, $sec) = split /[\- :]/, $date_str;
    $year -= 1900;
    $mon -= 1;
    my $time = mktime($sec,$min,$hour,$mday,$mon,$year);
    Tu peux alors faire tous les calculs de date que tu veux (en seconde) avec $time.
    Pour l'afficher au format qui t'intéresse, tu utilises strftime du module POSIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print strftime("%Y/%m/%d.%T", $time);

  5. #5
    Membre du Club
    Inscrit en
    Janvier 2011
    Messages
    8
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 8
    Par défaut
    Citation Envoyé par Philou67430 Voir le message
    Pour obtenir l'heure en seconde depuis EPOCH à partir de ta chaine, tu utilises mktime du module POSIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    use POSIX qw(mktime strftime);
    my $date_str = "2012-03-31 23:58:54";
    my ($year, $mon, $mday, $hour, $min, $sec) = split /[\- :]/, $date_str;
    $year -= 1900;
    $mon -= 1;
    my $time = mktime($sec,$min,$hour,$mday,$mon,$year);
    Tu peux alors faire tous les calculs de date que tu veux (en seconde) avec $time.
    Pour l'afficher au format qui t'intéresse, tu utilises strftime du module POSIX :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print strftime("%Y/%m/%d.%T", $time);
    Merci pour ta réponse.
    Ca aurait été beaucoup plus simple et sur si j'avais utilisé cette méthode. Je le saurai.

    Mon probléme est donc résolu.

    Bonne soirée.

  6. #6
    Expert confirmé

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2009
    Messages
    3 577
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 59
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2009
    Messages : 3 577
    Par défaut
    C'est surtout plus juste : les calculs en secondes et les conversions avec strftime gèrent toutes les problématiques propres aux dates (année bissextiles y compris).

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 30/12/2010, 17h02
  2. Quote et double quote
    Par aktos dans le forum Langage
    Réponses: 8
    Dernier message: 05/01/2007, 19h55

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