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


ちゅうい

あくまで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件取ってくる状態
これが一番上のトゥート

これが実行結果

<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様様でした。 <終>