経緯
先日こんな質問を受けました。曰く、
embedのタイムスタンプが、何故か9時間先に進んだ時刻になってしまう
と。
ちょっと検証してみましょう。
from datetime import datetime
# 中略
embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.now())
await message.channel.send(embed=embed)
確かにおかしいですね
今回はこの件についてまとめてみました。
解決法
解決法はいくつか在るので3つほど提示してみます。
UTCでの時間を取得する
datetime.utcnow Python公式ドキュメント
datetime.utcnow
を用いてUTCでの時間を取得する方法です。
提示する方法の中で一番単純なのでこれをおすすめします。
from datetime import datetime
# 中略
embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.now())
このコードを
- embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.now())
+ embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.utcnow())
このように変更すれば解決できます。(timestamp=datetime.now()
をtimestamp=datetime.utcnow()
へ書き換えてください。)
UTCでの時間を取得する(2)
datetime.now()
は引数を指定しないとマシンのタイムゾーンでの現在時間を返しますが、タイムゾーンを指定して取得することもできます。
UTCの時間を渡してあげればいいので、引数にtimezone.utc
を渡してあげましょう。
from datetime import datetime, timezone
# 中略
embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.now(timezone.utc))
await message.channel.send(embed=embed)
こんな感じ。
手動で時間を引いてみる
datetime.timedelta Python公式ドキュメント
datetime.timedelta
を使えば特定の時間から、特定の時間前や時間後のdatetimeオブジェクトを取得することができます。
例えばJSTならUTCから9時間進んでいるため、datetime.now
からdatetime.timedelta(hours=9)
を引いてやればUTCに変換できます。
from datetime import datetime, timedelta
#中略
JST_time = datetime.now()
UTC_time = JST_time - timedelta(hours=9)
embed = discord.Embed(title="hoge", description="fuga", timestamp=UTC_time)
await message.channel.send(embed=embed)
原因
現在のローカルな日時を返します。
と在るように、実行しているマシンのタイムゾーンでの現在時刻を返します。
しかしembedのtimestampは、UTCで時間が渡されることを想定しているようで、UTCをマシンのタイムゾーンに変換する処理をdiscordクライアント側が自動で行ってしまうようです。そのため、タイムスタンプが未来になってしまっていたという事ですね。
原因がわかれば解決は簡単です。最初に提示した方法を用いてみて、、、
最後に
今回は初めての試みとして、質問された内容を記事としてまとめてみました。
少しでもbot開発者の助けになったら幸いです。