1. PHP / Говнокод #25838

    +3

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    <?
    
    function russian_date($input) {
        $date=explode("-", date("Y-m-d",strtotime($input)));
        switch ($date[1]) {
            case 1: $m='ЯНВАРЬ'; break;
            case 3: $m='МАРТ'; break;
            case 4: $m='АПРЕЛЬ'; break;
            case 5: $m='МАЙ'; break;
            case 6: $m='ИЮНЬ'; break;
            case 2: $m='ФЕВРАЛЬ'; break;
            case 7: $m='ИЮЛЬ'; break;
            case 8: $m='АВГУСТ'; break;
            case 9: $m='СЕНТЯБРЬ'; break;
            case 10: $m='ОКТЯБРЬ'; break;
            case 11: $m='НОЯБРЬ'; break;
            case 12: $m='ДЕКАБРЬ'; break;
        }
        echo ($m.' '.$date[0]);
    }
    
    ?>

    Образцовый код из одного мегапроекта от профессионалов.
    Такие монстры рождаются, когда не знаешь о локали.

    Запостил: petja, 14 Сентября 2019

    Комментарии (24) RSS

    • Бывает.
      Ответить
    • Перевел на недолисп функциональный js
      const matched = x => ({
        on: () => matched(x),
        otherwise: () => x,
      })
      const match = x => ({  
        on: (pred, fn) => (pred(x) ? matched(fn(x)) : match(x)),
        otherwise: fn => fn(x),
      })
      const russian_date = input =>  {
        const date = new Date(input).toISOString().split('-')
        const m = match(date[1])
          .on(d => d == 1, () => 'ЯНВАРЬ')
          .on(d => d == 3, () => 'МАРТ')
          .on(d => d == 4, () => 'АПРЕЛЬ')
          .on(d => d == 5, () => 'МАЙ')
          .on(d => d == 6, () => 'ИЮНЬ')
          .on(d => d == 2, () => 'ФЕВРАЛЬ')
          .on(d => d == 7, () => 'ИЮЛЬ')
          .on(d => d == 8, () => 'АВГУСТ')
          .on(d => d == 9, () => 'СЕНТЯБРЬ')
          .on(d => d == 10, () => 'ОКТЯБРЬ')
          .on(d => d == 11, () => 'НОЯБРЬ')
          .on(d => d == 12, () => 'ДЕКАБРЬ')
        console.log(`${m} ${date[0]}`)
      }
      Ответить
      • <?php
        
        class Match {
            private $data = 0;
            public function __toString() {
                return $this->data;
            }
            public function __construct($value) {
                $this->data = $value;
            }
            public function on($condition, $action) {
                return $condition($this->data) ? new Matched($action($this->data)) : $this;
            }
        }
        
        class Matched {
            private $data = 0;
            public function __toString() {
                return $this->data;
            }
            public function __construct($value) {
                $this->data = $value;
            }
            public function on($condition, $action) {
                return $this;
            }
        }
        
        $m = (new Match(2))
        -> on(function($d){return $d == 1;}, function(){return 'Январь';})
        -> on(function($d){return $d == 2;}, function(){return 'Февраль';})
        -> on(function($d){return $d == 3;}, function(){return 'Март';});
        
        echo $m;
        Ответить
        • Какая вербозность )))

          Именно поэтому
          months =. ' ' cut 'ЯНВАРЬ ФЕВРАЛЬ МАРТ АПРЕЛЬ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ НОЯБРЬ ДЕКАБРЬ'
             russian_date =: ({::&months@<:@{~&1 , ' ' , ":@{~&0) @ getdate
          
          
             russian_date '14/09/2019'
          СЕНТЯБРЬ 2019
             russian_date '2019-09-14'
          СЕНТЯБРЬ 2019
             russian_date 'September 14, 2019'
          СЕНТЯБРЬ 2019
          Ответить
          • Заебись
            У этой штуки есть компилятор в js?
            Ответить
            • У этой штуки вообще нет компилятора, только интерпретатор на "Си".
              Ответить
          • Думал, как написать на «PHP» без лишних переменных. Получается длинная питушня. В итоге всё-таки ввёл временную переменную:
            <?php
            define('MONTHS', 'ЯНВАРЬ ФЕВРАЛЬ МАРТ АПРЕЛЬ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ НОЯБРЬ ДЕКАБРЬ');
            function russian_date($x) {
                $tmp = explode(' ', @date('m Y',@strtotime($x)));
                return explode(' ', MONTHS)[$tmp[0]-1] . ' ' . $tmp[1];
            }
            
            echo russian_date('2019-09-03');
            Ответить
            • Вот примерный перевод, за исключением того, что в 'J' date(explode(...)) не нужен, getdate возвращает сразу массив Y m d
              <?php
              define('MONTHS', explode(' ', 'ЯНВАРЬ ФЕВРАЛЬ МАРТ АПРЕЛЬ МАЙ ИЮНЬ ИЮЛЬ АВГУСТ СЕНТЯБРЬ ОКТЯБРЬ НОЯБРЬ ДЕКАБРЬ'));
              function russian_date($x) {
                  return (function($y){return MONTHS[$y[1]-1] . ' ' . $y[0];})(explode(' ', date('Y m d', strtotime($x))));
              }
              ?>
              <?=russian_date('2019-09-03');?>
              Ответить
    • А день почему не выводится?

      Странный порядок, автор когда писал забыл какой месяц второй, а когда дошел до июля вспомнил?
      Ответить

    Добавить комментарий