RORK LABEN
ACQUISITION — Rorkが初の買収を実施。macOSでネイティブSwiftアプリを生成するPaperlineを取得しましたFUNDING — Left Lane Capital主導の$15Mシードは、AI時代のモバイルアプリの作り方と収益化の再定義に充てられますGROWTH — Rork Maxはローンチから3日でARR $1.5Mに到達し、2週間で年間売上を倍増させたとされますENGINE — Rork MaxはClaude Code+Claude Opus 4.6駆動。Web初のSwiftビルダーとしてXcodeを置き換えますSPLIT — 通常RorkはReact Native(Expo)、Rork MaxはネイティブSwiftでAppleエコシステム全域が対象ですPRICING — 無料で開始でき、有料は月25ドル〜、Rork Maxは月200ドルですACQUISITION — Rorkが初の買収を実施。macOSでネイティブSwiftアプリを生成するPaperlineを取得しましたFUNDING — Left Lane Capital主導の$15Mシードは、AI時代のモバイルアプリの作り方と収益化の再定義に充てられますGROWTH — Rork Maxはローンチから3日でARR $1.5Mに到達し、2週間で年間売上を倍増させたとされますENGINE — Rork MaxはClaude Code+Claude Opus 4.6駆動。Web初のSwiftビルダーとしてXcodeを置き換えますSPLIT — 通常RorkはReact Native(Expo)、Rork MaxはネイティブSwiftでAppleエコシステム全域が対象ですPRICING — 無料で開始でき、有料は月25ドル〜、Rork Maxは月200ドルです
記事一覧/開発ツール
開発ツール/2026-06-25上級

海外に行くと毎朝の通知が9時に来ない — Expoの定時ローカル通知をタイムゾーンと夏時間に強くする設計

Rork(Expo)で作った定時リマインダーが、出張やサマータイムで現地の9時に届かなくなる問題。timeIntervalトリガーの落とし穴と、ローカル時刻基準で再スケジュールする設計を実装コード付きで整理します。

Rork451expo-notifications6タイムゾーン2ローカル通知3React Native182DST

プレミアム記事

毎朝「今日の一枚」を届ける壁紙アプリで、ある利用者から「ヨーロッパに来たら通知が夕方に届く」という報告をもらったことがあります。日本では問題なく朝9時に出ていたので、最初はサーバー側の話かと疑いました。けれども原因はもっと手前、ローカル通知のトリガーの組み方にありました。

個人開発で癒し・引き寄せ系のアプリを6本ほど並行運用していると、こうした「自分の端末では再現しないバグ」が一番厄介です。定時通知の時刻ずれは、まさにその典型でした。ここでは、Expo のローカル通知がタイムゾーンと夏時間(DST)でずれる仕組みを切り分け、現地時刻に追従させる再スケジュール設計を、私自身が実際に直した手順に沿って実装コードとともに整理します。

なぜ「現地の9時」に届かなくなるのか

ずれの正体は、トリガーが「絶対的な瞬間」を指しているか「現地のカレンダー上の時刻」を指しているかの違いです。expo-notifications のトリガーは大きく3系統あります。

トリガー種別指す対象時差・DSTで
timeInterval(n秒後)絶対的な瞬間(スケジュール時点から固定秒数)ずれる
date(固定のDate)絶対的な瞬間(UTC上の一点)ずれる
daily / calendar(hour, minute)端末の現地カレンダー上の時刻追従する

問題が起きやすいのは、timeInterval で「次の朝9時までの秒数」を計算して渡すパターンです。これは一見正しく見えますが、スケジュールした瞬間に「○○秒後」という絶対的な約束に変換されます。利用者が9時間進んだタイムゾーンへ移動しても、約束された瞬間は動きません。結果、現地では夕方に鳴る、というわけです。

固定の Date を渡すパターンも同じ理屈でずれます。new Date(2026, 5, 26, 9, 0) は端末の現在オフセットでUTCの一点に焼き付けられるため、移動後にそのまま発火すると現地の時計とは合いません。

私が踏んだのはこの両方でした。日替わりで通知文を変えたかったので、あえてカレンダートリガーではなく日付を1件ずつ計算して積んでいたのです。文面の出し分けと引き換えに、時差耐性を失っていました。

まず基本:現地時刻に追従させたいだけなら DAILY を使う

