【Python学習用(コピペ可)】西暦→和暦変換アプリ

※本サイトにはプロモーション・広告が含まれています。

(最終更新月:2021年11月)

当ブログは、PythonをベースとしたDjangoフレームワークを使い、Webアプリを一から開発・公開するまでを解説していくサイトです

ただ、当記事ではフレームワークのベースとなる言語「Python」を使った簡易的なアプリをご紹介し、「Pythonでこんなこともできる!」を伝えられたらと思っています

当記事では、

  • 西暦、和暦間で年月日を変換するアプリ

をご紹介します

仕事柄、和暦、西暦とよく行ったり来たりするので簡単に変換できるものがあればなぁと思っていましたので、自分で作ってみました!

次章でPythonのコードをご紹介しますが、どんなものかをイメージ頂くためにWebアプリも作りましたので、「こんなものができる!」とイメージ頂ければ幸いです

Fun Tools
ReactとDjangoで作成したWebアプリです。便利なツールを揃えているので、ぜひ立ち寄ってみてください。作り方はブログで紹介しています!

icon
icon

筆者プロフィール

筆者プロフィールアイコン

【現職】プロダクトマネージャー

【副業】ブログ(月間17万PV)/YouTube/Web・アプリ制作

「プログラミング × ライティング × 営業」の経験を活かし、30後半からのIT系職へシフト。当サイトでは、実際に手を動かせるWebアプリの開発を通じて、プログラミングはもちろん、IT職に必要な情報を提供していきます。

【当ブログで紹介しているサイト】

当サイトチュートリアルで作成したデモ版日報アプリ

Django × Reactで開発したツール系Webアプリ

✔人に見せても恥ずかしくないコードを書こう

「リーダブルコード」は、わかりやすく良いコードの定義を教えてくれる本です。

  • 見るからにきれいなコードの書き方
  • コードの分割方法
  • 変数や関数の命名規則

エンジニアのスタンダートとすべき基準を一から解説しています。

何回も読むのに値する本なので、ぜひ手にとって読んでみてください。

コード

Pythonファイルでのコードになります

任意の名前をつけ、拡張子を「.py」としコピペしてまずは使ってみましょう!

from datetime import date

def year_converter_to_wareki(date_obj):
    start_of_taisyo = date(1912, 7, 30) 
    start_of_syowa = date(1926, 12, 25) 
    start_of_heisei = date(1989, 1, 8) 
    start_of_reiwa = date(2019,5,1)
    year, month, day = None, None, None
    
    #-で分けてリスト化
    obj_list = date_obj.split("-")
    #2桁や1桁のときは19**にする
    if len(obj_list[0]) == 1:
        obj_list[0] = "190" + obj_list[0]
    elif len(obj_list[0]) == 2:
        obj_list[0] = "19" + obj_list[0]

    #年のみの入力は1月1日となる
    if len(obj_list) == 1:
        year = int(obj_list[0])
        input_obj = date(year, 1, 1)
    #年月の場合は1日となる
    elif len(obj_list) == 2:
        year, month = tuple(obj_list)
        year, month = int(year), int(month)
        input_obj = date(year, month, 1)
    elif len(obj_list) == 3:
        year, month, day = tuple(obj_list)
        year, month, day = int(year), int(month), int(day)
        input_obj = date(year, month, day)
    #リストに4つ以上の要素はエラー
    else:
        return None


    #出てきた年を格納する
    result_year = ""

    #年を格納
    if input_obj >=start_of_reiwa:
        nen = input_obj.year - start_of_reiwa.year + 1
        if nen == 1:
            nen = "元"
        result_year =  f"令和{nen}年"
    elif input_obj >= start_of_heisei:
        nen = input_obj.year - start_of_heisei.year + 1
        if nen == 1:
            nen = "元"
        result_year =  f"平成{nen}年"
    elif input_obj >= start_of_syowa:
        nen = input_obj.year - start_of_syowa.year + 1
        if nen == 1:
            nen = "元"
        result_year =  f"昭和{nen}年"
    elif input_obj >= start_of_taisyo:
        nen = input_obj.year - start_of_taisyo.year + 1
        if nen == 1:
            nen = "元"
        result_year =  f"大正{nen}年"
    #大正よりも前の場合
    else:
        return "昔過ぎて計算できません(大正以前)"

    #output(年月日を合算)
    result = ""

    #年のみの入力の場合は年のみで返す
    if not month:
        result = result_year
    else:
        #年月の場合
        if not day:
            result = f"{result_year}{month}月"
        #年月日の場合
        else:
            result = f"{result_year}{month}月{day}日"
    return result

