discord.pyのtimestampにはUTCを渡さなきゃいけないってお話。
どうもどうも、MSSに所属しているdisneyresidents(2レジ)と申します。
今回はnoteのデビュー作として、少し技術系の記事を書いてみたいと思います。どうぞ最後までお付き合いください。
経緯
先日こんな質問を受けました。曰く、
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)
原因
datetime.now Python公式ドキュメント
現在のローカルな日時を返します。
と在るように、実行しているマシンのタイムゾーンでの現在時刻を返します。
しかしembedのtimestampは、UTCで時間が渡されることを想定しているようで、UTCをマシンのタイムゾーンに変換する処理をdiscordクライアント側が自動で行ってしまうようです。そのため、タイムスタンプが未来になってしまっていたという事ですね。
原因がわかれば解決は簡単です。最初に提示した方法を用いてみて、、、
よし、ok!
最後に
今回は初めての試みとして、質問された内容を記事としてまとめてみました。
少しでもbot開発者の助けになったら幸いです。
Discordコミュニティ運営をテーマとしたサーバー、MSSに所属してます。
Twitter-> https://twitter.com/mss_discord
Discord-> https://discord.gg/yxRMTCJ