1

過去数か月間、次のコードを使用してきました。このコードは、定義済みの日付から今日の日付になるまでの数か月間ループします。

use Date::Pcalc qw(:all);

$startDay = 1;
$startMonth = '4';
$startYear = '2009';

$dateToday = `date +%Y-%m-%d`;
($yt,$mt,$dt) = split(/\-/,$dateToday);

while ($endMonth <= $mt || $startYear < $yt ) {

if ($startMonth eq '12') {
    $endMonth = 1;
    $endYear = $startYear + 1;
  } else {
    $endMonth = $startMonth + 1;
    $endYear = $startYear;
  }

  if ($startMonth eq '12') {
    $endYear = $startYear + 1;
  }

  ($meYear,$meMonth,$meDay) = Add_Delta_Days($endYear,$endMonth,$startDay,-1);
  $endOfMonth = "$meYear-$meMonth-$meDay";
  $monthText = Month_to_Text($startMonth);

  $startDate = "$startYear-$startMonth-1";
  $endDate = "$endYear-$endMonth-1";

print "$startDate - $endDate\n";

if ($startMonth eq '12') {
    $startMonth = 1;
    $startYear++;
  } else {
    $startMonth++
  }

}

これはここ数か月うまく機能していますが、12 月になり、$endmonth が $mt (12) を超えることはないため、無限ループが発生することに気付きました。

これを行う別の方法を見つけることができませんでした。これは比較的簡単に修正できるはずですが、深刻な「開発者のブロック」があるようです

ご協力いただける方には、あらかじめ感謝いたします。

4

2 に答える 2

6
my $date = DateTime->new(
   time_zone => 'local',
   year      => $startYear,
   month     => $startMonth,
   day       => 1,
);

my $today = DateTime->today(time_zone => 'local');

while ($date <= $today) {
   say $date->ymd('-');
   $date->add( months => 1 );
}
于 2012-12-13T01:03:57.273 に答える
2

コードにいくつか問題があると思います。しかし、このステートメントでループを引き起こす 12 月の終了日である最初の問題に取り掛かりましょう。

    while ($endMonth <= $mt || $startYear < $yt ) {

現在の日付、年、月、日を取得したら、次のようなことを行う必要があります。他の人が現在の日付を取得する別の方法を提案していることに気付くでしょう。この提案を採用する必要があります。ただし、日付を取得したら、以下のコードを採用する必要があります。

    ($yt,$mt,$dt) = split(/\-/,$dateToday);
    # the line below will create a date like 201212 (yyyy mm) but if the month is a 1 digit month it will place a 0 in front of it to ensure your yymm variable always holds 6 characters in the format of yyyy mm - ok
    my $yymm = $yt . ${\(length($mt) == 1 ? '0' : '')} . $mt;
    # Now lets check the end date against the yymm
    # initialise end date as end_yymm - again it inserts a 0 for single digit month
    my $end_yymm = $startyear . ${\(length($startMonth) == 1 ? '0' : '')} . $startMonth;
    # the above should get the date as '200904' from your code provide
    # the while will check end_yymm like 200904 < 201212 - yes it is...
    ## the end_yymm will keep getting incremented each month and so will the year component at the end of each year until it reaches 201212
    ## then the question 201212 < 201212 will cause the while to end
    ## If you want it go into 201301 then say while ($end_yymm <= $yymm) {
    ## Hope you get the picture
    while ($end_yymm < $yymm) {

    if ($startMonth eq '12') {
        $endMonth = 1;
        $endYear = $startYear + 1;
    } else {
      $endMonth = $startMonth + 1;
      $endYear = $startYear;
    }

    ## Now this one seems to be repeating the endYear calculation as above - to me it seems redundant - maybe get rid of it
    if ($startMonth eq '12') {
       $endYear = $startYear + 1;
    }        

    ## Now that you have the end year and month incremented setup the end_yymm variable again to be picked up in the while statement:
    $end_yymm = $startyear . ${\(length($startMonth) == 1 ? '0' : '')} . $startMonth;

     # ...... carry on with the rest of your code

    } # end the while loop

そして、それはそれを行う必要があります。

ではごきげんよう

于 2012-12-18T12:15:01.993 に答える