如何获取特定年份输入的所有星期一(日期)

时间:2011-04-16 07:35:31

标签: linux perl

使用linux命令或perl,

如何获得2010年的所有星期一日期

例如:

20100104 --------这是2010年1月1日 20100111 20100118 20100125

----

---

---

20101206 20101213 20101220 20101227 --------这是2010年1月12日星期一

3 个答案:

答案 0 :(得分:7)

您可以使用DateTime

#!/usr/bin/env perl

use strict;
use warnings;

use DateTime;

my $year = 2010;
my $dt   = DateTime->new(
    'year'  => $year,
    'month' => 1,
    'day'   => 1,
);

# find first Monday
while ( $dt->day_name() ne 'Monday' ) {
    $dt->add( 'days' => 1 );
}

while ( $dt->year() == $year ) {
    print $dt->strftime("%Y%m%d\n");
    $dt->add( 'weeks' => 1 );
}

答案 1 :(得分:1)

我可能会以与Alan的解决方案非常相似的方式使用DateTime。但是有趣的是看看如何使用Perl的内置日期处理工具来实现它。

#!/usr/bin/perl

use strict;
use warnings;

use POSIX 'strftime';
use Time::Local;

my $ONE_DAY = 24 * 60 * 60;
my $ONE_WEEK = 7 * $ONE_DAY;

my $year = shift || 2010;

# Get Jan 1st
my $date = timelocal 0, 0, 0, 1, 0, $year - 1900;

# Get first monday
until (strftime('%a', localtime $date) eq 'Mon') {
  $date += $ONE_DAY;
}

while (strftime('%Y', localtime $date) == $year) {
  print strftime('%Y%m%d', localtime $date), "\n";
  $date += $ONE_WEEK;
}

答案 2 :(得分:0)

如果您在Perl中执行此操作,请再次查看Date::Calc。我是Date :: Calc的忠实粉丝,因为它的大型函数库使得这些类型的计算相对微不足道。对于这个问题中的问题,你可以用:

use Date::Calc qw(Weeks_in_Year Monday_of_Week);

$wks_in_2010 = Weeks_in_Year(2010);
for ($i = 1; $i <= $wks_in_2010; $i++) {
  ($mon_year, $mon_month, $mon_day) = Monday_of_Week($i, 2010);
  print "$mon_month/$mon_day/$mon_year\n";
}

请记住,Tim Toady