PHPで年号込みのHTML selectのoptionsを生成する

コロナワクチン大規模接種の予約システムの話題に寄せてw

<?php
setlocale(LC_TIME, 'ja_JP.utf8');
for($i=1901; $i <= date('Y') - 65; $i++){
    $options[] = sprintf("%s年(%s)", $i, substr(strftime('%Ex', mktime(0, 0, 0, 12, 25, $i)), 0, -10));
}
var_dump($options);
?>
array(56) {
  [0]=>
  string(24) "1901年(明治34年)"
  [1]=>
  string(24) "1902年(明治35年)"
  [2]=>
  string(24) "1903年(明治36年)"
  [3]=>
  string(24) "1904年(明治37年)"
  [4]=>
  string(24) "1905年(明治38年)"
  [5]=>
  string(24) "1906年(明治39年)"
  [6]=>
  string(24) "1907年(明治40年)"
  [7]=>
  string(24) "1908年(明治41年)"
  [8]=>
  string(24) "1909年(明治42年)"
  [9]=>
  string(24) "1910年(明治43年)"
  [10]=>
  string(24) "1911年(明治44年)"
  [11]=>
  string(25) "1912年(大正元年)"
  [12]=>
  string(23) "1913年(大正2年)"
  [13]=>
  string(23) "1914年(大正3年)"
  [14]=>
  string(23) "1915年(大正4年)"
  [15]=>
  string(23) "1916年(大正5年)"
  [16]=>
  string(23) "1917年(大正6年)"
  [17]=>
  string(23) "1918年(大正7年)"
  [18]=>
  string(23) "1919年(大正8年)"
  [19]=>
  string(23) "1920年(大正9年)"
  [20]=>
  string(24) "1921年(大正10年)"
  [21]=>
  string(24) "1922年(大正11年)"
  [22]=>
  string(24) "1923年(大正12年)"
  [23]=>
  string(24) "1924年(大正13年)"
  [24]=>
  string(24) "1925年(大正14年)"
  [25]=>
  string(25) "1926年(昭和元年)"
  [26]=>
  string(23) "1927年(昭和2年)"
  [27]=>
  string(23) "1928年(昭和3年)"
  [28]=>
  string(23) "1929年(昭和4年)"
  [29]=>
  string(23) "1930年(昭和5年)"
  [30]=>
  string(23) "1931年(昭和6年)"
  [31]=>
  string(23) "1932年(昭和7年)"
  [32]=>
  string(23) "1933年(昭和8年)"
  [33]=>
  string(23) "1934年(昭和9年)"
  [34]=>
  string(24) "1935年(昭和10年)"
  [35]=>
  string(24) "1936年(昭和11年)"
  [36]=>
  string(24) "1937年(昭和12年)"
  [37]=>
  string(24) "1938年(昭和13年)"
  [38]=>
  string(24) "1939年(昭和14年)"
  [39]=>
  string(24) "1940年(昭和15年)"
  [40]=>
  string(24) "1941年(昭和16年)"
  [41]=>
  string(24) "1942年(昭和17年)"
  [42]=>
  string(24) "1943年(昭和18年)"
  [43]=>
  string(24) "1944年(昭和19年)"
  [44]=>
  string(24) "1945年(昭和20年)"
  [45]=>
  string(24) "1946年(昭和21年)"
  [46]=>
  string(24) "1947年(昭和22年)"
  [47]=>
  string(24) "1948年(昭和23年)"
  [48]=>
  string(24) "1949年(昭和24年)"
  [49]=>
  string(24) "1950年(昭和25年)"
  [50]=>
  string(24) "1951年(昭和26年)"
  [51]=>
  string(24) "1952年(昭和27年)"
  [52]=>
  string(24) "1953年(昭和28年)"
  [53]=>
  string(24) "1954年(昭和29年)"
  [54]=>
  string(24) "1955年(昭和30年)"
  [55]=>
  string(24) "1956年(昭和31年)"
}

Linuxだとsetlocale()が有効。macOSだと無効。mtkime()に12/25を渡しているのは、明治・大正、大正・昭和の改元に対応するため。このままだと平成と令和は不可。元号判定や「元年」表示など、strftime()がやってくれる。

追記:Azure上のUbuntuだとちょっと設定が必要。

$ sudo localedef -f UTF-8 -i ja_JP ja_JP.UTF-8
$ php -r 'setlocale(LC_TIME,"ja_JP.UTF-8"); echo(strftime("%Ec", mktime(0,0,0,1,1,2021)));'
令和03年01月01日 00時00分00秒
タイトルとURLをコピーしました