Как получить весь понедельник (дату) для ввода определенного года

#linux #perl

#linux #perl

Вопрос:

с помощью команды Linux или perl ,

Как получить всю дату понедельника для 2010

Например:

20100104 ——— это понедельник января 2010 20100111 20100118 20100125

—-

20101206 20101213 20101220 20101227 ——— это понедельник декабря 2010

Ответ №1:

Вы могли бы использовать 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%dn");
    $dt->add( 'weeks' => 1 );
}
  

Ответ №2:

Я бы, вероятно, сделал это с 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;
}
  

Ответ №3:

Если вы делаете это на 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_yearn";
}
  

Запомни, Тим Тоуди.