为了账号安全,请及时绑定邮箱和手机立即绑定

Perl构造日期对象和计算日期间天数差的问题

Perl构造日期对象和计算日期间天数差的问题

白猪掌柜的 2019-03-29 11:18:38
Perl构造日期对象和计算日期间天数差的问题
查看完整描述

2 回答

?
慕妹3242003

TA贡献1824条经验 获得超6个赞

时间相减
use Date::Calc qw( Delta_Days );
print Delta_Days(2009,8,21,2010,8,21),"\n";
# calculate 2009-8-21 to 2010-8-21
# result 365

PERL时间操作对象
Perl中的time() 函数返回以纪元秒形式表示的当前日期和时间。如果你打算把它转换为字符串,就可使用gmtime() 和localtime() 函数:
$now = localtime(time());

($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime(time());

如果调用 localtime() 或gmtime() 时不带参数,它将自己调用time()

$now = localtime();

($sec, $min, $hour, $day, $mon, $year, $wday, $yday, $isdst) = localtime();

常见的日期和时间操作

如果你打算计算两个时刻之间的时间段,只需将它们转换为相应的纪元秒,然后两数相减即可:

$difference_in_seconds = $later_datetime -$earlier_datetime;

要把秒转换为分,时,或天数,只需要分别将它们除以60, 3600 和 86400 即可:

$difference_in_minutes = $difference_in_seconds / 60;

$difference_in_hours = $difference_in_seconds / 3600;

$difference_in_day = $difference_in_seconds / 86400;

反过来做,你也可以回答如下问题:”4天后是几号?”:

$then = time() + 86400 * 4;

print scalar localtime $then;

它给出的答案精确到秒。例如,如果4天后的纪元秒值为932836935, 你可以输出日期的字符串如下;

Sat Jul 24 11:23:17 1999

如果你打算输出那个日期的午夜时分 (如”Sat Jul 24 00:00:00 1999〃) 使用如下模块:$then = $then - $then % 86400; # 去掉那个日期的尾巴

类似地,你可以用四舍五入法,输出最靠近午夜时分的日期:

$then += 43200; # add on half a day

$then = $then - $then % 86400;# truncate to the day

如果你的时区距离GMT为相差偶数个小时,这就管用了。并不是所有的时区都是很容易处理的。你所真正需要的是在你自己的时区内计算纪元秒,而不是在GMT中计算。

Perl 中的名为Time::Local的模块,可以提供两个函数 timelocal() 和timegm()。其返回值同 localtime() 和gmtime() 一样。

use Time::Local;

$then = time() + 4*86400;

$then = timegm localtime $then;

# local epoch seconds
$then -= $then % 86400;

# truncate to the day

$then = timelocal gmtime $then;

# back to gmt epoch seconds

print scalar localtime $then, “\n”;



查看完整回答
反对 回复 2019-03-31
  • 2 回答
  • 0 关注
  • 931 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信