Как получить весь понедельник (дата) для конкретного года ввода - PullRequest
0 голосов
/ 16 апреля 2011

с командой linux или perl,

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

Например:

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

----

---

---

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

Ответы [ 3 ]

7 голосов
/ 16 апреля 2011

Вы можете использовать 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 голос
/ 17 апреля 2011

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

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

Помните, Тим Тоади .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...