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?
3 Réponses :
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 '', $ timestampSéparez la date en composants avec
split '-', $ dateObtenez 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";
}
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
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.
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:
Qu'avez-vous essayé? Quels problèmes rencontrez-vous? Veuillez nous montrer votre code.