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:00 | UTCオフセット | 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:mm | 2025/7/3 8:00 | 最も一般的。秒不要ならこれ |
yyyy/mm/dd hh:mm:ss | 2025/07/03 08:00:00 | ログや監査で秒まで必要 |
m/d (aaa) h:mm | 7/3 (木) 8:00 | 日本語で曜日も見たい |
mmmm d, yyyy h:mm AM/PM | July 3, 2025 8:00 AM | 英語表記の資料向け |
ここで重要なのが、TEXT(...)で表示を作らないことです。TEXT関数は結果が文字列になりやすく、並べ替えや日数計算、ピボット集計で思わぬ不具合が出ます。「値は日時、見た目は書式」という分担にしておくと、後工程で困りません。
縦に並んだデータを一括変換する(下方向にフィル)
ISO文字列がA列に縦並び(A1:A1000など)しているなら、変換はB列に式を入れて下までコピーすれば完了です。
- B1に次の式を入力します。
=DATEVALUE(LEFT(A1,10)) + TIMEVALUE(MID(A1,12,8)) - B1セル右下の小さな■(フィルハンドル)を下へドラッグします。
- 参照が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:00 | UTCへ直した上で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はテキストを「変換手順」として保持できるため、更新ボタン一つで再実行できます。
手順のイメージ(テーブルから取り込む場合)
- A列を含む範囲を選択してテーブル化(Ctrl+T)
- データタブ→テーブルまたは範囲からでPower Queryを開く
- 対象列を選択し、必要に応じて「型の変更」「列の分割」「カスタム列」を追加
- 閉じて読み込むで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→日時変換を関数化しておくと、ブレが減ります。
名前の管理で関数を登録する
- 数式タブ→名前の管理→新規
- 名前:例
ISOtoDT - 参照範囲に次を登録
=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へ拡張していくのが、遠回りしない実務ルートです。

コメント