(最終更新月:2021年11月)
当ブログは、PythonをベースとしたDjangoフレームワークを使い、Webアプリを一から開発・公開するまでを解説していくサイトです
ただ、当記事ではフレームワークのベースとなる言語「Python」を使った簡易的なアプリをご紹介し、「Pythonでこんなこともできる!」を伝えられたらと思っています
当記事では、
- 西暦、和暦間で年月日を変換するアプリ
をご紹介します
仕事柄、和暦、西暦とよく行ったり来たりするので簡単に変換できるものがあればなぁと思っていましたので、自分で作ってみました!
次章でPythonのコードをご紹介しますが、どんなものかをイメージ頂くために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」から始まり、続いて数値を入力します
- 年、月、日の入力は、ハイフン(「-」)で区切ります
- 年のみ、年-月、年-月-日での入力が可能です
意図しない値を入力した際は、「正しい値を入力してください」と表示されプログラムは終了します
まとめ
今後必要に応じて解説も載せていくときがあるかもしれませんが、今のところはコードの紹介までとさせていただきます
大まかなコードの構成は、
- 西暦の入力を処理する関数
- 和暦の入力を処理する関数
- ユーザーの入力を促す機能
となります
で、公開しているWebアプリも機能についてのコードはほぼこちらと同じになりますので、使いながらイメージしていただければ幸いです
「Webアプリを作ってみたい!」という方へ向けて、開発から公開までをシリーズで解説していますので、ぜひご覧ください
「当記事で紹介しているコードがある程度わかる!」という方であれば問題なく、Webアプリ公開まで進めることと思います!