> ## Documentation Index
> Fetch the complete documentation index at: https://documentation.onesignal.com/llms.txt
> Use this file to discover all available pages before exploring further.

# 時間演算子

> 時間演算子を使用すると、特定の時点に対して相対的なメッセージを送信できます——アクションが発生した後や、今後の日付の前など。

## 概要

時間演算子を使用すると、特定の時点に対して相対的なメッセージを送信できます——**アクションが発生した後**や**今後の日付の前**など。

その時点を**Unix タイムスタンプ（秒単位）**として**タグ**を使用してユーザーに保存します。OneSignal は現在時刻をそのタイムスタンプと比較し、経過時間（または残り時間）に基づいてユーザーをターゲットにできます。

これにより、メッセージを手動でスケジュールすることなく、リマインダー、フォローアップ、期限切れメッセージを簡単に自動化できます。

**一般的な使用例：**

* **[カート放棄](./abandoned-cart)**：一定時間後にチェックアウトしていないユーザーにリマインドする
* **イベントリマインダー**：予定されたアポイントや更新日の前にユーザーにメッセージを送信する
* **マイルストーン**：ユーザーが期限までにアクションを完了していない場合のフォローアップ
* **誕生日**：ユーザーの誕生日（または誕生日前後）に自動メッセージを送信する

<Note>
  時間演算子は有料プランでのみ利用できます。無料プランでも、ファーストセッションやラストセッションなどのデフォルトの時間ベースセグメントフィルターを使用できます。
</Note>

### いつ使用すべきか？

時間演算子は次の場合に使用してください：

* 固定されたカレンダー時間ではなく、**イベントに対して相対的な**メッセージを送信する
* **移動する時間ウィンドウ**を作成する（例：「24～48時間後」）
* 異なる日付を持つ多くのユーザーに対して同じロジックを再利用する
* 時間の経過とともに資格を継続的に評価する

イベントが発生したときに即座にメッセージをトリガーする必要がある場合は、代わりに\*\*[カスタムイベント](./custom-events)\*\*の使用を検討してください。

### タグ vs カスタムイベント

多くの「リマインダー」ユースケースは**タグ**または**カスタムイベント**のいずれかで解決できます。最適なオプションは、保存する必要があるものと自動化をトリガーする方法によって異なります。

* ユーザーに**最新の既知タイムスタンプ**（例：`cart_updated_at` や `subscription_expires_at`）を保存し、その値に基づいて時間をかけてセグメント化したい場合は**タグ**を使用します。
* **各イベント発生**（プロパティ付き）を記録し、リアルタイムの行動に基づいてジャーニーをトリガーしたい場合は**カスタムイベント**を使用します。

<Info>
  実際には、多くの実装で両方を使用できます：リアルタイム追跡用のカスタムイベントと、後でセグメント化したいユーザー状態用のタグ。
</Info>

[Tags](/docs/ja/add-user-data-tags)と[Custom Events](/docs/ja/custom-events)は、どちらもユーザーにデータを追加する方法です。ただし、いくつかの重要な違いがあります：

