ExcelでISO 8601(タイムゾーン付き)を日時に変換する方法|一括変換の式と表示形式、UTC/JST補正まで

APIやログ、Power Automateなどから取り込んだ日時が「2025-07-03T08:00:00.000-04:00」のようなISO 8601文字列だと、Excelで見づらく、並べ替えや集計もしにくくなりがちです。この記事では、セル関数で“普通の日時”に変換して一括適用する方法を中心に、表示形式のコツ、タイムゾーン補正が必要な場合の考え方、Power Queryでの別解までまとめます。

目次

Excelでタイムゾーン付きISO 8601が日時として扱いづらい理由

Excelの日時は、見た目が「2025/7/3 8:00」であっても、内部的には「シリアル値」という数値で管理されています(例:日付=整数、時刻=小数)。一方、ISO 8601のタイムゾーン付き文字列は次のように情報量が多く、Excelが自動判定しにくいことがあります。

例要素意味
2025-07-03日付年-月-日
T区切り日付と時刻の区切り
08:00:00時刻時:分:秒
.000小数秒ミリ秒など(なくてもよい)
-04:00UTCオフセットUTCより4時間遅い(ローカル=UTC-4)

このうち、末尾のオフセット(-04:00)や小数秒が混ざると、Excelが「これは日時だ」と判断できず、文字列のまま扱われるケースがよくあります。そこで実務では、まずは日付部分と時刻部分だけを切り出して、Excelが扱える日時の値に作り直すのが確実です。

補足として、Excelの式は環境によって引数の区切りがカンマ(,)ではなくセミコロン(;)の場合があります。もし貼り付けた式が構文エラーになるときは、区切り記号だけ置き換えてください。

最短で解決:日付+時刻を切り出してExcelの日時にする

目的が「見やすくする」「並べ替え・フィルタ・ピボットで使えるようにする」なら、タイムゾーンは一旦無視して、日付と時刻(秒まで)をExcelの日時に変換します。A1にISO文字列がある想定で、隣のB1に次を入力してください。

=DATEVALUE(LEFT(A1,10)) + TIMEVALUE(MID(A1,12,8))

この式がやっていることはシンプルです。

  • LEFT(A1,10):先頭10文字(yyyy-mm-dd)を取り出す
  • MID(A1,12,8):12文字目から8文字(hh:mm:ss)を取り出す
  • DATEVALUE(...)とTIMEVALUE(...)で、それぞれ日付・時刻をシリアル値に変換して足す

結果は「見た目はまだ変わらない」ことがありますが、これは表示形式の問題です。値としては日時になっているので、次の表示形式を設定すれば一気に読みやすくなります。

表示形式の設定(TEXT関数ではなくセルの書式で)

B列(変換結果の列)を選択し、セルの書式設定→表示形式→ユーザー定義で、例えば次のいずれかを指定します。

ユーザー定義(例)表示イメージ用途
yyyy/m/d h:mm2025/7/3 8:00最も一般的。秒不要ならこれ
yyyy/mm/dd hh:mm:ss2025/07/03 08:00:00ログや監査で秒まで必要
m/d (aaa) h:mm7/3 (木) 8:00日本語で曜日も見たい
mmmm d, yyyy h:mm AM/PMJuly 3, 2025 8:00 AM英語表記の資料向け

ここで重要なのが、TEXT(...)で表示を作らないことです。TEXT関数は結果が文字列になりやすく、並べ替えや日数計算、ピボット集計で思わぬ不具合が出ます。「値は日時、見た目は書式」という分担にしておくと、後工程で困りません。

縦に並んだデータを一括変換する(下方向にフィル)

ISO文字列がA列に縦並び(A1:A1000など)しているなら、変換はB列に式を入れて下までコピーすれば完了です。

  1. B1に次の式を入力します。
    =DATEVALUE(LEFT(A1,10)) + TIMEVALUE(MID(A1,12,8))
  2. B1セル右下の小さな■(フィルハンドル)を下へドラッグします。
  3. 参照がA2、A3…と自動でずれて、同じ行の値が順番に変換されます。

行数が多い場合は、ドラッグよりも次の方法が速いです。

  • ダブルクリック:B1のフィルハンドルをダブルクリックすると、隣接列(A列)のデータがある範囲まで自動で下へコピーされます。
  • テーブル化(Ctrl+T):A列のデータ範囲をテーブルにすると、B列に式を入れた瞬間に列全体へ自動適用されます(繰り返し更新にも強い)。

一括変換の作業手順を表で整理

