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 '', $ 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"; }
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.