見出し画像

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)

画像1

なるほど、確かにおかしいですね。

今回はこの件についてまとめてみました。

解決法

解決法はいくつか在るので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 Python公式ドキュメント

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クライアント側が自動で行ってしまうようです。そのため、タイムスタンプが未来になってしまっていたという事ですね。

原因がわかれば解決は簡単です。最初に提示した方法を用いてみて、、、

画像2

よし、ok!

最後に

今回は初めての試みとして、質問された内容を記事としてまとめてみました。

少しでもbot開発者の助けになったら幸いです。

Discordコミュニティ運営をテーマとしたサーバー、MSSに所属してます。

Twitter-> https://twitter.com/mss_discord

Discord-> https://discord.gg/yxRMTCJ

紹介記事-> https://note.com/mss_discord/n/nb746ce705961

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