web-dev-qa-db-ja.com

JDateでフォーマットされた出力のタイムゾーンが正しくない

正しい「時間」を表示することはできますが、ユーザーに出力されるフォーマットされた日付に正しいタイムゾーンを表示することができません。

私はオンラインで見つけることができるものとドキュメントを試してみましたが、出力のその部分を正しく得ることができないようです。基本的な何かが足りないのですか、それともJDateのバグですか?

マイ出力

Source Date:  2000-01-01 00:00:00 (stored in DB as UTC)
Expected Output:  1999-12-31 19:00 EST, using format "Y-m-d H:i T"

Joomla Timezone:  DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => UTC
)

User Timezone:  America/New_York
User DateTimeZone Object
(
    [timezone_type] => 3
    [timezone] => America/New_York
)

1. 2000-01-01 05:00 GMT
2. 2000-01-01 05:00 GMT    

マイコード

$thedate = '2000-01-01 00:00:00';
echo '<pre>Source Date:  '.print_r($thedate,true).' (stored in DB as UTC)'."\n";
echo 'Expected Output:  2000-01-01 05:00 EST, using format "Y-m-d H:i T"</pre>';

// Joomla Timezone
$tz_joomla = new DateTimeZone(JFactory::getApplication()->get('offset'));
echo '<pre>Joomla Timezone:  '.print_r($tz_joomla,true).'</pre>';

// User Timezone
$user = JFactory::getUser();
$utzparm = $user->getParam('timezone', 'UTC');
$tz_user = new DateTimeZone($utzparm);
echo '<pre>User Timezone:  '.print_r($utzparm,true)."\n";
echo 'User '.print_r($tz_user,true).'</pre>';

// Output withOUT `->setTimezone`
$date = new JDate($thedate,$tz_user);
$output_date = $date->format('Y-m-d H:i T');
echo '<pre>1. '.print_r($output_date,true).'</pre>';

// Output WITH `->setTimezone`
$date = new JDate($thedate,$tz_user);
$date->setTimezone($tz_user);
$output_date = $date->format('Y-m-d H:i T');
echo '<pre>2. '.print_r($output_date,true).'</pre>';
5
GDP

答えは明らかに->calendar()ではなく->format()を使用することにあります。そのメソッドにはローカルでフォーマットするための2番目のパラメーターがあるためです。以下のコードは、出力でタイムゾーンを正しく示しています。

$date = new JDate($thedate);
$date->setTimezone($tz_user);
$output_date = $date->calendar('Y-m-d H:i T', true );
echo $output_date';

> 1999-12-31 19:00 EST
3
GDP