1
votes

Changer un format d'horodatage avec perl

J'ai un horodatage dans mes données. qui ressemble à ceci:

Apr 30 16:47:21
Apr 10 14:11:18

C'est une chaîne. Comment pourrais-je changer leurs formats pour qu'ils ressemblent à ceci:

2020-04-30 16:47:21
2020-04-10 14:11:18

Quelle bibliothèque dois-je utiliser? Peut-être DateTime?


1 commentaires

Qu'avez-vous essayé? Quels problèmes rencontrez-vous? Veuillez nous montrer votre code.


3 Réponses :


3
votes

Aucun module / bibliothèque nécessaire, un simple hachage avec des noms de mois peut aider à transformer la date au format souhaité.

Séparez la date et l'heure avec split '', $ timestamp

Séparez la date en composants avec split '-', $ date

Obtenez le nom du mois à partir du hachage avec $months{$month+0}

Formez une nouvelle chaîne de date au format souhaité

use strict;
use warnings;
use feature 'say';


my $timestamp = '2020-04-10 14:11:18';

my $date = transform($timestamp);

say $date;


sub transform {
    my $timestamp = shift;

    my %months = ( 1 => 'Jan',  2 => 'Feb',  3 => 'Mar',  4 => 'Apr',
                   5 => 'May',  6 => 'Jun',  7 => 'Jul',  8 => 'Aug',
                   9 => 'Sep', 10 => 'Oct', 11 => 'Nov', 12 => 'Dec'
                );

    my($date,$time) = split ' ', $timestamp;
    my($year,$month,$day) = split '-', $date;
    
    return "$months{$month+0} $day $time";
}


0 commentaires

3
votes

DateTime fonctionnerait certainement ici, mais Time :: Piece a fait partie de la bibliothèque standard Perl depuis 2007. Elle a une méthode strptime () ("string parse time") pour créer des objets à partir d'une chaîne et d'un strftime () ("string format time ") pour produire des chaînes de date formatées à partir de vos objets.

#!/usr/bin/perl

use strict;
use warnings;
use feature 'say';
use Time::Piece;

while (<DATA>) {
  chomp;
  my $date = Time::Piece->strptime($_, '%Y-%m-%d %H:%M:%S');

  say $date->strftime('%b %d %H:%M:%S');
}

__DATA__
2020-04-10 14:11:18
2020-04-30 16:47:21


1 commentaires

Remarque supplémentaire: la conversion % b de strftime dépend des paramètres régionaux. Cela peut être bon ou poser un problème, selon l'utilisation prévue du résultat.



0
votes

Les deux solutions ci-dessus sont bonnes. Le code ci-dessous décrit une autre façon simple de formater la date.

DateTime :: Format :: Strptime - Analyser et formater les modèles de temps strp et strf

% F: Équivalent à% Y-% m- %ré. (Il s'agit de la date de style ISO)

% T: Équivaut à% H:% M:% S.

% b ou% B ou% h: Le nom du mois selon la locale donnée, sous forme abrégée ou le nom complet.

New format Datetime: Apr 10 14:11:18

Sortie:

use DateTime::Format::Strptime;

my $current_date_format="%F %T";
my $new_date_format="%b %d %T";

my $date_time = "2020-04-10 14:11:18";

my $formatter = DateTime::Format::Strptime->new(pattern => "$current_date_format");
my $dt_obj    = $formatter->parse_datetime($date_time);
my $datetime  = $dt_obj->strftime($new_date_format);

print "\n New format Datetime: $datetime \n";

Ref:


0 commentaires