やりたいこと操作コツ
式を下までコピーフィルハンドルをドラッグ範囲が短いときに確実
大量行に一気に適用フィルハンドルをダブルクリックA列が途切れない前提で高速
今後も追加されるデータに自動対応テーブル化(Ctrl+T)→列に式更新が多い運用に向く
結果を固定値にしたいB列をコピー→値貼り付け外部データを切り離せる

DATEVALUE/TIMEVALUEが不安なら:地域設定に左右されにくい“堅い式”

DATEVALUEやTIMEVALUEは便利ですが、環境によっては日付文字列の解釈が揺れることがあります(特にインポート元の書式が混在している場合)。より確実にしたいなら、年・月・日、時・分・秒を数値として抜き出してDATE/TIMEで組み立てる方法が堅牢です。

=DATE(VALUE(LEFT(A1,4)), VALUE(MID(A1,6,2)), VALUE(MID(A1,9,2)))
 + TIME(VALUE(MID(A1,12,2)), VALUE(MID(A1,15,2)), VALUE(MID(A1,18,2)))

この式は、日付の区切り記号が-であっても、Excelのロケールに左右されにくいのがメリットです。データの品質に自信がないとき(空白や余計な文字が混ざりやすいとき)は、こちらの式を基本形にしておくと安心です。

よくあるつまずきと対処法

ISO文字列は一見規則的に見えても、現場データでは細部が揺れがちです。代表的なエラーと、実務での回避策を整理します。

先頭や末尾に空白がある(TRIMで除去)

CSVやコピー貼り付けで、見えない空白が混ざっていると変換に失敗します。まずはTRIMをかませると安定します。

=DATEVALUE(LEFT(TRIM(A1),10)) + TIMEVALUE(MID(TRIM(A1),12,8))

引用符(”…”)付きで入っている(SUBSTITUTEで除去)

JSON由来や一部のCSVでは、セル内が"2025-07-03T08:00:00.000-04:00"のようにダブルクォート付きになることがあります。

=LET(s, SUBSTITUTE(TRIM(A1),CHAR(34),""), DATEVALUE(LEFT(s,10)) + TIMEVALUE(MID(s,12,8)))

空セルや不正値が混ざる(IFERRORで運用を止めない)

途中に空欄が混ざるのが普通、という運用なら、エラーを空欄にしておくと下流の集計が楽になります。

=IFERROR(DATEVALUE(LEFT(A1,10)) + TIMEVALUE(MID(A1,12,8)), "")

ミリ秒の桁数が一定でない(“秒まで”を固定で切り出す)

ミリ秒が.0や.000000などブレても、今回の基本式は時刻部分をhh:mm:ssの8文字で固定取得するため、影響を受けにくいのが利点です。逆に、秒までの8文字が必ず存在することが前提なので、08:00のように秒が省略されるデータが混ざる場合は、入力側の正規化(秒を付与)か、別の取り出し方を検討します。

タイムゾーン(-04:00)も考慮して時刻を補正したい場合

ここまでの方法は「見た目を整える」「Excelで扱える日時にする」ことを目的に、タイムゾーンを無視していました。しかし、次のようなケースでは、オフセットを反映した“時刻のずれ補正”が必要です。

  • ログが複数地域(UTC-4、UTC+1など)から集まり、同じ時間軸で並べたい
  • ISO文字列がUTC基準で必要(監査、突合、API連携)
  • 日本時間(UTC+9)へ統一してレポートしたい

まず押さえるポイントは、ISO 8601の表記は「ローカル時刻 + UTCオフセット」だということです。たとえば08:00:00-04:00は「UTCより4時間遅い地域の08:00」を表します。よって、UTCに直すならローカル時刻からオフセット分を差し引く(オフセットがマイナスなら結果的に足す)計算になります。

実例:同じ文字列を“無視/UTC/JST”で比べる

例として2025-07-03T08:00:00.000-04:00を扱うと、次のように意味が変わります。どれが正しいかは「何のために変換するか」で決まるため、最初にゴール(表示だけ/UTC統一/JST統一)を確定するのが重要です。

扱い方Excel上の結果(例)意味
オフセット無視(見た目重視)2025/7/3 8:00文字列に書かれたローカル時刻をそのまま表示
UTCに変換2025/7/3 12:00ローカル(UTC-4)をUTCへ統一(+4時間)
日本時間(JST)に変換2025/7/3 21:00UTCへ直した上でUTC+9へ(さらに+9時間)

オフセットを固定で末尾6文字(±hh:mm)としてパースする

多くのデータは末尾が必ず±hh:mmなので、まずは「末尾6文字を取り出す」方法が扱いやすいです。A1にISO文字列があるとして、次の式でUTCに変換できます(小数秒の有無は問わず、末尾6文字がオフセットである前提)。

