「2時間前」「3分前」のような相対時間表示をPythonでさくっと実装する

モダンなSNSやニュースサイトなどのアプリケーションで、投稿時間を「2時間前」や「3分前」のように経過時間で表示しているものがあります。 このような経過時間(相対時間)による表示は、直感的に理解しやすく、ユーザーにとって便利です。

この記事では、Pythonを使って「2020年9月13日 10:20:52」のような投稿時間表示を、相対時間表示に置き換える方法をご紹介します。

相対時間表示

1. 入力

入力は、絶対時間(「2020年9月13日 10:20:53」のように表記される時間)です。

Pythonのdatetimeモジュールに含まれるdatetime型で入力を受け付けます。 datetime型のオブジェクトは、以下のように日時を指定して生成できます。

from datetime import datetime
datetime(2020, 9, 13, 22, 56, 53, 157030)

今回は、これをメソッドの引数として受け取ると想定します。

2. 出力

出力は、以下のルールに従う文字列とします。

  • 経過時間が10秒未満なら「たった今」を返す
  • 経過時間が10秒以上1分未満なら「S秒前」を返す
  • 経過時間が1分以上1時間未満なら「M分前」を返す
  • 経過時間が1時間以上24時間未満なら「H時間前」を返す
  • 経過時間が24時間以上3日未満ならを「d日前」を返す
  • 経過時間が3日以上なら「Y年m月d日」を返す

3日以上前の投稿について「39日前」や「1ヶ月と15日前」などと表記されても直感的に分かりにくいため、 3日以上前の場合には、年月日を返します。

3. 実装

実装は、上記のルールをそのままコードに適用するだけです。簡単ですね。

from datetime import datetime


def relative_time(absolute_time: datetime) -> str:

    # 入力(投稿日時)から現在時刻までの経過時間を秒数で取得する
    elapsed_seconds = (datetime.now() - absolute_time).total_seconds()

    # 「たった今」「日」「時」「分」「数日前」をそれぞれ秒数で定義する
    moment = 10
    minute = 60
    hour = minute * 60
    day = hour * 24
    a_few_days = 3 * day

    # 経過時間によって出力(相対時間)を返す
    if elapsed_seconds < moment:
        return 'たった今'
    elif moment <= elapsed_seconds < minute:
        return f'{int(elapsed_seconds)} 秒前'
    elif minute <= elapsed_seconds < hour:
        return f'{int(elapsed_seconds / minute)} 分前'
    elif hour <= elapsed_seconds < day:
        return f'{int(elapsed_seconds / hour)} 時間前'
    elif day <= elapsed_seconds < a_few_days:
        return f'{int(elapsed_seconds / day)} 日前'
    else:
        return absolute_time.strftime('%Y年%m月%d日')

4. まとめ

以上のように、とてもシンプルなコードで日時情報を相対時間表示にできます。 コピペでも動作するので、ぜひ試してみてください。

株式会社アビストAIソリューション事業部では、このような技術者向けの記事を今後も公開する予定です。 Twitterアカウントもあるので、ぜひフォローしてください。

AIソリューション事業部 公式Twitterアカウント @abist_ai

また、プログラミング不要のAI構築プラットフォームの提供もしております。 GUIの簡単な操作で機械学習モデルを構築できるので、ぜひ新規登録して使ってみてください。

welcome.aiplant-bamboo.com

f:id:abist-sugiyama:20200916155448p:plain