Tech Racho エンジニアの「?」を「!」に。
  • 開発

まもなく令和!各言語で「令和」変換してみよう

BPSの福岡拠点として一緒にお仕事させて頂いてます、株式会社ウイングドアのアリタです。

もうまもなく令和ですね!
システムの新元号対応は進んでいますか。
もう直前ではありますが、各言語での令和変換を試してみたいと思います。

今回、令和変換してみる言語は下記の通りです。

  1. Ruby on Rails
  2. PHP
  3. Python
  4. JavaScript
  5. Swift

「令和」変換してみよう

1. Ruby on Rails

Ruby on Rails には、和暦を扱うGemとして wareki が存在します。
今回は、warekiのGemで変換を行なってみます。

既にwarekiのGemがインストールされている状態で「rails c」を実行します。

1. 実行

  • wareki (0.4.0)
irb(main):001:0> Date.parse("2019-05-01").strftime("%Je%Jg年")
=> "令和1年"

無事、令和1年が表示されました!

ちなみに、wareki (0.3.0)で確認すると平成31年のままでした。

  • wareki (0.3.0)
irb(main):001:0> Date.parse("2019-05-01").strftime("%Je%Jg年")
=> "平成31年"

wareki (0.4.0)から令和に対応されたようですね。

また、Ruby 2.6.3も「令和」対応されているようです。
参考:【速報】Ruby 2.6.3リリース: 「令和」対応のみ

2. PHP

PHPで和暦・日本語曜日を使うという記事で紹介されている
DatetimeUtilityが汎用性が高そうでしたので、今回こちらを利用させていただきます。

1. DatetimeUtilityに「令和」を追加

/**
 * 日時用汎用クラス
 */
class DatetimeUtility {
    /** 元号用設定
     * 日付はウィキペディアを参照しました
     * http://ja.wikipedia.org/wiki/%E5%85%83%E5%8F%B7%E4%B8%80%E8%A6%A7_%28%E6%97%A5%E6%9C%AC%29
     */
    private static $gengoList = [
        ['name' => '令和', 'name_short' => 'R', 'timestamp' =>  1556636400],  // 2019-05-01,
        ['name' => '平成', 'name_short' => 'H', 'timestamp' =>  600188400],  // 1989-01-08,
        ['name' => '昭和', 'name_short' => 'S', 'timestamp' => -1357635600], // 1926-12-25'
        ['name' => '大正', 'name_short' => 'T', 'timestamp' => -1812186000], // 1912-07-30
        ['name' => '明治', 'name_short' => 'M', 'timestamp' => -3216790800], // 1868-01-25
    ];
(以下略)

2. 実行

日付操作のためのCarbon、DateTimeクラスの2パターンで実行のためのソースコードを書いてみます。

  • Carbonの場合のソースコード
require 'vendor/autoload.php';
use Carbon\Carbon;

$carbon = Carbon::parse('2019-04-30');
$format = 'Jk年';
echo DatetimeUtility::date($format, $carbon->timestamp)."\n";
$format = 'JK年';
echo DatetimeUtility::date($format, $carbon->timestamp)."\n";

$carbon = Carbon::parse('2019-05-01');
$format = 'Jk年';
echo DatetimeUtility::date($format, $carbon->timestamp)."\n";
$format = 'JK年';
echo DatetimeUtility::date($format, $carbon->timestamp)."\n";
  • 実行結果
平成31年
平成31年
令和1年
令和元年
  • DateTimeの場合のソースコード
$datetime = new DateTime('2019-04-30');
$format = 'Jk年';
echo DatetimeUtility::date($format, $datetime->format('U'))."\n";
$format = 'JK年';
echo DatetimeUtility::date($format, $datetime->format('U'))."\n";

$datetime = new DateTime('2019-05-01');
$format = 'Jk年';
echo DatetimeUtility::date($format, $datetime->format('U'))."\n";
$format = 'JK年';
echo DatetimeUtility::date($format, $datetime->format('U'))."\n";
  • 実行結果
平成31年
平成31年
令和1年
令和元年

いずれも無事「令和」に変換することができました!

またCarbonの場合、下記の書き方でも和暦変換出来るようなのですが、こちらはCライブラリに依存するようです。

$format = '%EC%Ey年';
echo $carbon->formatLocalized($format)."\n";

3. Python

PHPと同じパターンですが・・pythonで和暦で紹介されている
JpEraを拡張させて令和変換してみたいと思います。

1. jp_era.pyに「令和」を追加

class JpEra:
    def __init__(self, shorthand, era_name, begin_date, end_date=datetime.date.max):
        self.shorthand = shorthand
        self.era_name = era_name
        self.begin_date = begin_date
        self.end_date = end_date

    def in_term(self, target_date):
        return self.begin_date <= target_date <= self.end_date