=LET(
  s, TRIM(A1),
  localDT, DATE(VALUE(LEFT(s,4)),VALUE(MID(s,6,2)),VALUE(MID(s,9,2))) + TIME(VALUE(MID(s,12,2)),VALUE(MID(s,15,2)),VALUE(MID(s,18,2))),
  tz, RIGHT(s,6),
  sign, IF(LEFT(tz,1)="+", 1, -1),
  h, VALUE(MID(tz,2,2)),
  m, VALUE(RIGHT(tz,2)),
  offset, sign*(h/24 + m/1440),
  localDT - offset
)

この式の最後のlocalDT - offsetがポイントです。-04:00ならoffsetは-4/24なので、引くと+4/24になり、UTCが得られます。

日本時間(JST, UTC+9)へ変換する

UTCが作れたら、JSTは単純に9時間足すだけです。

=LET(
  s, TRIM(A1),
  localDT, DATE(VALUE(LEFT(s,4)),VALUE(MID(s,6,2)),VALUE(MID(s,9,2))) + TIME(VALUE(MID(s,12,2)),VALUE(MID(s,15,2)),VALUE(MID(s,18,2))),
  tz, RIGHT(s,6),
  sign, IF(LEFT(tz,1)="+", 1, -1),
  h, VALUE(MID(tz,2,2)),
  m, VALUE(RIGHT(tz,2)),
  offset, sign*(h/24 + m/1440),
  (localDT - offset) + 9/24
)

表示形式をyyyy/m/d h:mmなどにすれば、日本時間の“普通の日時”として扱えます。

Z(UTC)表記が混ざる場合の考え方

データによっては末尾がZ(UTC)になり、±hh:mmが存在しないケースがあります。混在する場合は、次のように「末尾がZならoffset=0、そうでなければ末尾6文字を読む」という分岐を作ります(設計例)。

=LET(
  s, TRIM(A1),
  localDT, DATE(VALUE(LEFT(s,4)),VALUE(MID(s,6,2)),VALUE(MID(s,9,2))) + TIME(VALUE(MID(s,12,2)),VALUE(MID(s,15,2)),VALUE(MID(s,18,2))),
  hasZ, RIGHT(s,1)="Z",
  tz, IF(hasZ, "+00:00", RIGHT(s,6)),
  sign, IF(LEFT(tz,1)="+", 1, -1),
  h, VALUE(MID(tz,2,2)),
  m, VALUE(RIGHT(tz,2)),
  offset, sign*(h/24 + m/1440),
  localDT - offset
)

なお、末尾がZのISO文字列は「ローカル時刻」ではなく「UTC時刻」そのものなので、変換式の設計でローカルDTという名前を使うと混乱しがちです。実務では、列名をsource_dt(元の時刻)・utc_dt(UTC統一)など、意味がぶれない命名にしておくと事故が減ります。

タイムゾーン補正で注意したいこと

  • オフセットは「地域名」ではない:-04:00が常に同じ地域とは限りません。夏時間(DST)によって同じ地域でも季節でオフセットが変わることがあります。
  • 入力がすでにDSTを反映している前提:ISO文字列に付くオフセットは、その時点のオフセットです。式はそのオフセットをそのまま使うので、結果の“時刻補正”は整合しやすい一方、地域名ベースの変換(例:America/New_York)とは別物です。
  • 分析の目的を固定する:表示のための変換なのか、時系列の整合が必要なのかで、正解が変わります。

Microsoft 365なら、TEXTBEFORE/TEXTAFTERでさらに壊れにくくできる

ISO文字列のパターンが複数ある場合(小数秒があったりなかったり、末尾がZだったり、オフセットがついたり)、固定位置のMIDだけだとメンテが面倒になることがあります。Microsoft 365の環境で使える場合は、TEXTBEFORE/TEXTAFTERで区切り記号ベースにすると頑丈です。

例:2025-07-03T08:00:00.000-04:00から「日付」と「時刻(秒まで)」を取り出して日時化する。

=LET(
  s, TRIM(A1),
  d, TEXTBEFORE(s,"T"),
  t0, TEXTAFTER(s,"T"),
  t, LEFT(t0,8),
  DATE(VALUE(LEFT(d,4)),VALUE(MID(d,6,2)),VALUE(MID(d,9,2))) + TIME(VALUE(LEFT(t,2)),VALUE(MID(t,4,2)),VALUE(MID(t,7,2)))
)