毎日同じ文面・同じ現地時刻でよいなら、答えはシンプルです。SchedulableTriggerInputTypes.DAILY を使えば、OS が現地カレンダーで再評価してくれるため、時差移動も夏時間の切り替えも自動で吸収されます。

import * as Notifications from 'expo-notifications';
 
export async function scheduleDailyReminder(hour: number, minute: number) {
  // 既存の定時枠を一旦消してから積み直す(重複防止)
  await Notifications.cancelAllScheduledNotificationsAsync();
 
  await Notifications.scheduleNotificationAsync({
    content: {
      title: '今日の一枚が届きました',
      body: 'ホーム画面の気分を、静かに変えてみませんか。',
    },
    trigger: {
      type: Notifications.SchedulableTriggerInputTypes.DAILY,
      hour,   // 端末の現地時刻で解釈される
      minute,
    },
  });
}

iOS では内部的に UNCalendarNotificationTrigger、Android では繰り返しアラームに対応づきます。どちらも「現地の hour:minute」という意味なので、東京で設定して9時間進んだ地域へ移っても、現地の9時に鳴ります。timeInterval から DAILY に置き換えるだけで直る場合が、実は一番多いです。

ここまでお読みいただきありがとうございます。

この記事の続きを読む

この先には、実装コードやベンチマーク結果など、実務でお役に立てる内容をご用意しています。このサイトは広告を掲載しておらず、サーバーや開発にかかる費用はメンバーの皆様のご支援で成り立っています。もしお役に立てていましたら、ご支援いただけますと大変ありがたいです。

この記事で得られること
timeInterval/Date トリガーが時差・夏時間でずれる理由と、DAILYカレンダートリガーが現地時刻に追従する仕組みの切り分け
意図した「現地9:00」を保持し、フォアグラウンド復帰時にタイムゾーン変化を検知して全件キャンセル&再スケジュールする実装
春の時刻飛び(2:30が存在しない日)と64件上限の回転枠を両立させる、次回発火時刻の安全な計算ロジック
Stripe による安全な決済 · いつでもキャンセル可能

この記事を購入する

この先の内容をすべてお読みいただけます。一度のご購入で、いつでも何度でもアクセスできます。このサイトは広告を掲載しておらず、皆さまのご支援がサーバー費用などの運営を支えています。

または
メンバーシップなら全記事が読み放題 →
シェア

お読みいただきありがとうございます

Rork Lab は広告なしで運営しており、サーバー費用などの運営コストはメンバーシップのご支援で賄っています。実装コード・ベンチマーク・本番設計パターンなど、実務でお役立ていただける記事を毎日更新しています。もし読んでよかったと感じていただけましたら、ぜひご覧ください。

  • コピー&ペーストで使える実装コード付き
  • 毎日新しい上級ガイドを追加
  • ¥580/月 または ¥1,480 の永久アクセス
メンバーシップを見る →

関連記事

開発ツール2026-06-22
毎朝違う一言を出す日替わりリマインダーが、ある日から鳴らなくなる——iOSの保留64件という見えない上限
Rork(Expo)で作った日替わりリマインダーが、しばらく経つと無言で止まる原因はiOSの保留通知64件上限です。固定文言のカレンダートリガーと、日替わりコンテンツのローリング再スケジュールを動くコードで設計し、サマータイムや複数リマインダー併用でも狂わない通知を組みます。
開発ツール2026-04-05
Rork × expo-notifications ローカル通知 実装ガイド — スケジュール・繰り返し・リマインダーの作り方
Rork × expo-notifications でローカル通知を実装する完全ガイド。スケジュール通知・繰り返しアラーム・リマインダーの作り方をコード例付きで丁寧に解説します。
開発ツール2026-04-29
Rork で日付が日本時間にならない・9時間ずれる時の直し方
Rork で作ったアプリで日時が9時間ずれる、日本時間にならない、深夜に日付が変わってしまう——そんな時に確認すべきポイントと、ライブラリ別の安全な書き方を整理しました。
📚RECOMMENDED BOOKS
大規模言語モデル入門
山田育矢
LLM開発
生成AIプロンプトエンジニアリング入門
我妻幸長
プロンプト
Claude CodeによるAI駆動開発入門
平川知秀
AI駆動開発
※ アフィリエイトリンクを含みます
もっと見る →