見出し画像

日本の元号対応datetimeライブラリ「jpdatetime」をリリースしました

開発の経緯

日々の生活において和暦に触れることはないのですが、一たび政府発行の公文書に触れ始めると多く目にすることとなります。しかし、Pythonの標準ライブラリであるdatetimeクラスは西暦にしか対応しておらず、元号を扱うには独自の処理の実装が必要であり、都度都度ロジックを実装するのが手間だったため、元号に対応した日時データを簡単に扱えるようにすることを目指して、jpdatetimeというライブラリを開発することにしました。

Pypiで検索してみると、いくつかのライブラリが公開されていますが、ソースコードが公開されていなかったり、元号以外の機能も多く持っているものだったり、Python標準のdatetimeの継承ができていなかったり、どれも帯に短したすきに長しだったので、元号処理のみを目的としつつ柔軟性の高い設計を目指しました。

実装した機能

jpdatetimeライブラリでは、日本の元号に対応するためにいくつかの重要な機能を実装しています。

  • 元号のパースとフォーマット:strptimeメソッドを使って日本の元号形式の日付文字列をパースし、datetimeオブジェクトに変換することができます。さらに、strftimeメソッドを使って、日本の元号を含む日付形式でフォーマットすることも可能です。

  • 元年のサポート:各元号の最初の年(元年)を「1年」ではなく「元年」として正しく扱う機能を追加しました。これにより、より自然な日本語表現で日付を扱うことが可能になりました。

使い方

使い方は非常にシンプルです。Python標準のdatetimeクラスに似たインターフェースを提供しており、開発者にとって親しみやすいものとなっています。

from jpdatetime import jpdatetime

# 日本の元号の日付文字列をパース
# 例:令和5年10月30日
date_string = "令和5年10月30日"
format_string = "%j年%m月%d日"
date_obj = jpdatetime.strptime(date_string, format_string)
print(date_obj)  # 出力: 2023-10-30 00:00:00

# `datetime`オブジェクトを日本の元号形式でフォーマット
# 例:2024年10月30日をフォーマット
formatted_date = date_obj.strftime("%j年%m月%d日")
print(formatted_date)  # 出力: "令和6年10月30日"

%jが元号を表し、その他のフォーマット指定子はdatetimeと同じように使うことができます。また、元年のフォーマットにも自動で対応しているため、特別な処理を追加する必要はありません。

苦労したポイント

開発の過程でいくつかの困難に直面しました。最も大変だったのは、元年の取り扱いです。通常の年のように「1年」として扱うのではなく、「元年」という特別な表記に対応する必要があり、これがパースやフォーマットの実装において複雑な処理を必要としました。

今後の開発の方針

今後の開発では、以下のような機能追加を予定しています。

  • 元号リストの外部リスト化:元号を外部ファイルにリスト化し、ユーザーが自由に新しい元号を追加・変更できるようにします。

  • 多言語対応:元号の表記を英語など他の言語に変換することで、国際的なアプリケーションでも利用しやすくする予定です。

  • 短縮表記サポート:元号と年の短縮表記(例:「R5」)をサポートし、表示領域が限られる環境でも利用しやすくします。

  • 漢数字対応:年、月、日を漢数字で表記する機能を追加し、伝統的なスタイルを要求する場面にも対応できるようにします。

  • タイムゾーン対応:datetimeと同様にタイムゾーンに対応し、より柔軟な日時の扱いを可能にする予定です。

これからもjpdatetimeをより便利で多機能なものにするために、改善を続けていきたいと思います。このライブラリが皆さんの日本の日付に関する開発の手助けとなることを願っています。ぜひフィードバックをいただければ嬉しいです。今後ともよろしくお願いいたします。

いいなと思ったら応援しよう!