🐶

【HubSpot API】タイムスタンプの罠

2024/06/11に公開

結論:HubSpot APIのタイムスタンプはUNIXタイムスタンプかISO 8601文字列を使いましょう!(2024/6/1時点)

HubSpotの管理画面上では日付プロパティは「2024/06/01」などと表示されています。
しかし、APIでタイムスタンプを操作する場合はUNIXタイムスタンプ、または、ISO 8601文字列を使う必要があります。

HubSpot CRMのdate/dateTimeプロパティ

HubSpotのCRMプロパティでタイムスタンプを扱うものとしては「date」と「dateTime」の2種類があります。

1.date(日付プロパティ)

  • 日付のみを保存し、時刻は保存されない
  • 日付はUTC午前0時に設定する必要があり、それ以外はエラーになる
    -  例: 1430438400000 (2015年05月01日 00:00:00 UTC)
  • アカウントやユーザーのタイムゾーン設定に関係なく、設定された特定の日付を表示する

2.dateTime(日時プロパティ)

  • 任意の時間を保存できる(ミリ秒単位)
  • APIを使用してのみ作成可能
  • レコードを表示しているユーザーのタイムゾーンに基づいて表示される

Railsでどのように変換するか

主に 「strftimeメソッド」または「localizeメソッド」 を使う方法があります。
それほど多くない使用頻度であれば、一番簡単なのは「strftimeメソッド」かもしれません。
複数箇所で使い回す必要がある場合は「localizeメソッド」を使う方がDRY(Don't Repeat Yourself)で良いですね。
ただし、localizeメソッドを使用する場合はI18nライブラリをインストールする必要があるので注意。

strftimeメソッド

# strftimeメソッドでiso8601を使用する場合
ruquest.created_at.strftime('%Y-%m-%dT00:00:00.000Z')

localizeメソッド
localizeメソッドの場合は先にひと手間

config/locales/ja.yml
ja:
  time:
    formats:
      default: '%Y/%m/%d %H:%M:%S'
      iso8601: '%Y-%m-%dT00:00:00.000Z' # 「iso8601」の部分は好きな名前でOK
viewで呼び出しの場合
# ヘルパーメソッドが使えるので、「l」だけでOK
<%= l user.created_at, format: :iso8601 %>  # 2024-06-01T00:00:00.000Z
controllerやmodelで呼び出しの場合
formatted_time = I18n.l(request.created_at, format: :iso8601)

わかりやすい説明があるので、詳しくは公式ドキュメントやQiitaの記事を参照してください!
(記事を書いてくれている世界中のエンジニアの皆さん、ありがとうございます!)

Discussion