PowerCMS™
2025年1月1日購入分よりライセンスの価格を改定いたします。
[ブログ] PowerCMS 6 でのアップデートまとめ を追加しました。
[よくあるご質問] システムログに「タスクを実行するために必要なロックを獲得できませんでした」というログが残っている を追加しました。
[よくあるご質問] 特定のシステムログに絞って確認できますか? を追加しました。

PowerCMS ブログ

ホーム > PowerCMS ブログ > テンプレート作成Tips > 日付のテンプレートタグから元号を取得する

2019年12月26日

日付のテンプレートタグから元号を取得する

令和元年も8か月経ち残り数日です。令和ネタも気温も冷え込んだこの期に及んで、テンプレートで日時の情報から元号を得ることについて書きます。

まず、基本に忠実に、このような課題を解決するには、テンプレートでごちゃごちゃせずに、プラグインを書けということになります。 スタティックパブリッシングのみ対応ですが、日付に関するテンプレートタグの format モディファイアで、和暦表示を可能にする「JPEraFormats プラグイン」があります。

テンプレート

テンプレートならこのような解が考えられます。

<$MTSetVar name="undef(_japanese_eras)"$>
<$MTVar name="_japanese_eras" key="明治" value="18681023"$>
<$MTVar name="_japanese_eras" key="大正" value="19120731"$>
<$MTVar name="_japanese_eras" key="昭和" value="19261226"$>
<$MTVar name="_japanese_eras" key="平成" value="19890108"$>
<$MTVar name="_japanese_eras" key="令和" value="20190501"$>
<MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}"
  ><$MTVar name="_result" value=""
  $><MTIf name="_with_year"
    ><$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy"
  $></MTIf
  ><MTLoop name="_japanese_eras" sort_by="value numeric reverse"
    ><MTUnless name="_result"
      ><MTIf name="_yyyymmdd" ge="$__value__"
        ><MTSetVarBlock name="_result"
          ><$MTVar name="__key__"
          $><MTIf name="_with_year"
            ><$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val"
            $><$MTSetVar name="_yyyy" op="-" value="$_val"
            $><MTIf name="_yyyy"
              ><$MTSetVar name="_yyyy" op="++"
            $><MTElse
              ><$MTVar name="_yyyy" value="元"
            $></MTIf
          ><$MTVar name="_yyyy"$>年</MTIf
        ></MTSetVarBlock
      ></MTIf
    ></MTUnless
  ></MTLoop
  ><$MTVar name="_result"
$></MTSetVarTemplate>

出力結果から空白文字をなくすため、行頭が「>」で始まる変則的なテンプレートにしています。社内から「わかりにくい、誤解を招く」といった意見がありましたので、別版も後述します。

使い方

  1. まずは元号を得たい箇所でこのテンプレートを書くか、このテンプレートをテンプレートモジュール化して MTInclude タグで読み込むなどしておきます。
  2. 次に「<$MTDate format="%Y%m%d"$>」や「<$MTEntryDate format="%Y%m%d"$>」で、「20191226」のような8桁の日付情報を得ます。
  3. そして、
    • 8桁の日付をテンプレート変数「_yyyymmdd」に代入し、テンプレート変数「_tmpl」のキー「yyyymmdd_to_japanese_era」(_tmpl{yyyymmdd_to_japanese_era}) でテンプレート片を呼び出します。
    • あるいは呼び出すときに、「<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="20181226"$>」や「<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _yyyymmdd="$foo"$>」のようにして日付を渡します。
  4. モディファイア「_with_year」で、「平成31年」や「令和元年」のように年も取得できます。

記述例です。

<$MTDate format="%Y%m%d" setvar="_yyyymmdd"$>
<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$>
<$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$>

出力結果です。

令和
令和元年

テスト

