gpt4 book ai didi

perl - 如何获得两个日期之间的星期日数组?

转载 作者:行者123 更新时间:2023-12-05 01:02:57 24 4
gpt4 key购买 nike

我从两个日期开始。

my $date1 = 01/01/2016;
my $date2 = 05/15/2016;

我需要将星期日的所有日期放在两个日期之间。

知道我应该从哪里开始吗?

最佳答案

Your solution is good , 但它可能会消耗大量内存,从而创建一个可能永远不会使用的星期日数组。 DateTime 对象既不小也不便宜。

另一种方法是迭代器,一个每次调用都会生成下一个星期日的函数。它根据需要生成每个星期日,而不是事先计算所有这些。这可以节省内存并支持可能无限的星期日。

use strict;
use warnings;
use v5.10;

sub sundays_iterator {
my($start, $end) = @_;

# Since we're going to modify it, copy it.
$start = $start->clone;

# Move to Sunday, if necessary.
$start->add( days => 7 - $start->day_of_week );

# Create an iterator using a closure.
# This will remember the values of $start and $end as
# they were when the function was returned.
return sub {
# Clone the date to return it without modifications.
# We always start on a Sunday.
my $date = $start->clone;

# Move to the next Sunday.
# Do this after cloning because we always start on Sunday.
$start->add( days => 7 );

# Return Sundays until we're past the end date
return $date <= $endDate ? $date : ();
};
}

返回一个闭包,一个匿名子例程,它会记住创建它的词法变量。有点像一个由内而外的对象,一个附加了数据的函数。然后您可以像调用任何子例程引用一样调用它。

my $sundays = sundays_iterator($startDate, $endDate);
while( my $sunday = $sundays->() ) {
say $sunday;
}

好处是它可以节省大量内存,如果您将日期作为用户输入,这一点尤其重要:恶意攻击者可能会要求您提供一个巨大的范围,从而消耗您服务器的大量内存。

它还允许您将生成列表与使用列表分开。现在您有了一种在日期范围内生成星期日的通用方法(或者,稍作调整,一周中的任何一天)。

缺点是它可能比在循环中构建数组慢一点……但可能不会很明显。函数调用在 Perl 中相对较慢,因此每个星期天进行一次函数调用将比循环慢,但调用那些 DateTime 方法(调用其他方法调用其他方法)将淹没该成本。与使用 DateTime 相比,调用迭代器函数是九牛一毛。

关于perl - 如何获得两个日期之间的星期日数组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41129603/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com