この形にしておくと、ミリ秒やオフセット部分がどう変わっても、Tの後ろの先頭8文字が時刻という前提さえ守られていれば崩れにくくなります。

Power Queryでの別解:ISO 8601を“列の型”として扱って変換する

データが大量で毎回更新される、複数ファイルを取り込む、加工ステップを再現可能にしたい――こうした要件があるなら、セル関数よりもPower Query(データの取得と変換)が向いています。Power Queryはテキストを「変換手順」として保持できるため、更新ボタン一つで再実行できます。

手順のイメージ(テーブルから取り込む場合)

  1. A列を含む範囲を選択してテーブル化(Ctrl+T)
  2. データタブ→テーブルまたは範囲からでPower Queryを開く
  3. 対象列を選択し、必要に応じて「型の変更」「列の分割」「カスタム列」を追加
  4. 閉じて読み込むでExcelに戻す

M言語で明示的に変換する例

Power Queryでは、ISO 8601を日時(タイムゾーン付き)として解釈できる場合があります。解釈の揺れを減らすため、カスタム列で明示的に変換するのが実務的です。

= DateTimeZone.FromText([iso_text])

さらに、「タイムゾーンを無視して見やすい日時にしたい」なら、タイムゾーン情報を落として日時にします。

= DateTime.From(DateTimeZone.FromText([iso_text]))

UTCへ寄せたい場合は、DateTimeZoneのまま0へスイッチしてから日時へ落とす、といった作りにもできます(設計例)。

= DateTime.From(DateTimeZone.SwitchZone(DateTimeZone.FromText([iso_text]), 0))

セル関数よりも「変換ルールをチームで共有しやすい」のが、Power Queryの大きな利点です。列名を「raw_iso」「utc_dt」「jst_dt」のように役割で分けておくと、後から見直したときも迷いません。

繰り返し使うなら:LAMBDAで“自作関数”にして事故を減らす

毎回同じ式をコピペする運用は、微妙な式の違いが生まれてトラブルになりがちです。Microsoft 365環境なら、LAMBDAでISO→日時変換を関数化しておくと、ブレが減ります。

名前の管理で関数を登録する

  1. 数式タブ→名前の管理→新規
  2. 名前:例 ISOtoDT
  3. 参照範囲に次を登録
=LAMBDA(s, DATE(VALUE(LEFT(s,4)),VALUE(MID(s,6,2)),VALUE(MID(s,9,2))) + TIME(VALUE(MID(s,12,2)),VALUE(MID(s,15,2)),VALUE(MID(s,18,2))))

以後はセルで=ISOtoDT(A1)のように使えるため、可読性が上がり、保守もしやすくなります。必要ならTRIMやIFERRORを組み込んだ“現場向けの堅い関数”として育てるのもおすすめです。

実務で失敗しないためのチェックリスト

最後に、ISO 8601の日時をExcelで扱うときに、現場で効くポイントを短くまとめます。

チェック項目おすすめ理由
結果を計算・集計に使うか日時の“値”に変換して書式で表示文字列化(TEXT)を避ける
大量行・更新ありかテーブル化 or Power Query自動適用・再実行が楽
オフセットを反映する必要があるか要件を先に決める(UTC/JST/見た目のみ)目的次第で式が変わる
データの揺れ(空白、引用符、Zなど)があるかTRIM、SUBSTITUTE、IFERROR、TEXTBEFORE等を併用変換エラーを減らす

まとめ:最短ルートと、次の一手

  • まずはタイムゾーンを無視して見やすくするなら:
    =DATEVALUE(LEFT(A1,10)) + TIMEVALUE(MID(A1,12,8)) → 表示形式で整える
  • 縦に並んだデータは:隣列に式→フィル(ドラッグ/ダブルクリック/テーブル化)で一括変換
  • 時刻補正が必要なら:オフセットをパースしてUTC/JSTへ寄せる(localDT - offsetが基本)
  • 更新や大量処理なら:Power Queryで変換手順を固定し、再現性を高める

ISO 8601はデータ連携では標準的ですが、Excelでは「文字列→日時(数値)」に直して初めて真価を発揮します。まずは基本式で“扱える日時”にし、必要に応じてタイムゾーン補正やPower Queryへ拡張していくのが、遠回りしない実務ルートです。

この記事を書いた人

実務の現場で詰まりがちなポイントを地図にするITブログ「IT trip」を運営。Windows/Office(Teams・Excel)からSQL、サーバ運用、ガジェットまで、再現性のある手順と“なぜそうなるか”を丁寧に解説します。読んだらすぐ試せること、そして迷った人の次の一歩が見えることを大切にしています。

コメント

コメントする

目次