[PHP]localtime関数完全解説 – UNIXタイムスタンプを詳細な時刻情報に変換する方法

PHP

PHPで日時を扱う際、時刻情報を詳細に分解して取得したい場面があります。そんなときに便利なのがlocaltime関数です。この記事では、localtime関数の使い方から実践的な活用方法まで、サンプルコードを交えながら詳しく解説していきます。

localtime関数とは?

localtime関数は、UNIXタイムスタンプを現地時間(ローカルタイム)の詳細な時刻情報に変換するPHPの組み込み関数です。この関数を使うことで、年、月、日、時、分、秒、曜日、年間通算日などの情報を個別に取得できます。

基本的な構文

array localtime([int $timestamp [, bool $is_associative = false]])

パラメータ

  • $timestamp: UNIXタイムスタンプ(省略時は現在時刻)
  • $is_associative: true の場合、連想配列で返す(デフォルトは false)

返り値の詳細

localtime関数は配列を返しますが、第2引数によって形式が変わります。

数値インデックス配列(デフォルト)

<?php
$time_array = localtime();
print_r($time_array);

/*
配列のインデックスと意味:
[0] => 秒 (0-59)
[1] => 分 (0-59) 
[2] => 時 (0-23)
[3] => 日 (1-31)
[4] => 月 (0-11) ※0が1月
[5] => 年 (1900年からの経過年数)
[6] => 曜日 (0-6) ※0が日曜日
[7] => 年間通算日 (0-365)
[8] => 夏時間フラグ (1=夏時間, 0=標準時間, -1=不明)
*/
?>

連想配列形式

<?php
$time_array = localtime(time(), true);
print_r($time_array);

/*
連想配列のキーと意味:
['tm_sec']   => 秒 (0-59)
['tm_min']   => 分 (0-59)
['tm_hour']  => 時 (0-23)
['tm_mday']  => 日 (1-31)
['tm_mon']   => 月 (0-11) ※0が1月
['tm_year']  => 年 (1900年からの経過年数)
['tm_wday']  => 曜日 (0-6) ※0が日曜日
['tm_yday']  => 年間通算日 (0-365)
['tm_isdst'] => 夏時間フラグ
*/
?>

実際の使用例

基本的な使い方

<?php
// 現在時刻の詳細情報を取得
$current_time = localtime();

echo "現在時刻の詳細情報:\n";
echo "秒: " . $current_time[0] . "\n";
echo "分: " . $current_time[1] . "\n";
echo "時: " . $current_time[2] . "\n";
echo "日: " . $current_time[3] . "\n";
echo "月: " . ($current_time[4] + 1) . "\n"; // 0ベースなので+1
echo "年: " . ($current_time[5] + 1900) . "\n"; // 1900年からの経過年
?>

連想配列での使用例

<?php
// 連想配列形式で取得
$time_info = localtime(time(), true);

echo "現在の日時情報:\n";
echo "年: " . ($time_info['tm_year'] + 1900) . "\n";
echo "月: " . ($time_info['tm_mon'] + 1) . "\n";
echo "日: " . $time_info['tm_mday'] . "\n";
echo "時: " . $time_info['tm_hour'] . "\n";
echo "分: " . $time_info['tm_min'] . "\n";
echo "秒: " . $time_info['tm_sec'] . "\n";

// 曜日の表示
$weekdays = ['日', '月', '火', '水', '木', '金', '土'];
echo "曜日: " . $weekdays[$time_info['tm_wday']] . "曜日\n";

// 年間通算日
echo "今年" . ($time_info['tm_yday'] + 1) . "日目\n";
?>

特定のタイムスタンプの解析

<?php
// 2024年1月1日のタイムスタンプ
$new_year_2024 = mktime(0, 0, 0, 1, 1, 2024);

// 詳細情報を取得
$new_year_info = localtime($new_year_2024, true);

echo "2024年1月1日の情報:\n";
echo "年: " . ($new_year_info['tm_year'] + 1900) . "\n";
echo "月: " . ($new_year_info['tm_mon'] + 1) . "\n";
echo "日: " . $new_year_info['tm_mday'] . "\n";

$weekdays = ['日', '月', '火', '水', '木', '金', '土'];
echo "曜日: " . $weekdays[$new_year_info['tm_wday']] . "曜日\n";
?>

実践的な活用例

カスタム日付フォーマット関数

<?php
function formatCustomDate($timestamp = null) {
    $timestamp = $timestamp ?? time();
    $time_info = localtime($timestamp, true);
    
    $year = $time_info['tm_year'] + 1900;
    $month = $time_info['tm_mon'] + 1;
    $day = $time_info['tm_mday'];
    $hour = $time_info['tm_hour'];
    $minute = $time_info['tm_min'];
    
    $weekdays = ['日', '月', '火', '水', '木', '金', '土'];
    $weekday = $weekdays[$time_info['tm_wday']];
    
    return sprintf(
        "%d年%d月%d日(%s曜日) %02d:%02d",
        $year, $month, $day, $weekday, $hour, $minute
    );
}

// 使用例
echo formatCustomDate() . "\n"; // 現在時刻
echo formatCustomDate(mktime(15, 30, 0, 12, 25, 2024)) . "\n"; // 2024年12月25日 15:30
?>

時刻成分を個別に処理する関数

<?php
class TimeAnalyzer {
    private $time_info;
    
    public function __construct($timestamp = null) {
        $timestamp = $timestamp ?? time();
        $this->time_info = localtime($timestamp, true);
    }
    
