【问题标题】:How to calculate time difference in perl using POSIX module?如何使用 POSIX 模块计算 perl 中的时间差?
【发布时间】:2022-01-15 17:54:00
【问题描述】:

我是 perl 脚本的新手。我需要找到天/小时/分钟/秒中两个日期的差异,如果我只有 POSIX 模块(我不能使用 Time::Piece 或 DateTime或...模块)

喜欢,

$date1 = Tue Nov 30 10:53:38 2021;
$date2 = Fri Dec 10 02:12:25 2021;

$output = $date2 - $date1 :: 这里 $output 应该是 09 天 3 小时 19 分钟 47 秒。

您能告诉我我们如何实现这一点:解析、计算吗?

我们将非常感谢您的帮助。

谢谢!

【问题讨论】:

  • 我的系统没有这个模块,因为是共享系统所以不能更新,不允许个人更新。
  • v5.8.8是perl版本,无法更新。
  • Perl 5.8.8 已经快 16 年 了。那太古老了,考虑到从那时起的所有错误修正,使用它是完全危险的。
  • 是的,我完全同意。但目前对此无能为力。您可以根据上述条件帮助查询吗?
  • 如何将这些时间戳输入到您的程序中?我的意思是Tue Nov 30 10:53:38 2021 来自哪里?为了执行您要求的操作,需要将这些字符串解析为日期时间组件,然后您可以使用一些简单的函数将它们作为可以减去的秒数,然后计算天数等。这是一些工作,那里可能缺少一些东西,但它是可行的。但是,也许您可​​以将日期时间读入您的程序中,从而让一切更容易开始。

标签: perl time posix


【解决方案1】:

解决问题的算法可以通过POSIX::mktime函数实现。

输入日期需要一些“按摩”,以通过mktime 函数将提供的日期带入预期的表示,这是由date2epoch 函数实现的,该函数以秒为单位返回日期表示。

一旦将日期转换为秒,只需简单的计算即可获得以天/小时/分钟/秒表示的时差。

注意#1:假设日期是在同一时区获得的。

注意#2:OP 的日期差计算是incorrect

use strict;
use warnings;
use feature 'say';

use POSIX;

my $date1 = 'Tue Nov 30 10:53:38 2021';
my $date2 = 'Fri Dec 10 02:12:25 2021';

my $diff = date_diff($date1,$date2);

printf "Date difference: %02d days %02d hours %02d min %02d sec\n",
       $diff->@{qw/days hours min sec/};

sub date_diff {
    my $date1 = shift;
    my $date2 = shift;

    my $diff;
    my $sec_diff = date2epoch($date2) - date2epoch($date1);

    $diff->{sec}   = $sec_diff % 60;
    $diff->{min}   = ($sec_diff % 3600 - $diff->{sec} ) / 60;
    $diff->{hours} = $sec_diff / 3600 % 24;
    $diff->{days}  = int( $sec_diff / ( 24 * 3600 ) );

    return $diff;
}

sub date2epoch {
    my $str_date = shift;

    my($months,$date,$epoch);
    
    $months->@{qw/Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec/} = (0..11);

    $date->@{qw/week_day month month_day time year/} = split(' ', $str_date);
    $date->@{qw/hour min sec/} = split(':', $date->{time});
    
    $date->{month} = $months->{ $date->{month} };
    $date->{year} -= 1900;
    
    $epoch = POSIX::mktime( $date->@{qw/sec min hour month_day month year/} );
    
    return $epoch;
}

输出

Date difference: 09 days 15 hours 18 min 47 sec

【讨论】:

    猜你喜欢
    • 2020-09-01
    • 2013-03-09
    • 2014-04-19
    • 1970-01-01
    • 2022-01-05
    • 2015-03-14
    • 2021-10-20
    • 1970-01-01
    • 2017-01-14
    相关资源
    最近更新 更多