PHPで日本語の日付形式をタイムスタンプに変換する方法【午前/午後対応】

はじめに
日本語のWebアプリやWordPressフォームでは、「2025年6月24日」や「2025年6月24日 午後3時」など、自然言語に近い日付入力を処理する場面がよくあります。
本記事では、「◯年◯月◯日」形式の日本語日付をPHPでタイムスタンプに変換する方法について、ベストプラクティスを交えて紹介します。
主要な方法の比較
方法 | メリット | デメリット | 適したケース |
---|---|---|---|
strtotime() + str_replace() | シンプル、コード量が少ない | 曖昧な変換、タイムゾーンに依存 | 固定形式のシンプル変換に最適 |
DateTime クラス | オブジェクト指向、検証が厳密 | 若干コードが長くなる | 本格的な日本語日付処理に推奨 |
date_parse_from_format() + mktime() | 独自フォーマット解析が可能 | エラー処理がやや煩雑 | 自前で形式を制御したいとき |
正規表現 | 柔軟性が高い、多形式対応が可能 | 保守コストが高くなりがち | 非標準な表記(例:〇月下旬など)に対応 |
ベストプラクティス:DateTimeクラスを使う
日本語の日付(例:2025年6月24日)には、以下のように DateTime::createFromFormat() が有効です:
$date = DateTime::createFromFormat('Y年n月j日', $japaneseDate, new DateTimeZone('Asia/Tokyo'));
$timestamp = $date ? $date->getTimestamp() : false;
ポイント:
- Y年n月j日 を使えば先頭ゼロなしでもOK。
- タイムゾーン を明示することでサーバー差異を回避。
- false チェックや try-catch でエラー処理を明示化。
コード全体例(関数化)
/**
* 日本語日付をタイムスタンプに変換
* @param string $japaneseDate 例: "2025年6月24日"
* @return int|false 有効なタイムスタンプ or 失敗時はfalse
*/
function japaneseDateToTimestamp($japaneseDate) {
try {
$date = DateTime::createFromFormat(
'Y年n月j日',
$japaneseDate,
new DateTimeZone('Asia/Tokyo')
);
return $date ? $date->getTimestamp() : false;
} catch (Exception $e) {
return false;
}
}
// 使用例
$timestamp = japaneseDateToTimestamp("2025年6月24日");
if ($timestamp !== false) {
echo "タイムスタンプ: $timestamp (" . date('Y-m-d H:i:s', $timestamp) . ")";
} else {
echo "無効な日付形式です";
}
午前・午後を含む形式の処理
「2025年6月24日 午後3時30分」のような文字列に対応するには、次のように書き換えます:
$replaced = str_replace(['午前', '午後'], ['AM', 'PM'], $japaneseDateTime);
$date = DateTime::createFromFormat('Y年n月j日 Ag時i分', $replaced, new DateTimeZone('Asia/Tokyo'));
注意点まとめ
- Asia/Tokyo タイムゾーンを指定しましょう。
- 変換処理をループの外に置いてパフォーマンス最適化。
- タイムスタンプに変換する前提であれば、元から保存形式を統一するのも効果的です。
おわりに
日本語の日付フォーマットを扱う際、DateTime
クラスは柔軟かつ堅牢な方法です。
特にユーザー入力を受け取るWebシステムやWordPressフォームでは、フォーマットの許容幅と厳密性のバランスが鍵となります。
本記事のコードを参考に、安全かつ正確な日付処理を実装してみてください。