【问题标题】:PERL Using localtime how am I able to calculate next week dayPERL 使用本地时间我如何计算下工作日
【发布时间】:2016-08-07 18:42:41
【问题描述】:

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

示例:本地时间天是星期三,我要求星期四,偏移量是 +1,天是星期四,我要求星期一,偏移量是 +4

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

有没有某种算法我可以解决这个问题?我无法在 Perl 中使用 DateTime & Time::Piece 库作为限制。

我正在使用:

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

感谢您的帮助,谢谢!

【问题讨论】:

  • 您是要查找下一个工作日(周一至周五,与周末相反)还是一周的第二天?如果是前者,那么星期四之后的下一个工作日是星期五,而不是星期一。
  • 我希望找到下周一,如果现在是周一,我希望它下周找到。如果有帮助的话。
  • 好的,这就澄清了。请edit你的问题说出来,目前还不清楚(Schwern 以为你在问如何添加一天)。
  • 对不起,我已经修复了帖子。

标签: perl time dayofweek localtime


【解决方案1】:

对于 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;

【讨论】:

  • 我无法使用 Time::Piece 作为另一个限制
  • @JohnnyDoey 为什么你不能使用 Time::Piece?人们说他们不能使用模块的通常原因是因为他们不能安装它们,但是 Time::Piece 自 Perl 5.10 以来一直是核心模块;很有可能您已经拥有它。
  • @JohnnyDoey 您是否正在使用像 Fedora/CentOS/Scientific Linux/Oracle Linux 这样的 Red Hat 变体?如果是这样,请让您的系统管理员安装perl-core 包,这样您就可以实际安装功能齐全的perl。如果您在其他平台上,请让您的系统管理员以适合该平台的方式对其进行修复。
  • @JohnnyDoey 一些发行版将 perl 与其模块分开,因此可能只需安装另一个软件包,如 perl-modules。它是一个包安装应该使它更容易安装,并解释它会为你节省大量的编码时间(和错误)。无论哪种方式,你都可以和localtime一起跛行,算法是一样的,但是日期计算会更难。
  • 不,你不能用localtime正确地做到这一点;你必须使用gmtime。 (gmtime(timegm(localtime()) + $seconds))。即使这样,它也可以提供您所在时区不存在的结果。
猜你喜欢
  • 2022-08-11
  • 1970-01-01
  • 1970-01-01
  • 2014-12-20
  • 1970-01-01
  • 2015-08-14
  • 2012-06-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多