| 機能      |              Tags             |                         Custom Events                        |
| ------- | :---------------------------: | :----------------------------------------------------------: |
| データ使用   |     セグメンテーションとパーソナライゼーション     | セグメントなしでJourneysをトリガー、Wait Untilステップ、Journeys内で直接パーソナライゼーション |
| データ保持期間 |               永久              | 30日以上（[永久ストレージが利用可能](/docs/ja/billing-faq#streaming-events)） |
| データ形式   |        キーバリューの文字列または数値        |                             JSON                             |
| データソース  | OneSignal SDK、API、または統合（制限あり） |                    OneSignal SDK、API、または統合                   |
| データアクセス |   セグメンテーションとメッセージパーソナライゼーション  |    JourneysとJourneyメッセージテンプレートのパーソナライゼーション、セグメンテーション（近日公開）   |

TagsとCustom Eventsの主な違いは、その深さとユースケースにあります。Tagsはユーザーのプロパティであり、名前、アカウントステータス、場所などです。Eventsはユーザーが行ったことであり、アイテムの購入、レベルの完了、友達の招待などです。tagsとeventsの両方は、セグメンテーションとパーソナライゼーションに使用できます。

実際には、両方を使用する可能性が高いです：

* 静的であまり変更されないユーザープロパティにはTags
* リアルタイムシナリオ、複雑なセグメンテーション、より洗練されたジャーニーワークフローにはCustom Events

***

## クイックリファレンス

1. イベント日を**秒単位**の Unix タイムスタンプに変換します。
2. キーがイベント名で、値がタイムスタンプを**文字列**として持つ[タグ](./add-user-data-tags)を設定します（例：`'event_date': '1739145600'`）。
3. **Time Elapsed Greater Than** 演算子を使用してセグメントを作成します：
   * 過去の日付の後の場合、**Time Elapsed Greater Than** 演算子と正の値を使用
   * 未来の日付の前の場合、**Time Elapsed Greater Than** 演算子と負の値を使用

<Warning>
  よくある間違いは、タイムスタンプを**秒**（10桁）ではなく**ミリ秒**（13桁）で設定することです。時間演算子には**秒**が必要です。
</Warning>

***

## 過去のイベントの後にメッセージを送信する

何かが起こった後に**一定時間が経過した後**にユーザーにメッセージを送信したい場合に、このパターンを使用します。

**例：ユーザーがカートを更新してから24時間後にカート放棄リマインダーを送信**

<Steps>
  <Step title="イベント発生時にタイムスタンプを保存する">
    ユーザーがカートを更新したときに、現在時刻を Unix タイムスタンプ（秒単位）として保存します：

    ```javascript theme={null}
    // SDK の例
    const timestampSeconds = String(Math.floor(Date.now() / 1000));
    OneSignal.User.addTag("cart_updated_at", timestampSeconds);
    ```

    <Warning>
      秒（10桁）を使用し、ミリ秒（13桁）は使用しないでください。
    </Warning>
  </Step>

  <Step title="セグメントを作成する">
    1. **Audience** > **Segments** に移動
    2. **User Tag** フィルターを追加
    3. **Key** を `cart_updated_at` に設定
    4. **Time Elapsed Greater Than** を選択
    5. **Value** を `1` 日（または `24` 時間または `86400` 秒）に設定

    <Frame caption="24時間前にカートを放棄したユーザーのセグメント">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=fd95aaf5b4ff3d4ebf594af867a594c8" alt="Time Elapsed Greater Than を使用するセグメント" width="1311" height="617" data-path="images/segments/time-elapsed-greater-than.png" />
    </Frame>
  </Step>

  <Step title="上限を追加する（推奨）">
    上限がないと、ユーザーは永続的にセグメントに残ります。2つ目のフィルターを追加してウィンドウを作成します：

    * **Time Elapsed Greater Than** `24` 時間
    * **Time Elapsed Less Than** `48` 時間

    これで、ユーザーはイベント後24〜48時間の間のみセグメントに含まれます。

    <Frame caption="24〜48時間のウィンドウを持つセグメント">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-less-than.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=3cb973d5b0252683e9f804e4b04a37b4" alt="Time Elapsed Greater Than と Less Than の両方を使用するセグメント" width="1292" height="715" data-path="images/segments/time-elapsed-greater-less-than.png" />
    </Frame>
  </Step>

  <Step title="ジャーニーでセグメントを使用する">
    セグメントをターゲットとする[ジャーニー](./journeys-overview)を作成してメッセージングを自動化します。
  </Step>
</Steps>

***

## 未来のイベントの前にメッセージを送信する

このパターンを使用して、**今後の日付の前**にアポイントや更新などのユーザーにメッセージを送信します。

1. 未来の日付を Unix タイムスタンプタグとして保存します（例：`'future_date': '1739145600'`）
2. **Time Elapsed Greater Than** と希望する入力時間を負の値として使用してセグメントを作成します
   * 例：`-2` 日（または `-172800` 秒）

<Frame caption="今後のイベントを持つユーザーのセグメント">
  <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than-negative-value.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=bea6fe1e5d4a2d3349fe05674946b910" alt="負の値を使用する Time Elapsed Greater Than のセグメント" width="1291" height="618" data-path="images/segments/time-elapsed-greater-than-negative-value.png" />
</Frame>

3. 同じ**Time Elapsed Greater Than** 演算子を使用して、より近い時間の負の値で上限を追加します
   * 例：`-1` 日（または `-86400` 秒）

<Frame caption="上限があるセグメント">
  <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/time-elapsed-greater-than-negative-value-upper-limit.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=406246bb0136f1997ababc06a638408f" alt="負の値と上限を使用する Time Elapsed Greater Than のセグメント" width="1286" height="703" data-path="images/segments/time-elapsed-greater-than-negative-value-upper-limit.png" />
</Frame>

### 例：誕生日メッセージ

各ユーザーの**次の誕生日**をタイムスタンプとして保存して誕生日メッセージを送信します。

<Steps>
  <Step title="次の誕生日のタイムスタンプを保存する">
    ユーザーの次の誕生日を計算して保存します：

    ```javascript theme={null}
    function getNextBirthday(month, day) {
      // month: 0-11 (Jan=0), day: 1-31
      const now = new Date();
      let birthday = new Date(now.getFullYear(), month, day);

      if (birthday <= now) {
        birthday = new Date(now.getFullYear() + 1, month, day);
      }

      return String(Math.floor(birthday.getTime() / 1000));
    }

    // 例：1月15日の誕生日
    OneSignal.User.addTag("birthday", getNextBirthday(0, 15));
    ```
  </Step>

  <Step title="誕生日セグメントを作成する">
    * **User Tag**：`birthday`
    * **Time Elapsed Greater Than**：`0` 秒

    ユーザーは誕生日のタイムスタンプが過ぎるとセグメントに入ります。

    <Frame caption="誕生日セグメント">
      <img src="https://mintcdn.com/onesignal/BIUS_wdfwITxcuxQ/images/segments/birthday-segment.png?fit=max&auto=format&n=BIUS_wdfwITxcuxQ&q=85&s=6f431d2f592779f74a5b4e27045ad984" alt="Time Elapsed Greater Than 0を使用する誕生日セグメント" width="1287" height="602" data-path="images/segments/birthday-segment.png" />
    </Frame>
  </Step>

  <Step title="繰り返しジャーニーを設定する">
    1. 誕生日セグメントをターゲットとする[ジャーニー](./journeys-overview)を作成
    2. 再入場を**52週間**に設定して、ユーザーが来年再入場できるようにする
    3. 送信後に `birthday` タグを来年の日付に更新する（バックエンドまたはジャーニーで）
  </Step>
</Steps>

<Note>
  可能な場合は、ユーザーの現地時間帯を使用して誕生日タイムスタンプを計算してください。サーバー時刻のみを使用すると、メッセージが予想より早いまたは遅い時間に送信される可能性があります。
</Note>

<Warning>
  メッセージを年々正確に保ちたい場合は、メッセージ送信後にユーザーの `birthday` タグを次の誕生日に更新してください（例：バックエンドまたはジャーニーステップで）。これを行う場合、代わりに[カスタムイベント](./custom-events)を使用する方が簡単かもしれません。
</Warning>

<Check>
  誕生日メッセージは、ユーザーの `birthday` タグ日付の頃にユーザーに送信されます。
</Check>

***

## FAQ

### 数式はどのように機能するのですか？（技術的詳細）

時間演算子は、固定日付ではなく**相対的で移動するウィンドウ**を作成できるようにするために存在します。

OneSignal は次の式を使用して経過時間を計算します：

```
time_elapsed = current_time - tag_timestamp
```

* **過去のタイムスタンプ** → 正の値
* **未来のタイムスタンプ** → 負の値

**演算子：**

* `Time Elapsed Greater Than X`：`elapsed > X` のときにマッチ
* `Time Elapsed Less Than X`：`elapsed < X` のときにマッチ

**未来のタイムスタンプが `Less Than` で即座にマッチする理由：**

負の数は正の数より小さいです。そのため `time_elapsed_lt 2 days`（172,800秒）は未来30日のタイムスタンプとマッチします：

```
-2,592,000 < 172,800  →  true（マッチ）
```

未来のタイムスタンプは常に負の経過時間を生成するため、今後のイベントの前にユーザーがセグメントに入り、出るタイミングを定義するには**負の値を使用する必要があります**。正の値は未来の日付の\_前\_の時間を表すことはできません。

### どのようにテストできますか？

1. 外部ID、サブスクリプションID、メールまたは電話番号でユーザーを見つけます。ユーザーの見つけ方の詳細については、[テストサブスクリプションの検索と設定](./test-users)を参照してください。
2. 現在の日付と未来の日付（今から5分後）の秒単位のタイムスタンプを取得します。
3. キーが'current\_time'と'future\_time'で値が秒単位のタイムスタンプである2つのタグを設定します。
4. 次のフィルターを使用して `current_time` セグメントを作成します：
   * **User Tag**：`current_time` **Time Elapsed Greater Than**：`2` 分
   * および **User Tag**：`current_time` **Time Elapsed Less Than**：`5` 分
5. 次のフィルターを使用して `future_time` セグメントを作成します：
   * **User Tag**：`future_time` **Time Elapsed Greater Than**：`-5` 分
   * および **User Tag**：`future_time` **Time Elapsed Less Than**：`-2` 分

次のようにユーザーが見えるはずです：

* 現在時刻日付の2分後に `current_time` セグメントに入り、現在時刻日付の5分後にセグメントを出る。
* 未来時刻日付の5分前に `future_time` セグメントに入り、未来時刻日付の2分前にセグメントを出る。

***
