PERL使用本地时间我如何计算下周工作日

时间:2016-04-15 17:12:44

标签: perl time dayofweek localtime

我正在尝试使用以下变量计算第二天(例如星期一/星期二/星期三等)。

示例:当地时间是星期三,我要求星期四,抵消为+1,星期四是星期四,我需要星期一,抵消为+4

my @days = qw(Sunday Monday Tuesday Wednesday Thursday Friday Saturday);
my ($sec, $min, $hour, $mday, $mon, $year, $wday, $yday, $isdst) = localtime

我可以通过某种算法来解决这个问题吗?我无法使用DateTime& Time :: Perl中的Piece库作为限制。

我正在使用:

my $daysToAdd = 8 - $wday; # picks up how many days there is until next Monday

感谢任何帮助,谢谢!

1 个答案:

答案 0 :(得分:3)

对于Perl中的基本日期处理,抛弃localtime并使用内置的Time::Piece类。 It will do basic date math

use strict;
use warnings;
use v5.10;

use Time::Piece;
use Time::Seconds;  # Some useful constants like ONE_DAY

my $now = Time::Piece->new;
say $now;

my $tomorrow = $now + ONE_DAY;
say $tomorrow;

计算两个星期之间的偏移量,将它们映射到数字并使用这些数字。星期日是0,星期一是1,依此类推。用于确定在两个工作日之间必须提前多少天的算法是......

(7 - $current_dow + $new_dow) % 7

要扩展它:7 - $current_dow是从当天到本周结束的天数。然后将所需的日期添加到该日期。整个事情是mod 7(因此8变为1)来处理前几天(即周三到周五)移动的情况。

周五到周四这样做是......

(7 - 5 + 4) % 7
(2 + 4) % 7
6 % 7
6

星期五到星期六这样做是......

(7 - 5 + 6) % 7
(2 + 6) % 7
8 % 7
1

这是代码。

my $day = 4; # Thursday
my $days_offset = (7 - $now->day_of_week + $day) % 7;
my $thursday = $now + ($days_offset * ONE_DAY);
say $thursday;