Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
3
Help us understand the problem. What is going on with this article?
@piacerex

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

More than 1 year has passed since last update.

(この記事は 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

うまく動作しました

3
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  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
piacerex
福岡でプログラマしながらIT商社とIT企業を経営してます。Elixir/Kerasをよく使う。Elixirコミュ#fukuokaex、福岡理学部#FukuokaScienceを主催。プログラマ歴36年/XPer歴19年/デジタルマーケッター/経営者/CTO/技術顧問数社。 シボと重力子放射線射出装置は別腹(^^)
fukuokaex
エンジニア/企業向けにElixirプロダクト開発・SI案件開発を支援する福岡のコミュニティ

Comments

No comments
Sign up for free and join this conversation.
Sign Up
If you already have a Qiita account Login
3
Help us understand the problem. What is going on with this article?