Perl POSIX::strptime - мои данные выглядят как 9:31:00 AM - я хочу извлечь минуту и выполнить расчет
Я хочу извлечь минуты из указанного времени, которое существует во 2-м столбце файла с разделителями-запятыми, и выполнить расчет. Формат времени следующий:
9:31:00
Я хочу извлечь минутное значение и рассчитать общее количество минут за день. Я делаю это в подпрограмме get_time. Но возвращаемое значение всегда равно нулю, что заставляет меня думать, что я не использую POSIX::strptime правильно. Любое понимание было бы замечательно. Спасибо.
#!/usr/bin/env perl
use strict;
use POSIX::strptime;
use Text::CSV;
sub get_time
{
my($str) = @_;
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];
print "$hour\n";
return($hour*60 + $min)
}
open my $fh, "<", datafile.txt
my $csv = Text::CSV->new() or die "Failed to create Text::CSV object";
my $line = <$fh>;
die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
my @columns = $csv->fields();
while ($line = <$fh>)
{
chomp $line;
die "Failed to parse line <<$line>>\n\n" unless $csv->parse($line);
my @columns = $csv->fields();
die "Insufficient columns in <<$line>>\n" if scalar(@columns) < 1;
my $minute = get_time($columns[1]);
print "$minute\n";
}
2 ответа
Решение
В get_time у вас есть строка
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [3,4,5];`
Согласно документам, strptime возвращается
($sec, $min, $hour, $mday, $mon, $year, $wday, $yday) = POSIX::strptime("string", "Format");
Похоже, вам нужно
my ($sec, $min, $hour) = (POSIX::strptime($str, '%I:%M:%S')) [0,1,2];
вместо.
Удачи!
Невозможно правильно определить количество минут в дне до определенного времени, не зная часовой пояс и, возможно, дату.
$ perl -MDateTime -E'
for (10..16) {
my $dt = DateTime->new(
year => 2011,
month => 3,
day => $_,
hour => 9,
minute => 31,
second => 0,
time_zone => "America/New_York",
);
( my $ref_dt = $dt->clone )->truncate(to => "day");
my $minutes = ($dt - $ref_dt)->in_units("minutes");
say($dt->ymd, " ", $minutes);
}
'
2011-03-10 571
2011-03-11 571
2011-03-12 571
2011-03-13 511 <------
2011-03-14 571
2011-03-15 571
2011-03-16 571