    public function getYear() {
        return $this->time_info['tm_year'] + 1900;
    }
    
    public function getMonth() {
        return $this->time_info['tm_mon'] + 1;
    }
    
    public function getDay() {
        return $this->time_info['tm_mday'];
    }
    
    public function getHour() {
        return $this->time_info['tm_hour'];
    }
    
    public function getMinute() {
        return $this->time_info['tm_min'];
    }
    
    public function getSecond() {
        return $this->time_info['tm_sec'];
    }
    
    public function getWeekdayName() {
        $weekdays = ['日', '月', '火', '水', '木', '金', '土'];
        return $weekdays[$this->time_info['tm_wday']];
    }
    
    public function getDayOfYear() {
        return $this->time_info['tm_yday'] + 1;
    }
    
    public function isWeekend() {
        return $this->time_info['tm_wday'] === 0 || $this->time_info['tm_wday'] === 6;
    }
}

// 使用例
$analyzer = new TimeAnalyzer();
echo "今年は" . $analyzer->getYear() . "年です\n";
echo "今日は" . $analyzer->getWeekdayName() . "曜日です\n";
echo "今年" . $analyzer->getDayOfYear() . "日目です\n";
echo ($analyzer->isWeekend() ? "週末" : "平日") . "です\n";
?>

営業日計算の例

<?php
function isBusinessDay($timestamp) {
    $time_info = localtime($timestamp, true);
    $weekday = $time_info['tm_wday'];
    
    // 月曜日(1)から金曜日(5)が営業日
    return $weekday >= 1 && $weekday <= 5;
}

function getNextBusinessDay($timestamp = null) {
    $timestamp = $timestamp ?? time();
    
    do {
        $timestamp += 24 * 60 * 60; // 1日進める
    } while (!isBusinessDay($timestamp));
    
    return $timestamp;
}

// 使用例
$next_business_day = getNextBusinessDay();
$time_info = localtime($next_business_day, true);

echo "次の営業日: " . 
     ($time_info['tm_year'] + 1900) . "年" .
     ($time_info['tm_mon'] + 1) . "月" .
     $time_info['tm_mday'] . "日\n";
?>

他の日時関数との比較

date関数との違い

<?php
$timestamp = time();

// date関数での取得
$date_format = date('Y-m-d H:i:s', $timestamp);
echo "date関数: " . $date_format . "\n";

// localtime関数での取得
$time_info = localtime($timestamp, true);
$localtime_format = sprintf(
    "%04d-%02d-%02d %02d:%02d:%02d",
    $time_info['tm_year'] + 1900,
    $time_info['tm_mon'] + 1,
    $time_info['tm_mday'],
    $time_info['tm_hour'],
    $time_info['tm_min'],
    $time_info['tm_sec']
);
echo "localtime関数: " . $localtime_format . "\n";
?>

getdate関数との違い

<?php
$timestamp = time();

// getdate関数
$getdate_info = getdate($timestamp);
echo "getdate: ";
print_r($getdate_info);

// localtime関数
$localtime_info = localtime($timestamp, true);
echo "localtime: ";
print_r($localtime_info);
?>

注意点とベストプラクティス

タイムゾーンの考慮

localtime関数は現地時間を返すため、タイムゾーン設定が重要です:

<?php
// タイムゾーンの設定
date_default_timezone_set('Asia/Tokyo');

$time_info = localtime(time(), true);
echo "JST: " . ($time_info['tm_hour']) . "時\n";

// 他のタイムゾーンと比較する場合
date_default_timezone_set('UTC');
$utc_info = localtime(time(), true);
echo "UTC: " . ($utc_info['tm_hour']) . "時\n";
?>

月の値に注意

月の値は0ベース(0=1月)なので、表示時は+1する必要があります:

<?php
$time_info = localtime(time(), true);

// 間違い
echo "現在の月: " . $time_info['tm_mon'] . "\n"; // 0-11

// 正しい
echo "現在の月: " . ($time_info['tm_mon'] + 1) . "\n"; // 1-12
?>

パフォーマンス考慮事項

頻繁に時刻情報を取得する場合は、結果をキャッシュすることを検討してください:

<?php
class CachedTimeInfo {
    private static $cache = [];
    private static $cache_lifetime = 1; // 1秒
    
    public static function getTimeInfo($timestamp = null) {
        $timestamp = $timestamp ?? time();
        $cache_key = (string)$timestamp;
        
        if (isset(self::$cache[$cache_key]) && 
            (time() - self::$cache[$cache_key]['cached_at']) < self::$cache_lifetime) {
            return self::$cache[$cache_key]['data'];
        }
        
        $time_info = localtime($timestamp, true);
        self::$cache[$cache_key] = [
            'data' => $time_info,
            'cached_at' => time()
        ];
        
        return $time_info;
    }
}
?>

まとめ

localtime関数は、時刻情報を詳細に分解して取得したい場合に非常に便利な関数です。特に以下のような場面で活用できます:

  • カスタム日付フォーマットの実装
  • 曜日や年間通算日の計算
  • 営業日・休日の判定
  • 時刻成分を個別に処理する必要がある場合
  • ログ解析やデータ処理での時刻分析

現代のPHPではDateTimeクラスを使う場面も多いですが、シンプルな時刻分解が必要な場合はlocaltime関数が効果的です。ぜひ実際のプロジェクトで活用してみてください。


この記事がPHPでの日時処理の参考になれば幸いです。他の日時関数についても学習を続けて、より効率的なコードを書けるようになりましょう。

タイトルとURLをコピーしました