#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";
}
Запомни, Тим Тоуди.