perl转换为HH:MM:SS到MM.MMM

时间:2013-06-18 14:29:59

标签: perl

我需要使用perl从文本文件DOW YYYY-MM-DD H:MM:SS.S读入,然后输出小数分钟MM.MMMM。给定输入文本文件

Fri 2013-06-14 0:59:15.3
Sat 2013-06-15 1:01:30.6
Sun 2013-06-16 1:03:45.9

我想计算小数分钟值

(60*0)+59+(15.3/60) = 59.2550
(60*1)+01+(30.6/60) = 61.5100
(60*1)+03+(45.6/60) = 63.7600

然后输出

(59.2550, 61.5100, 63.7600)

3 个答案:

答案 0 :(得分:3)

假设文本文件中的每一行都是它自己的日期,并且您正在读取的文件位于同一目录中并且名为input.txt,我会这样做:

use strict;
use warnings;

my @result = ();

{
  open (my $file, "<", "input.txt") or die "cannot open < input.txt: $!";
  while(<$file>){
    my @current = split(/:/,substr($_,15));
    push(@result, (60*$current[0]) + $current[1] + ($current[2]/60));
  }
}

print "(" . join(',',@result) . ")";

答案 1 :(得分:3)

输入文件的格式不是很清楚,但这似乎产生了你想要的。它期望输入文件的路径作为命令行参数。

use strict;
use warnings;

my @minutes;
while (<>) {
  push @minutes, $1*60 + $2 + $3/60 if /(\d+):(\d+):([\d.]+)/;
}

printf "(%s)\n", join ', ', map sprintf('%.4f', $_), @minutes;

<强>输出

(59.2550, 61.5100, 63.7650)

答案 2 :(得分:0)

首先,您必须捕获您的输入:

my $time = "Fri 2013-06-14 0:59:15.3";
$time =~ /(\d+?):(\d+?):(.+)$/  #The time captured in three components
my $hours   = $1;
my $minute  = $2;
my $seconds = $3;

regular expression描述了您想要在线上匹配的内容。 $表示将我的表达式锚定在该行的末尾。 (..)是捕获组。这些内容会捕获我的正则表达式中匹配的内容,并通过$1$2$3变量提供这些内容。

如果你从未学过正则表达式,那么你应该这样做。正则表达式非常强大,您应该在上面的链接中阅读它们,或者尝试Perldoc tutorial

现在,我已经捕获了各种各样的时间(假设60分钟和60分钟),我现在可以进行计算了:

my $time_in_seconds = ( $hours * 3600 ) + ( $minutes * 60 ) + $seconds;
my $time_in_minutes = $time_in_seconds / 60;

计算机上的分区存在准确性问题,因为很难在基数2中表示小数十进制数。因此,我更倾向于将它全部乘以,然后除以60。

一旦你有时间,你需要以你想要的格式打印出来。这需要printf

printf "%9.4f\n", $time_in_minutes;

%9.4f指定格式。 f表示这是浮点号(基本上是非整数)。 4表示小数位数。 9表示包含小数的字段宽度,小数点另一侧的四个字符和减号。因此,这将允许宽度达-9999.999,这足够了。

全部放在一起......

#! /usr/bin/env perl
#
use warnings;
use strict;
use feature qw(say);

while ( my $time = <DATA> ) {
    chomp $time;
    $time =~ /(\d+?):(\d+?):(.+)$/;  #The time captured in three components
    my $hours    = $1;
    my $minutes  = $2;
    my $seconds  = $3;
    my $time_in_seconds = ( $hours * 3600 ) + ( $minutes * 60 ) + $seconds;
    my $time_in_minutes = $time_in_seconds / 60;
    printf qq(%9.4f\n), $time_in_minutes;
}

__DATA__
Fri 2013-06-14 0:59:15.3
Sat 2013-06-15 1:01:30.6
Sun 2013-06-16 1:03:45.9

现在运行它:

$ ./test.pl 
  59.2550
  61.5100
  63.7650

看起来正确。