如何在Perl中获得一个月的第三个星期五?[已结束]

omhiaaxx  于 2022-11-15  发布在  Perl
关注(0)|答案(2)|浏览(147)

**已关闭。**此问题需要debugging details。当前不接受答案。

编辑问题以包含desired behavior, a specific problem or error, and the shortest code necessary to reproduce the problem。这将有助于其他人回答问题。
三个月前关门了。
Improve this question
我想使用Perl查找任何月份的第三个星期五。我正在使用数据库的代码,但无法找到,只是得到了最后一个星期五

0yg35tkg

0yg35tkg1#

使用核心模块Time::Piece

#!/usr/bin/perl
use warnings;
use strict;
use feature qw{ say };

use Time::Piece;
use Time::Seconds qw{ ONE_DAY ONE_WEEK };

my $year = 2022;
my $month = 8;

my $tp = 'Time::Piece'->strptime("$year-$month-1", '%Y-%m-%d');
$tp += ONE_DAY * ((5 - $tp->day_of_week) % 7);  # First Friday.
$tp += 2 * ONE_WEEK;
say $tp;
piv4azn7

piv4azn72#

我和池上有同样的想法。在代码中(使用日期时间):

my $dt = DateTime->new(year => $year, month => $month, day => 1);
my $days_until_friday = (5 - $dt->day_of_week) % 7;
$dt->add(days => $days_until_friday + 14);
say $dt->ymd;

事实上,我们对日期的了解更多一些(或者,如果你想这样看的话,我们对模运算的了解更多一些):一个月的第三个星期五总是发生在该月的15日和21日之间,包括15日和21日(第三个星期一、第三个星期三等也是如此。15日是第一个“第三个随便什么”,而22日是第一个“第四个随便什么”。)并且15日将与1日落在一周的同一天。
所以这也是有效的:

my $dt = DateTime->new(year => $year, month => $month, day => 15);
$dt->add(days => (5 - $dt->day_of_week) % 7);
say $dt->ymd;

而且,如果你想要真正的棘手(不推荐),这也是有效的:

my $dt = DateTime->new(year => $year, month => $month, day => 17);
$dt->add(days => 5 - $dt->day_of_week); # No modulo!
say $dt->ymd;

我把它留给感兴趣的读者去弄清楚为什么最后一个有效:)

相关问题