#和暦から西暦へ
def year_converter_to_seireki(date_obj):
    taisyo = (1912, 7, 30)
    syowa = (1926, 12, 25)
    heisei = (1989, 1, 8)
    reiwa = (2019, 5, 1)

    year, month, day = None, None, None

#s68, h35, t50などをチェックする
    def error_checker(year_str):
        nengo, year_int = year_str[0], int(year_str[1:])

    def return_year(year_str):
        nengo, year_int = year_str[0], int(year_str[1:])
        if nengo == "r":
            return 2019 + year_int - 1
        elif nengo == "h":
            return 1989 + year_int - 1
        elif nengo == "s":
            return 1926 + year_int -1
        else:
            return 1912 + year_int -1
        

    obj_list = date_obj.split("-")
    if len(obj_list[0]) >= 4:
        return None
    if len(obj_list) > 1:
        if int(obj_list[1]) > 12:
            return None
    if len(obj_list) > 2:
        if int(obj_list[2]) > 31:
            return None
    #年のみの入力
    if len(obj_list) == 1:
        year = obj_list[0]

    #年月の場合
    elif len(obj_list) == 2:
        year, month = tuple(obj_list)

    #年月日
    elif len(obj_list) == 3:
        year, month, day = tuple(obj_list)
    else:
        return None

    result_year = f"{return_year(year)}年"

        #年のみの入力の場合は年のみで返す
    if not month:
        result = result_year
    else:
        #年月の場合
        if not day:
            result = f"{result_year}{month}月"
        #年月日の場合
        else:
            result = f"{result_year}{month}月{day}日"
    return result

if __name__ == "__main__":
    data = input("西暦・和暦のどちらかをご入力ください→ ")
    try:
        i = int(data[0])
        result = year_converter_to_wareki(data)
    #そうでないとき
    except:
        #t, s, h, rから始まるとき
        if data[0] in ["t", "s", "h", "r"]:
            result = year_converter_to_seireki(data)
        #そうでないとき
        else:
            print("正しい値を入力してください")
    #resultに値が返っているとき
    if result:
        print(result)
    else:
        print("正しい値を入力してください")

使い方

Pythonファイルとして実行しますと、ターミナル上に

西暦・和暦のどちらかをご入力ください→ 

と出てきます

値を入力する場合のルールは下記のとおりになります

  • 西暦の場合、4桁、2桁、1桁で数値を入力します
  • 和暦の場合、令和は「r」、平成は「h」、昭和は「s」、大正は「t」から始まり、続いて数値を入力します
  • 年、月、日の入力は、ハイフン(「-」)で区切ります
  • 年のみ、年-月、年-月-日での入力が可能です

意図しない値を入力した際は、「正しい値を入力してください」と表示されプログラムは終了します

まとめ

今後必要に応じて解説も載せていくときがあるかもしれませんが、今のところはコードの紹介までとさせていただきます

大まかなコードの構成は、

  1. 西暦の入力を処理する関数
  2. 和暦の入力を処理する関数
  3. ユーザーの入力を促す機能

となります

Fun Tools
ReactとDjangoで作成したWebアプリです。便利なツールを揃えているので、ぜひ立ち寄ってみてください。作り方はブログで紹介しています!

で、公開しているWebアプリも機能についてのコードはほぼこちらと同じになりますので、使いながらイメージしていただければ幸いです

「Webアプリを作ってみたい!」という方へ向けて、開発から公開までをシリーズで解説していますので、ぜひご覧ください

「当記事で紹介しているコードがある程度わかる!」という方であれば問題なく、Webアプリ公開まで進めることと思います!

タイトルとURLをコピーしました