2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

discord.pyのtimestampにはUTCを指定しなきゃいけないってお話

Last updated at Posted at 2020-11-29

経緯

先日こんな質問を受けました。曰く、

embedのタイムスタンプが、何故か9時間先に進んだ時刻になってしまう

と。
ちょっと検証してみましょう。

from datetime import datetime

# 中略

embed = discord.Embed(title="hoge", description="fuga", timestamp=datetime.now())
await message.channel.send(embed=embed)

image.png

:thinking:確かにおかしいですね
今回はこの件についてまとめてみました。

解決法

解決法はいくつか在るので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クライアント側が自動で行ってしまうようです。そのため、タイムスタンプが未来になってしまっていたという事ですね。
原因がわかれば解決は簡単です。最初に提示した方法を用いてみて、、、

image.png
よし、ok!

最後に

今回は初めての試みとして、質問された内容を記事としてまとめてみました。
少しでもbot開発者の助けになったら幸いです。

2
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?