如何使用 POSIX 模块计算 perl 中的时间差?

Posted

技术标签:

【中文标题】如何使用 POSIX 模块计算 perl 中的时间差?【英文标题】:How to calculate time difference in perl using POSIX module? 【发布时间】: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 来自哪里?为了执行您要求的操作,需要将这些字符串解析为日期时间组件,然后您可以使用一些简单的函数将它们作为可以减去的秒数,然后计算天数等。这是一些工作,那里可能缺少一些东西,但它是可行的。但是,也许您可​​以将日期时间读入您的程序中,从而让一切更容易开始。 【参考方案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

【讨论】:

以上是关于如何使用 POSIX 模块计算 perl 中的时间差?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 Perl 模块中的常量?

使用 POSIX 将时间戳转换为 GMT

如何使用 Perl 中的 Win32::LongPath 模块来操作长路径名?

Perl 5.10 - POSIX 信号被忽略,除非在 sleep() 调用期间收到?

如何使用 Perl 计算文件中的字符、单词和行数?

如何在没有安装权限的情况下使用新的 Perl 模块?