(この記事は Elixir (その2)とPhoenix Advent Calendar 2016 22日目の記事です)
社内のElixirハッカソン&アイデアソンにて、カスタマーサポートから「お客さんからの問い合わせから返信まで何時間かかっているかを知りたい」というアイデアが出てきたので、チケットシステムから「チケット発行日時」から「最初にお客さんに返信した日時」までの差を拾うことになりました
その際、Timex周りを使った日時差の取得に関して、Timexがバージョンアップしている影響か、あまりWebページやサンプルも無く、Timexのhexdocs見ながらで試して、ややハマったんで、その解説いきます
ちなみに、チケットシステムは「Zendesk」で、Zendesk APIというものを使うと、チケット情報と、チケット配下のコメント群情報が、JSONで拾えます
目指せ、カスタマーサポートからマネージャまで、Elixirでツールをサクっと作ってしまう世界!
Timexモジュールのインストール
いつも通り、適当なElixirプロジェクトのmix.exsに下記エントリー追加して、deps.getします
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
うまく動作しました