「ログファイルに日時を記録したいけど、フォーマット指定の書き方がわからない」
「YYYY-MM-DD形式とMM/DD/YYYY形式、どちらを使うべき?」
日時のフォーマット指定は、プログラミング、システム開発、データ処理、文書作成など、あらゆる場面で必要になる重要なスキルです。
しかし、言語やツールによって記法が異なるため、混乱しやすいのも事実です。
この記事では、日時フォーマット指定の基礎から実践までを体系的に解説し、主要プログラミング言語での実装例、国際化対応、よくあるトラブルの解決方法まで包括的にカバーします。
日時フォーマットの基礎知識
日時フォーマットとは
日時フォーマットとは、コンピューター内部で管理されている日時データを、人間が読みやすい形式や特定の規則に従った形式で表示・保存するためのルール体系です。
なぜフォーマット指定が重要なのか
データの一貫性確保
- 同じシステム内で統一された日時表記
- データベースでの検索・ソート処理の効率化
- ファイル名の規則的な命名
国際化対応
- 異なる地域のユーザーに適した表示
- タイムゾーンを考慮した時刻表示
- 多言語環境での日時処理
システム間連携
- API通信での標準的な日時フォーマット
- ログファイルの解析・処理
- データ移行時の形式統一
基本的な表記パターン
同じ日時(2025年5月20日 午後2時30分45秒)の様々な表記例:
ISO 8601標準: 2025-05-20T14:30:45Z
日本式: 2025年5月20日 14時30分45秒
アメリカ式: 05/20/2025 2:30:45 PM
ヨーロッパ式: 20/05/2025 14:30:45
ファイル名用: 20250520_143045
SQL DATETIME: 2025-05-20 14:30:45
RFC 2822: Mon, 20 May 2025 14:30:45 +0900
UNIX Timestamp: 1747712245
標準的なフォーマット記号一覧
基本的な記号体系
多くのシステムで共通して使用される記号パターン:
カテゴリ | 記号 | 意味 | 例 | 備考 |
---|---|---|---|---|
年 | YYYY , yyyy | 年(4桁) | 2025 | 標準的な年表記 |
YY , yy | 年(2桁) | 25 | 2000年問題に注意 | |
月 | MM | 月(2桁ゼロ埋め) | 05, 12 | 01-12 |
M | 月(1-2桁) | 5, 12 | 1-12 | |
MMM | 月名略称 | Jan, May | 英語環境 | |
MMMM | 月名完全形 | January, May | 英語環境 | |
日 | DD , dd | 日(2桁ゼロ埋め) | 09, 20 | 01-31 |
D , d | 日(1-2桁) | 9, 20 | 1-31 | |
時間 | HH | 時(24時間制、2桁) | 00, 14, 23 | 00-23 |
H | 時(24時間制、1-2桁) | 0, 14, 23 | 0-23 | |
hh | 時(12時間制、2桁) | 01, 02, 12 | 01-12 | |
h | 時(12時間制、1-2桁) | 1, 2, 12 | 1-12 | |
分・秒 | mm | 分(2桁ゼロ埋め) | 07, 30, 59 | 00-59 |
m | 分(1-2桁) | 7, 30, 59 | 0-59 | |
ss | 秒(2桁ゼロ埋め) | 05, 45, 59 | 00-59 | |
s | 秒(1-2桁) | 5, 45, 59 | 0-59 | |
その他 | AM/PM , a | 午前/午後指示子 | AM, PM | 12時間制で使用 |
Z | UTC指示子 | Z | ISO 8601準拠 | |
±HHMM | タイムゾーンオフセット | +0900, -0500 | UTC からの差 |
特殊な記号・拡張記号
記号 | 意味 | 例 | 使用場面 |
---|---|---|---|
SSS , fff | ミリ秒 | 123, 456 | 高精度時刻 |
EEEE | 曜日名(完全形) | Monday, Tuesday | 英語環境 |
EEE | 曜日名(略称) | Mon, Tue | 英語環境 |
w | 年内での週番号 | 21 | ISO週番号 |
DDD | 年内での日番号 | 140 | 1-366 |
プログラミング言語別実装ガイド
Python
Pythonでは主にdatetime
モジュールのstrftime()
とstrptime()
を使用します。
基本的な使用方法
from datetime import datetime, timezone
import locale
# 現在時刻の取得
now = datetime.now()
# 基本的なフォーマット
print(now.strftime("%Y-%m-%d")) # 2025-05-20
print(now.strftime("%Y/%m/%d %H:%M:%S")) # 2025/05/20 14:30:45
print(now.strftime("%B %d, %Y")) # May 20, 2025
# 日本語ロケールでの表示
locale.setlocale(locale.LC_TIME, 'ja_JP.UTF-8')
print(now.strftime("%Y年%m月%d日")) # 2025年05月20日
print(now.strftime("%A")) # 火曜日
# 文字列から日時オブジェクトへの変換
date_string = "2025-05-20 14:30:45"
parsed_date = datetime.strptime(date_string, "%Y-%m-%d %H:%M:%S")
Pythonの主要フォーマット記号
# Pythonの strftime フォーマット記号
formats = {
"%Y": "年(4桁)", # 2025
"%y": "年(2桁)", # 25
"%m": "月(2桁)", # 05
"%B": "月名(完全)", # May
"%b": "月名(略称)", # May
"%d": "日(2桁)", # 20
"%H": "時(24時間)", # 14
"%I": "時(12時間)", # 02
"%M": "分", # 30
"%S": "秒", # 45
"%p": "AM/PM", # PM
"%A": "曜日(完全)", # Tuesday
"%a": "曜日(略称)", # Tue
"%j": "年内日数", # 140
"%U": "年内週数", # 20
"%Z": "タイムゾーン", # JST
}
# 実用例
now = datetime.now()
for code, desc in formats.items():
print(f"{code:4} ({desc:8}): {now.strftime(code)}")
タイムゾーン対応
from datetime import datetime, timezone, timedelta
# UTC時刻
utc_now = datetime.now(timezone.utc)
print(utc_now.strftime("%Y-%m-%d %H:%M:%S %Z")) # 2025-05-20 05:30:45 UTC
# 日本時間(JST)
jst = timezone(timedelta(hours=9))
jst_now = datetime.now(jst)
print(jst_now.strftime("%Y-%m-%d %H:%M:%S %z")) # 2025-05-20 14:30:45 +0900
# ISO 8601フォーマット
print(jst_now.isoformat()) # 2025-05-20T14:30:45+09:00
JavaScript
JavaScriptでは組み込みのDate
オブジェクトとIntl.DateTimeFormat
、またはライブラリを使用します。
基本的な使用方法
// 現在時刻の取得
const now = new Date();
// 基本的なメソッド
console.log(now.toISOString()); // 2025-05-20T05:30:45.123Z
console.log(now.toDateString()); // Tue May 20 2025
console.log(now.toTimeString()); // 14:30:45 GMT+0900 (JST)
console.log(now.toLocaleString()); // 2025/5/20 14:30:45
// ロケール指定でのフォーマット
console.log(now.toLocaleString('ja-JP')); // 2025/5/20 14:30:45
console.log(now.toLocaleString('en-US')); // 5/20/2025, 2:30:45 PM
console.log(now.toLocaleString('de-DE')); // 20.5.2025, 14:30:45
Intl.DateTimeFormatを使用した高度なフォーマット
const now = new Date();
// 詳細なフォーマット指定
const formatter = new Intl.DateTimeFormat('ja-JP', {
year: 'numeric',
month: '2-digit',
day: '2-digit',
hour: '2-digit',
minute: '2-digit',
second: '2-digit',
timeZone: 'Asia/Tokyo'
});
console.log(formatter.format(now)); // 2025/05/20 14:30:45
// より詳細なオプション
const detailedFormatter = new Intl.DateTimeFormat('en-US', {
weekday: 'long',
year: 'numeric',
month: 'long',
day: 'numeric',
hour: '2-digit',
minute: '2-digit',
timeZoneName: 'short'
});
console.log(detailedFormatter.format(now)); // Tuesday, May 20, 2025 at 02:30 PM JST
Day.jsライブラリを使用した例
// Day.js を使用(CDNまたはnpm install dayjs)
const dayjs = require('dayjs');
const now = dayjs();
console.log(now.format('YYYY-MM-DD')); // 2025-05-20
console.log(now.format('YYYY/MM/DD HH:mm:ss')); // 2025/05/20 14:30:45
console.log(now.format('MMMM DD, YYYY')); // May 20, 2025
console.log(now.format('dddd')); // Tuesday
// 文字列からの解析
const parsed = dayjs('2025-05-20 14:30:45');
console.log(parsed.format('YYYY年MM月DD日')); // 2025年05月20日
Java
Javaではjava.time
パッケージ(Java 8以降)または従来のSimpleDateFormat
を使用します。
java.time パッケージ(推奨)
import java.time.*;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DateTimeFormatExample {
public static void main(String[] args) {
// 現在時刻の取得
LocalDateTime now = LocalDateTime.now();
ZonedDateTime zonedNow = ZonedDateTime.now();
// 基本的なフォーマット
DateTimeFormatter formatter1 = DateTimeFormatter.ofPattern("yyyy-MM-dd");
System.out.println(now.format(formatter1)); // 2025-05-20
DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyy/MM/dd HH:mm:ss");
System.out.println(now.format(formatter2)); // 2025/05/20 14:30:45
// ロケール指定
DateTimeFormatter jpFormatter = DateTimeFormatter.ofPattern("yyyy年MM月dd日", Locale.JAPANESE);
System.out.println(now.format(jpFormatter)); // 2025年05月20日
// ISO形式
System.out.println(zonedNow.format(DateTimeFormatter.ISO_ZONED_DATE_TIME));
// 2025-05-20T14:30:45.123+09:00[Asia/Tokyo]
// 文字列から日時への変換
String dateString = "2025-05-20 14:30:45";
LocalDateTime parsed = LocalDateTime.parse(dateString,
DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss"));
}
}
SimpleDateFormat(レガシー)
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Locale;
public class SimpleDateFormatExample {
public static void main(String[] args) {
Date now = new Date();
// 基本的なフォーマット
SimpleDateFormat sdf1 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
System.out.println(sdf1.format(now)); // 2025-05-20 14:30:45
// 日本語ロケール
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy年MM月dd日 EEEE", Locale.JAPANESE);
System.out.println(sdf2.format(now)); // 2025年05月20日 火曜日
// アメリカ形式
SimpleDateFormat sdf3 = new SimpleDateFormat("MM/dd/yyyy hh:mm:ss a", Locale.US);
System.out.println(sdf3.format(now)); // 05/20/2025 02:30:45 PM
}
}
PHP
PHPではdate()
関数、DateTime
クラス、DateTimeImmutable
クラスを使用します。
基本的な使用方法
<?php
// 現在時刻でのフォーマット
echo date('Y-m-d'); // 2025-05-20
echo date('Y/m/d H:i:s'); // 2025/05/20 14:30:45
echo date('F j, Y'); // May 20, 2025
echo date('l, F j, Y'); // Tuesday, May 20, 2025
// DateTimeクラスの使用
$now = new DateTime();
echo $now->format('Y-m-d H:i:s'); // 2025-05-20 14:30:45
// タイムゾーンの指定
$tokyo = new DateTime('now', new DateTimeZone('Asia/Tokyo'));
echo $tokyo->format('Y-m-d H:i:s P'); // 2025-05-20 14:30:45 +09:00
// 文字列からの変換
$date = DateTime::createFromFormat('Y-m-d H:i:s', '2025-05-20 14:30:45');
echo $date->format('F j, Y'); // May 20, 2025
// 日本語での表示(ロケール設定が必要)
setlocale(LC_TIME, 'ja_JP.UTF-8');
echo strftime('%Y年%m月%d日'); // 2025年05月20日
?>
PHPの主要フォーマット文字
<?php
$formats = [
'Y' => '年(4桁)', // 2025
'y' => '年(2桁)', // 25
'm' => '月(2桁)', // 05
'n' => '月(1-2桁)', // 5
'F' => '月名(完全)', // May
'M' => '月名(略称)', // May
'd' => '日(2桁)', // 20
'j' => '日(1-2桁)', // 20
'H' => '時(24時間)', // 14
'h' => '時(12時間)', // 02
'i' => '分', // 30
's' => '秒', // 45
'A' => 'AM/PM(大)', // PM
'a' => 'am/pm(小)', // pm
'l' => '曜日(完全)', // Tuesday
'D' => '曜日(略称)', // Tue
'P' => 'タイムゾーン', // +09:00
];
$now = new DateTime();
foreach ($formats as $code => $desc) {
printf("%s (%s): %s\n", $code, $desc, $now->format($code));
}
?>
C#
C#ではDateTime
構造体とToString()
メソッド、またはDateTimeOffset
を使用します。
基本的な使用方法
using System;
using System.Globalization;
class Program
{
static void Main()
{
DateTime now = DateTime.Now;
// 基本的なフォーマット
Console.WriteLine(now.ToString("yyyy-MM-dd")); // 2025-05-20
Console.WriteLine(now.ToString("yyyy/MM/dd HH:mm:ss")); // 2025/05/20 14:30:45
Console.WriteLine(now.ToString("MMMM dd, yyyy")); // May 20, 2025
// 標準フォーマット文字列
Console.WriteLine(now.ToString("d")); // 2025/05/20 (短い日付)
Console.WriteLine(now.ToString("D")); // 2025年5月20日 (長い日付)
Console.WriteLine(now.ToString("f")); // 2025年5月20日 14:30 (完全)
Console.WriteLine(now.ToString("F")); // 2025年5月20日 14:30:45 (完全)
// カルチャ指定
CultureInfo japanese = new CultureInfo("ja-JP");
Console.WriteLine(now.ToString("yyyy年MM月dd日", japanese)); // 2025年05月20日
CultureInfo english = new CultureInfo("en-US");
Console.WriteLine(now.ToString("MMMM dd, yyyy", english)); // May 20, 2025
// ISO 8601形式
Console.WriteLine(now.ToString("yyyy-MM-ddTHH:mm:ss.fffZ")); // 2025-05-20T14:30:45.123Z
// DateTimeOffsetの使用(タイムゾーン対応)
DateTimeOffset offsetNow = DateTimeOffset.Now;
Console.WriteLine(offsetNow.ToString("yyyy-MM-dd HH:mm:ss zzz")); // 2025-05-20 14:30:45 +09:00
}
}
アプリケーション・ツール別設定方法
Microsoft Excel
Excelでは「セルの書式設定」から日時フォーマットを指定できます。
基本的な設定方法
- 対象セルを選択
- 右クリック → 「セルの書式設定」
- 「表示形式」タブ → 「日付」もしくは「時刻」の形式
- 書式コードを入力
Excelの書式コード例
yyyy/mm/dd → 2025/05/20
yyyy"年"m"月"d"日" → 2025年5月20日
mm/dd/yyyy → 05/20/2025
dd-mmm-yyyy → 20-May-2025
yyyy/mm/dd hh:mm:ss → 2025/05/20 14:30:45
hh:mm AM/PM → 02:30 PM
[h]:mm:ss → 時間の積算表示
高度な書式設定
# 条件付き書式
[>100]"高";"低" # 100より大きい場合「高」、そうでなければ「低」
[赤]yyyy/mm/dd;[青]yyyy/mm/dd # 正数は赤、負数は青で表示
# 曜日付き日付
yyyy/mm/dd"("aaa")" # 2025/05/20(火)
yyyy/mm/dd"("aaaa")" # 2025/05/20(火曜日)
# 和暦
ggge"年"m"月"d"日" # 令和7年5月20日
データベース(SQL)
MySQL
-- 現在時刻のフォーマット
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:%s'); -- 2025-05-20 14:30:45
SELECT DATE_FORMAT(NOW(), '%Y年%m月%d日'); -- 2025年05月20日
-- テーブルデータのフォーマット
SELECT DATE_FORMAT(created_at, '%Y/%m/%d') as formatted_date
FROM users;
PostgreSQL
-- 現在時刻のフォーマット
SELECT TO_CHAR(NOW(), 'YYYY-MM-DD HH24:MI:SS'); -- 2025-05-20 14:30:45
SELECT TO_CHAR(NOW(), 'YYYY"年"MM"月"DD"日"'); -- 2025年05月20日
-- テーブルデータのフォーマット
SELECT TO_CHAR(created_at, 'YYYY/MM/DD') as formatted_date
FROM users;
SQLServer
-- 現在時刻のフォーマット
SELECT FORMAT(GETDATE(), 'yyyy-MM-dd HH:mm:ss'); -- 2025-05-20 14:30:45
SELECT FORMAT(GETDATE(), 'yyyy年MM月dd日'); -- 2025年05月20日
-- CONVERT関数の使用
SELECT CONVERT(VARCHAR, GETDATE(), 120); -- 2025-05-20 14:30:45 (ISO形式)
Linuxコマンドライン
dateコマンド
# 基本的な使用方法
date # Tue May 20 14:30:45 JST 2025
date '+%Y-%m-%d' # 2025-05-20
date '+%Y/%m/%d %H:%M:%S' # 2025/05/20 14:30:45
date '+%Y年%m月%d日' # 2025年05月20日
# 特定の時刻の指定
date -d '2025-05-20 14:30:45' '+%Y年%m月%d日 %H時%M分' # 2025年05月20日 14時30分
# ファイル名用のフォーマット
date '+%Y%m%d_%H%M%S' # 20250520_143045
# ログ用のフォーマット
date '+[%Y-%m-%d %H:%M:%S]' # [2025-05-20 14:30:45]
国際化と地域化の考慮事項
地域別の日付表記習慣
主要地域の標準的な日付フォーマット
地域 | 日付順序 | 区切り文字 | 例 | 特徴 |
---|---|---|---|---|
日本 | 年/月/日 | / もしくは - | 2025/05/20 | 年から順に大きい単位 |
アメリカ | 月/日/年 | / | 05/20/2025 | 月が最初 |
ヨーロッパ | 日/月/年 | / もしくは . | 20/05/2025 | 日が最初 |
中国 | 年-月-日 | - | 2025-05-20 | ISO準拠 |
インド | 日-月-年 | - もしくは / | 20-05-2025 | イギリス式準拠 |
ISO 8601国際標準
ISO 8601は国際標準化機構が定めた日時表記の国際標準です。
基本形式
日付: 2025-05-20
時刻: 14:30:45
日時: 2025-05-20T14:30:45
タイムゾーン付き: 2025-05-20T14:30:45+09:00
UTC時刻: 2025-05-20T05:30:45Z
週単位: 2025-W21 (2025年第21週)
年間日数: 2025-140 (2025年の140日目)
ISO 8601使用のメリット
- グローバルで統一された表記
- 文字列として辞書順ソートが可能
- データベースでの標準的な形式
- APIでの標準的な日時交換形式
タイムゾーンの考慮
主要タイムゾーンの表記
UTC (協定世界時): 2025-05-20T05:30:45Z
JST (日本標準時): 2025-05-20T14:30:45+09:00
EST (東部標準時): 2025-05-20T00:30:45-05:00
PST (太平洋標準時): 2025-05-19T21:30:45-08:00
GMT (グリニッジ標準時): 2025-05-20T05:30:45+00:00
タイムゾーン対応のベストプラクティス
# Python での例
from datetime import datetime, timezone, timedelta
# 常にタイムゾーン情報付きで保存
utc_time = datetime.now(timezone.utc)
stored_time = utc_time.isoformat() # 2025-05-20T05:30:45+00:00
# ユーザーのタイムゾーンで表示
user_tz = timezone(timedelta(hours=9)) # JST
local_time = utc_time.astimezone(user_
まとめ
- フォーマット指定とは、日付・時間の表示形式を制御すること
- よく使う記号:
yyyy
,MM
,dd
,HH
,mm
,ss
など - Python、JavaScript、PHP、Excelなど言語ごとに記法が異なる
ロケールやタイムゾーンの影響にも注意 フォーマットを自由に操れるようになれば、開発や資料作成の質が一段と向上します。
コメント