LoginSignup
12
3

More than 5 years have passed since last update.

ElixirでJSON日時の差を取得~Timexの利用~

Last updated at Posted at 2017-05-31

(この記事は Elixir (その2)とPhoenix Advent Calendar 2016 22日目の記事です)

社内のElixirハッカソン&アイデアソンにて、カスタマーサポートから「お客さんからの問い合わせから返信まで何時間かかっているかを知りたい」というアイデアが出てきたので、チケットシステムから「チケット発行日時」から「最初にお客さんに返信した日時」までの差を拾うことになりました

その際、Timex周りを使った日時差の取得に関して、Timexがバージョンアップしている影響か、あまりWebページやサンプルも無く、Timexのhexdocs見ながらで試して、ややハマったんで、その解説いきます

ちなみに、チケットシステムは「Zendesk」で、Zendesk APIというものを使うと、チケット情報と、チケット配下のコメント群情報が、JSONで拾えます

目指せ、カスタマーサポートからマネージャまで、Elixirでツールをサクっと作ってしまう世界! :sunrise:

Timexモジュールのインストール

いつも通り、適当なElixirプロジェクトのmix.exsに下記エントリー追加して、deps.getします

mix.exs
defmodule WebMiniAi.Mixfile do
 …
    defp deps do
 …
        { :timex, "~> 3.0" },
 …

モジュール取得します(要ネット接続)

# mix deps.get

ハマり①:JSON中の日時文字列を日時値に変換

Poisonモジュールで、JSONからパースした日付は、文字列のため、こんな感じで変換します

"yyyy-mm-ddThh:mm:ssZ" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )

※parse()の"%Y-%m-%dT%H:%M:%SZ"の部分は、パースする文字列のフォーマットによって変わります

試してみましょう

iex> "2017-04-11T09:08:58Z" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )
{:ok, ~N[2017-04-11 09:08:58]}

:okとセットのタプルで返ってくるので、実際に使うときは、こんな感じで、タプルのパターンマッチで受けます

iex> { :ok, created_at } = "2017-04-11T09:08:58Z" |> Timex.parse( "%Y-%m-%dT%H:%M:%SZ", :strftime )
{:ok, ~N[2017-04-11 19:08:58]}
iex> created_at
~N[2017-04-11 19:08:58]

ハマり②:日時の差を出す

こんな感じで取得できます

Timex.diff( datetime_to, datetime_from, :hours )

※:hoursのところは、出したい単位によって変わりますが、単位の全量はこちらにあります

では、試してみましょう

iex> Timex.diff( ~N[2017-04-12 09:08:58], ~N[2017-04-11 19:08:58], :hours )
14

時単位での差分が出せました

toとfromが逆転するパターンも試しましょう

iex> Timex.diff( ~N[2017-04-11 19:08:58], ~N[2017-04-12 09:08:58], :hours )
-14

マイナス表記になりました

単位を変えてみましょう

iex> Timex.diff( ~N[2017-04-12 09:08:58], ~N[2017-04-11 19:08:58], :minutes )
840
iex> Timex.diff( ~N[2017-04-14 09:08:58], ~N[2017-04-11 19:08:58], :days )
2

うまく動作しました

12
3
1

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
12
3