Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/perl/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Perl—;以微秒为单位计算定时差_Perl - Fatal编程技术网

Perl—;以微秒为单位计算定时差

Perl—;以微秒为单位计算定时差,perl,Perl,我想使用Perl获得以下字符串的时差: 2013-12-27 13:28:14.975952 2013-12-27 13:28:16.345667(微秒) 我尝试使用mktime并从新纪元开始获得毫秒,但没有多大帮助 如果使用模块,如何转换上述时间以获得差异?或者你有更好的建议吗 use DateTime::Format::Strptime qw( ); my $format = DateTime::Format::Strptime->new( pattern => '%

我想使用Perl获得以下字符串的时差:

  • 2013-12-27 13:28:14.975952
  • 2013-12-27 13:28:16.345667
    (微秒) 我尝试使用
    mktime
    并从新纪元开始获得毫秒,但没有多大帮助

    如果使用模块,如何转换上述时间以获得差异?或者你有更好的建议吗

    use DateTime::Format::Strptime qw( );
    
    my $format = DateTime::Format::Strptime->new(
       pattern   => '%Y-%m-%d %H:%M:%S',
       on_error  => 'croak',
       time_zone => 'local',
    );
    
    sub parse_datetime {
       my ($str) = @_;
    
       my $nano;
       if ($str =~ /^([^.]*)\.(\d+)\z/) {
          $str = $1;
          $nano = "0.$2" * 1_000_000_000;
       } else {
          $nano = 0;
       }
    
       return $format->parse_datetime($str)->add( nanoseconds => $nano );
    }
    
    sub diff {
       return
          $_[1]->subtract_datetime_absolute($_[0])
             ->in_units('nanoseconds')
                / 1_000_000_000
    }
    
    my $dt1 = parse_datetime('2013-12-27 13:28:14.975952');
    my $dt2 = parse_datetime('2013-12-27 13:28:16.0345667');
    my $diff = diff($dt1, $dt2);
    print("$diff\n");
    
    但我有点困惑。HiRes返回类似于
    2013-12-27 13:28:14.975952
    。如果您实际使用的是
    Time::HiRes::Time
    ,则可以使用以下各项:

    use DateTime qw( );
    
    sub diff {
       return
          $_[1]->subtract_datetime_absolute($_[0])
             ->in_units('nanoseconds')
                / 1_000_000_000
    }
    
    my $dt1 = DateTime->from_epoch( epoch => 1388461836.975952,  time_zone => 'local' );
    my $dt2 = DateTime->from_epoch( epoch => 1388461838.0345667, time_zone => 'local' );
    my $diff = diff($dt1, $dt2);
    print("$diff\n");
    
    如果不是一个选项,从5.10开始就在core中

    use Time::Piece;
    
    sub str2time {
        my ($str) = @_;
        $str =~ s/(\.[0-9]+)?\z//;
        my $fraction = $1 || 0;
        return Time::Piece->strptime($str, '%Y-%m-%d %H:%M:%S')->epoch + $fraction;
    }
    
    my $t1 = str2time('2013-12-27 13:28:14.975952');
    my $t2 = str2time('2013-12-27 13:28:16.345667');
    
    printf "difference: %f\n", $t2 - $t1;
    

    谢谢,但是我没有安装DateTime::Format::Format::有更好的方法吗?当然没有。我会把它寄出去的。当然还有更糟糕的方法,甚至可能有同样好的方法。你为什么这么问?先生,谢谢你的来信,我确实喜欢它,而且它很好。只是我没有安装DateTime::Format。先生,谢谢你的帖子,我确实喜欢它,而且它很好。只是我没有安装DateTime::Format。将尝试使用第二个选项。您能告诉我如何获取epoch吗?我正在使用下面的方法获取epoch my$seconds=mktime(@mktime_args,0,0,$dst);我从第二个分数中去掉了前导零,因为7位数字表示该值不再以微秒为单位,而是以十分之一微秒为单位。答案不错,尽管我们需要阻止这种“我不能安装东西”的说法。