Help us understand the problem. What is going on with this article?

マストドンのAPIからトゥートの時間を取得したときに少し困惑した話

More than 1 year has passed since last update.

ちゅうい

あくまで2018年8月頃の話です。
その先の仕様変更によりこの記事は一切存在価値がなくなる可能性がありますのでご注意ください
また、インスタンスによって実際に帰ってくる値は違う可能性がありますので実際に取得してみることをおすすめします
今回はjpを使っています

時刻を取得する

JSONとかparseするの面倒なのでgemを使う

main.rb
require 'mastodon'
MASTODON_HOST = 'https://hoge.hoge'
access_token = 'hoge'

connection = Mastodon::REST::Client.new(base_url: MASTODON_HOST, bearer_token: access_token)
#account_idのアカウントのトゥートを10件取得
account_id = '00000'

status_data = connection.statuses(account_id, {"limit": "10"})

status_data.each do |toot|
    puts "#{toot.content} : #{toot.created_at}"
    puts ''
end

今回の場合は自分のアカウントの最新から10件取ってくる状態
これが一番上のトゥート
スクリーンショット 2018-11-29 13.57.31.png

これが実行結果

<p>クソ良いことを知ったので感謝しかない</p> : 2018-11-28T23:47:30.053Z

<p>RT <span class="h-card"><a href="https://mstdn.jp/@walk__walkway" class="u-url mention">@<span>walk__walkway</span></a></span> 初めて知った<br />tootleの上のアカウントのとこ横にフリックするとアカウント切り替えできる</p> : 2018-11-28T23:47:20.779Z

以下略

取得した時間が違う。しかもなんだこのフォーマット…

どういうこと

なんかマストドンはAPIからトゥートした時の時間とか取ってくるとUTC時間を返してくるぽい
その証明に、先程取得してきた時間+9時間するとJST時間になる

なので、実際に表示する前に9時間分こちらで加算してやる必要があります

対策

帰ってきている値が文字列なので、とりあえずTime.parse()でDate型に変換した後、9時間分加算すればよい

main.rb
status_data.each do |toot|
    jst_time = Time.parse(toot.created_at) + 60 * 60 * 9
    puts "#{toot.content} : #{jst_time}"
    puts ''
end

とりあえずparse投げとけばなんとかなる感ある(プライドはない)
実行結果

<p>クソ良いことを知ったので感謝しかない</p> : 2018-11-29 08:47:30 UTC

<p>RT <span class="h-card"><a href="https://mstdn.jp/@walk__walkway" class="u-url mention">@<span>walk__walkway</span></a></span> 初めて知った<br />tootleの上のアカウントのとこ横にフリックするとアカウント切り替えできる</p> : 2018-11-29 08:47:20 UTC

UTCってなっちゃってるけど、とりあえずいい感じになりました  <終>

rails使う場合はもう少し楽に変換できる

こんな面倒な計算使わなくてもJST時間に変換できるようです。それもメソッド1発で。すげえな

main.rb
status_data.each do |toot|
    jst_time = toot.created_at.in_time_zone('Tokyo')
    puts "#{toot.content} : #{jst_time}"
end

rails様様でした。 <終>

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away