如何使用 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 中的 Win32::LongPath 模块来操作长路径名?