<$MTSetVar name="undef(test_dates)"$>
<$MTVar name="push(test_dates)" value="18681022"$>
<$MTVar name="push(test_dates)" value="18681023"$>
<$MTVar name="push(test_dates)" value="19120730"$>
<$MTVar name="push(test_dates)" value="19120731"$>
<$MTVar name="push(test_dates)" value="19261225"$>
<$MTVar name="push(test_dates)" value="19261226"$>
<$MTVar name="push(test_dates)" value="19700101"$>
<$MTVar name="push(test_dates)" value="19890107"$>
<$MTVar name="push(test_dates)" value="19890108"$>
<$MTVar name="push(test_dates)" value="20190430"$>
<$MTVar name="push(test_dates)" value="20190501"$>
<$MTVar name="push(test_dates)" value="20200101"$>
<$MTVar name="push(test_dates)" value="21171231"$>
<MTLoop name="test_dates"><MTIf __first__><ol></MTIf>
  <$MTVar name="__value__" cat="090000" setvar="ts"$>
  <$MTDate ts="$ts" format="%Y%m%d" setvar="_yyyymmdd"$>
<li><$MTDate ts="$ts" format_name="iso8601"$><ul>
<li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}" _with_year="1"$><$MTDate ts="$ts" format="%b月%e" strip=""$>日
<li><$MTVar name="_tmpl{yyyymmdd_to_japanese_era}"$>時代です。
</ul>
<MTIf __last__></ol></MTIf></MTLoop>

テスト結果です。

  1. 1868-10-22T09:00:00+09:00
    • 10月22日
    • 時代です。
  2. 1868-10-23T09:00:00+09:00
    • 明治元年10月23日
    • 明治時代です。
  3. 1912-07-30T09:00:00+09:00
    • 明治45年7月30日
    • 明治時代です。
  4. 1912-07-31T09:00:00+09:00
    • 大正元年7月31日
    • 大正時代です。
  5. 1926-12-25T09:00:00+09:00
    • 大正15年12月25日
    • 大正時代です。
  6. 1926-12-26T09:00:00+09:00
    • 昭和元年12月26日
    • 昭和時代です。
  7. 1970-01-01T09:00:00+09:00
    • 昭和45年1月1日
    • 昭和時代です。
  8. 1989-01-07T09:00:00+09:00
    • 昭和64年1月7日
    • 昭和時代です。
  9. 1989-01-08T09:00:00+09:00
    • 平成元年1月8日
    • 平成時代です。
  10. 2019-04-30T09:00:00+09:00
    • 平成31年4月30日
    • 平成時代です。
  11. 2019-05-01T09:00:00+09:00
    • 令和元年5月1日
    • 令和時代です。
  12. 2020-01-01T09:00:00+09:00
    • 令和2年1月1日
    • 令和時代です。
  13. 2117-12-31T09:00:00+09:00
    • 令和99年12月31日
    • 令和時代です。

テンプレートの異版

<$MTSetVar name="undef(_japanese_eras)"$>
<$MTVar name="_japanese_eras" key="明治" value="18681023"$>
<$MTVar name="_japanese_eras" key="大正" value="19120731"$>
<$MTVar name="_japanese_eras" key="昭和" value="19261226"$>
<$MTVar name="_japanese_eras" key="平成" value="19890108"$>
<$MTVar name="_japanese_eras" key="令和" value="20190501"$>
<MTSetVarTemplate name="_tmpl{yyyymmdd_to_japanese_era}"><MTFor strip="">
  <$MTVar name="_result" value=""$>
  <MTIf name="_with_year">
    <$MTVar name="_yyyymmdd" regex_replace="/^(\d{4}).*/","$1" setvar="_yyyy"$>
  </MTIf>
  <MTLoop name="_japanese_eras" sort_by="value numeric reverse">
    <MTUnless name="_result">
      <MTIf name="_yyyymmdd" ge="$__value__">
        <$MTVar name="__key__" setvar="_result"$>
        <MTIf name="_with_year">
          <$MTVar name="__value__" regex_replace="/^(\d{4}).*/","$1" setvar="_val"$>
          <$MTSetVar name="_yyyy" op="-" value="$_val"$>
          <MTIf name="_yyyy">
            <$MTSetVar name="_yyyy" op="++"$>
          <MTElse>
            <$MTVar name="_yyyy" value="元"$>
          </MTIf>
          <MTSetVarBlock name="_result" append="1"><$MTVar name="_yyyy"$>年</MTSetVarBlock>
        </MTIf>
      </MTIf>
    </MTUnless>
  </MTLoop>
  <$MTVar name="_result"$>
</MTFor></MTSetVarTemplate>

さあ帰ろう。


カテゴリー
PowerCMS 4
PowerCMS 5
テンプレート作成Tips

Recent Entries