UTC時刻の文字列からローカル時刻を出力する

SQLite には日付型はないが、 CURRENT_TIMESTAMP で現在時刻を文字列として取得することができる。また、date などの関数で時刻の演算することもできる。

SELECT
  CURRENT_TIMESTAMP AS now
, datetime('now', 'start of month') AS first_day
, datetime('now', 'start of month', '+1 month', '-1 day') AS last_day
;

出力は次のようになる。

now => 2013-11-14 21:12:34
first_day => 2013-11-01 00:00:00
last_day => 2013-11-30 23:59:59

ただしここで出力される時刻は世界協定時 UTC に固定されているため、アプリケーション側でローカル時刻に変換する必要がある。

PHP の場合、この変換に PHP 5.2 から用意されている DateTime クラスを使うことができる。下記の例は UTC 時刻の文字列を受け取り、ローカル時刻の文字列を返す。

<?php
function formatLocalDatetime($utcstr) {
	static $UTC, $Local;
	if (! isset($UTC)) {
		$UTC = new DateTimeZone('UTC');
		$Local = new DateTimeZone(date_default_timezone_get());
	}

	try {
		$date = new DateTime($utcstr, $UTC);
		$date->setTimeZone($Local);
		return $date->format('Y/m/d H:i:s');
	}
	catch (Exception $e) {
		return '';
	}
}

date_default_timezone_set('Asia/Tokyo');
echo formatLocalDateTime('2013-11-14 21:12:34'); // => 2013-11-15 06:12:34

単に UNIX 時間を取得する場合は $date->getTimestamp() でよい。