🕐
[Flutter]DateTime型を用いた時間の扱い方チートシート
事前知識
タイムゾーン:JST/UTC
地球上で同一の標準時を採用している地域の集合のこと。
DateTime型は日本標準時(JST)と協定世界時(UTC)の両方を扱うことができるためどちらの形式で格納されているかに注意する。
DateTime.now()で取得できるのはJST。
ISO8601とは
ISOで定められた日付と時間の表記に関する国際規格
- 日付と時刻を「T」で区切る
- UTCは秒の後に「Z」を付ける
- UTC以外は秒の後に「+-時間」を付ける
例
UTC:2025-10-17T05:00:00Z
JST:2025-10-17T14:00:00+09:00
DateFormatの使い方
pubspec.yamlに追記
DateFormatを使うためにはpubspec.yamlのdependenciesに以下のようにintlを追加する(バージョンは最新のものを指定する)
intl: ^0.20.0
パターン文字に含まれる文字をパターン文字としてではなく文字として使いたい場合
外側に「"(ダブルクォート)」を使い、文字列として出力したい部分を「'(シングルクォート)」で囲む。逆に「'」を外側「"」を内側に使うのは不可。
例
-
DateFormat('yearはyyyyだよ')
→2025ePMrは2025だよ(yが「年」、aが「午前/午後」に変換されてしまっている) -
DateFormat("'year'はyyyyだよ")
→yearは2025だよ
パターン文字一覧
| パターン | 意味 | 例 |
|---|---|---|
| y | 年(最小桁数) |
2025, 999
|
| yy | 西暦下2桁 | 25 |
| yyyy | 西暦4桁 | 2025 |
| M | 月(最小桁数) |
9, |
| MM | 月(2桁) | 09 |
| MMM | 月(短縮名) | Oct |
| MMMM | 月(フル名) | October |
| d | 日(最小桁数) | 1 |
| dd | 日(2桁) | 01 |
| E | 曜日(短縮) | Sat |
| EEEE | 曜日(フル) | Saturday |
| EEEEE | 曜日(最短) |
S(ロケールによる) |
| H | 時(24時間制、最小桁数) |
1, |
| HH | 時(24時間制、2桁) | 01 |
| h | 時(12時間制、最小桁数) | 1 |
| hh | 時(12時間制、2桁) | 01 |
| m | 分(最小桁数) | 1 |
| mm | 分(2桁) | 01 |
| s | 秒(最小桁数) | 1 |
| ss | 秒(2桁) | 01 |
| S, SS, SSS | ミリ秒(1〜3桁) | 123 |
| a | 午前/午後 | PM |
| z | タイムゾーン略称 |
GMT+9orJST(環境依存) |
| Z | タイムゾーンオフセット | +0900 |
| ZZZZ | タイムゾーン名(フル) | Japan Standard Time |
| Q | 四半期(数字のみ) | 4 |
| QQQ | 四半期(短縮) | Q4 |
| QQQQ | 四半期(フル) | 4th quarter |
テンプレート
任意の形式にフォーマット
DateTime now = DateTime.now();
DateFormat outputFormat = DateFormat('yyyy年MM月dd日 HH:mm');
String date = outputFormat.format(now);
debugPrint(date);
// 出力:2025年10月19日 10:25
任意の日時を取得
DateTime now = DateTime(2025, 10, 20, 12, 01, 02);
debugPrint(now.toIso8601String());
// 出力:2025-10-20T12:01:02.000
時間を足し引きして未来/過去の日時にする
DateTime now = DateTime.now();
DateTime future = now.add(Duration(days: 1, hours: 1, minutes: 1, seconds: 1));
DateTime past = now.subtract(Duration(days: 1, hours: 1, minutes: 1, seconds: 1));
debugPrint(now.toString());
// 出力:2025-10-20 21:55:16.657286
debugPrint(future.toString());
// 出力:2025-10-21 22:56:17.657286
debugPrint(past.toString());
// 出力:2025-10-19 20:54:15.657286
UTC/JSTへの変換
DateTime now = DateTime.now();
DateTime nowUtc = now.toUtc();
DateTime nowJst = nowUtc.toLocal();
debugPrint(now.toIso8601String());
// 出力:2025-10-20T22:02:57.946454
debugPrint(nowUtc.toIso8601String());
// 出力:2025-10-20T13:02:57.946454Z
debugPrint(nowJst.toIso8601String());
// 出力:2025-10-20T22:02:57.946454
Discussion