    def jp_year(self, year):
        return year - (self.begin_date.year - 1)


JP_ERA = (
    JpEra("M", "明治", datetime.date(1868,  9,  8), datetime.date(1912,  7, 29)),
    JpEra("T", "大正", datetime.date(1912,  7, 30), datetime.date(1926, 12, 24)),
    JpEra("S", "昭和", datetime.date(1926, 12, 25), datetime.date(1989,  1, 7)),
    JpEra("H", "平成", datetime.date(1989,  1,  8), datetime.date(2019,  4,  30)),
    JpEra("R", "令和", datetime.date(2019,  5,  1)),
)
(以下略)

2. 実行

  • ソースコード: jp_era_test.py
# coding:utf-8
import datetime
from jp_era import *

heisei_date = datetime.date(2019, 4, 30)
reiwa_date = datetime.date(2019, 5, 1)
heisei_jp = jp_era(heisei_date)
reiwa_jp = jp_era(reiwa_date)

heisei = '%s%d年' % (heisei_jp[1], heisei_jp[2])
reiwa = '%s%d年' % (reiwa_jp[1], reiwa_jp[2])

print(heisei_date)
print(heisei)
print(reiwa_date)
print(reiwa)
  • 実行結果
$ python jp_era_test.py

2019-04-30
平成31年
2019-05-01
令和1年

無事、令和変換できました!

4. JavaScript

toLocaleDateStringを利用すれば和暦変換可能です。

var date = new Date('2019/5/1').toLocaleDateString("ja-JP-u-ca-japanese",{era:'long',year:'numeric'});
console.log(date);
  • 実行結果
平成31年

・・残念。平成31年になってしまいました。

その他の手段として、JavaScriptで日付をフォーマットする(和暦対応)にある
「UltraDate.js」を利用すると良さそうです。

  • ソースコード
console.log(dateFormatJp(new Date('2018/12/31'), 'gggee年'));
console.log(dateFormatJp(new Date('2019/1/1'), 'gggee年'));
console.log(dateFormatJp(new Date('2019/4/30'), 'gggee年'));
console.log(dateFormatJp(new Date('2019/5/1'), 'gggee年'));
  • 実行結果
平成30年
令和01年
令和01年
令和01年

・・・!?
どうも2019/1/1〜2019/4/30も「令和01年」として扱われているようです。悩ましいですね。

5. Swift

DateFormatterのdateFormatで和暦変換が出来るので、こちらを試してみます。

  • ソースコード(Xcode 10.1 / swift4.2)
let components = DateComponents(calendar: Calendar.current, year:2019, month: 5, day: 1)
let date = components.date!

let dateFormatter = DateFormatter()
// Locale.currentの場合、24時間表示オフだとdateがnilになる
dateFormatter.locale = Locale(identifier: "ja_JP")
dateFormatter.calendar = Calendar(identifier: .japanese)
dateFormatter.dateFormat = "Gy年"
let formatedDate = dateFormatter.string(from: date)
print(formatedDate)
  • 実行結果
平成31年

・・残念。平成31年になってしまいました。

[Swift] [iOS] [令和] 和暦西暦変換は端末日付に依存するによると
iOS 12.3 beta2でCalendarコンポーネントの挙動が変わっているようですね。
Xcodeのバージョンが古いので早々にアップデートして試してみます・・。

おまけ:各方面の元号対応

新元号の表示について
・画面上の表示について
  2019年5月1日以降の日付を入力いただいた場合、「令和1年5月1日」といった
  和暦表示になるのは4月20日となります。

・社会保険・雇用保険の書類(紙)への表示について
  年金機構、ハローワークなどにより、新元号が印字された新しい書類フォーマットが
  公開されてから3ヶ月以内に新元号に対応いたします。移行期間中は次の対応とさせていただきます。
smarthr.jpより

今回紹介出来ませんでしたが、Androidでは Android 7.0(API レベル 24)から「ICU4J Android Framework API」を利用することで令和変換出来るようです。ICU - International Components for Unicode自体はC++などでも利用されているようですね。
(参考:【最終版】新元号に対応するために ICU を用いて和暦の動作確認をする)

まとめ

今回、幾つかの言語では無事に「令和」変換できました。
(無事変換出来なかったものについては後日の宿題ということで・・)

まもなく「令和」を迎えるので、急に元号対応がきた場合などの参考になれば幸いです。
それでは、良いゴールデンウイーク(もとい令和ライフ)をお過ごしください!


株式会社ウイングドアでは、Ruby on RailsやPHPを活用したwebサービス、webサイト制作を中心に、
スマホアプリや業務系システムなど様々なシステム開発を承っています。

関連記事

RubyMineからGitが使えて便利

Flutterアニメーション、時々PWA+TWAなど


CONTACT

TechRachoでは、パートナーシップをご検討いただける方からの
ご連絡をお待ちしております。ぜひお気軽にご意見・ご相談ください。