PHPを使って今日または次のプレミアムフレイデーを4行で取得する

[プレミアムフライデーに備えよう！Railsで次の月末の金曜日を取得する！ - Qiita](http://qiita.com/yukihariguchi/items/1f72191c9d317668add3)

PHPの日付処理使ってプレミアムフライデーからのセイクで優勝せえへん？

```php
<?php

function current_or_next_premium_friday(): \DateTimeInterface
{
    $today = new \DateTimeImmutable('today', new \DateTimeZone('Asia/Tokyo'));
    $a = $today->modify('last Friday of');
    $b = $today->modify('last Friday of next month');
    return $a < $today ? $b : $a;
}

var_dump(current_or_next_premium_friday());

/*

object(DateTimeImmutable)#3 (3) {
  ["date"]=>
  string(26) "2017-03-31 00:00:00.000000"
  ["timezone_type"]=>
  int(3)
  ["timezone"]=>
  string(10) "Asia/Tokyo"
}

*/
```

プレミアムフライデーカレンダー

```php
<?php

function premium_fridays(\DateTimeInterface $start, $end_or_ocurrences): \DatePeriod
{
    $immutablize = function (\DateTimeInterface $d) {
        return $d instanceof \DateTime
                ? \DateTimeImmutable::createFromMutable($d)
                : $d;
    };

    $s = $immutablize($start);
    $i = \DateInterval::createFromDateString('last Friday of next month');
    $e = $end_or_ocurrences instanceof \DateTimeInterface
        ? $immutablize($end_or_ocurrences)->modify('tomorrow')
        : $end_or_ocurrences - 1;

    $a = $s->modify('last Friday of');
    $b = $s->modify('last Friday of next month');
    return new \DatePeriod($a < $s ? $b : $a, $i, $e);
}

var_dump(iterator_to_array(premium_fridays(
    new \DateTimeImmutable('2017-02-01', new \DateTimeZone('Asia/Tokyo')),
    new \DateTimeImmutable('2018-01-31', new \DateTimeZone('Asia/Tokyo'))
)));
var_dump(iterator_to_array(premium_fridays(
    new \DateTimeImmutable('2017-02-01', new \DateTimeZone('Asia/Tokyo')),
    12
)));

/*

array(12) {
  [0]=>
  object(DateTimeImmutable)#12 (3) {
    ["date"]=>
    string(26) "2017-02-24 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [1]=>
  object(DateTimeImmutable)#13 (3) {
    ["date"]=>
    string(26) "2017-03-31 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [2]=>
  object(DateTimeImmutable)#14 (3) {
    ["date"]=>
    string(26) "2017-04-28 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [3]=>
  object(DateTimeImmutable)#9 (3) {
    ["date"]=>
    string(26) "2017-05-26 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [4]=>
  object(DateTimeImmutable)#8 (3) {
    ["date"]=>
    string(26) "2017-06-30 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [5]=>
  object(DateTimeImmutable)#2 (3) {
    ["date"]=>
    string(26) "2017-07-28 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [6]=>
  object(DateTimeImmutable)#1 (3) {
    ["date"]=>
    string(26) "2017-08-25 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [7]=>
  object(DateTimeImmutable)#3 (3) {
    ["date"]=>
    string(26) "2017-09-29 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [8]=>
  object(DateTimeImmutable)#4 (3) {
    ["date"]=>
    string(26) "2017-10-27 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [9]=>
  object(DateTimeImmutable)#5 (3) {
    ["date"]=>
    string(26) "2017-11-24 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [10]=>
  object(DateTimeImmutable)#7 (3) {
    ["date"]=>
    string(26) "2017-12-29 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
  [11]=>
  object(DateTimeImmutable)#6 (3) {
    ["date"]=>
    string(26) "2018-01-26 00:00:00.000000"
    ["timezone_type"]=>
    int(3)
    ["timezone"]=>
    string(10) "Asia/Tokyo"
  }
}

*/
```