web-dev-qa-db-ja.com

PHPでタイムゾーンを指定して現在の日付を取得しますか?

PHPのPaul Eggert形式(America/New_York)でタイムゾーンを指定して今日の日付を取得したいですか?

67
einstein

他の回答は、システムのすべての日付のタイムゾーンを設定します。ユーザーの複数のタイムゾーンをサポートしたい場合、これは必ずしもうまく機能するとは限りません。

これが短いバージョンです:

<?php
$date = new DateTime("now", new DateTimeZone('America/New_York') );
echo $date->format('Y-m-d H:i:s');

動作するPHP> = 5.2.0

サポートされているタイムゾーンのリスト: php.net/manual/en/timezones.php


これは、既存の時間とユーザー設定によるタイムゾーンの設定があるバージョンです

<?php

$usersTimezone = 'America/New_York';
$date = new DateTime( 'Thu, 31 Mar 2011 02:05:59 GMT', new DateTimeZone($usersTimezone) );
echo $date->format('Y-m-d H:i:s');

これは、プロセスをもう少し明確に示すためのより詳細なバージョンです

<?php

// Date for a specific date/time:
$date = new DateTime('Thu, 31 Mar 2011 02:05:59 GMT');

// Output date (as-is)
echo $date->format('l, F j Y g:i:s A');     

// Output line break (for testing)
echo "\n<br />\n";

// Example user timezone (to show it can be used dynamically)
$usersTimezone = 'America/New_York';

// Convert timezone
$tz = new DateTimeZone($usersTimezone);
$date->setTimeZone($tz);

// Output date after 
echo $date->format('l, F j Y g:i:s A');

図書館

  • Carbon —非常に人気のある日付ライブラリ。
  • Chronos —不変性に焦点を合わせたCarbonのドロップイン置換。それが重要である理由については、以下を参照してください。
  • jenssegers/date —多言語サポートを追加するCarbonの拡張機能。

他にも多くのライブラリが利用可能であると確信していますが、これらは私が精通しているいくつかのライブラリです


ボーナスレッスン:不変の日付オブジェクト

あなたがここにいる間、私はあなたに将来の頭痛の種をいくつかお預かりします。今日から1週間、今日から2週間を計算するとします。次のようなコードを書くことができます。

<?php

// Create a datetime (now, in this case 2017-Feb-11)
$today = new DateTime();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";
echo "\n<br>";

出力:

2017-02-11 
--- 
2017-03-04 
2017-03-04 
2017-03-04

うーん...それは私たちが望んでいたものではありません。 PHPで従来のDateTimeオブジェクトを変更すると、更新された日付が返されるだけでなく、元のオブジェクトも変更されます。

これがDateTimeImmutableの出番です。

$today = new DateTimeImmutable();

echo $today->format('Y-m-d') . "\n<br>";
echo "---\n<br>";

$oneWeekFromToday = $today->add(DateInterval::createFromDateString('7 days'));
$twoWeeksFromToday = $today->add(DateInterval::createFromDateString('14 days'));

echo $today->format('Y-m-d') . "\n<br>";
echo $oneWeekFromToday->format('Y-m-d') . "\n<br>";
echo $twoWeeksFromToday->format('Y-m-d') . "\n<br>";

出力:

2017-02-11 
--- 
2017-02-11 
2017-02-18 
2017-02-25 

この2番目の例では、予想される日付を取得します。 DateTimeImmutableの代わりにDateTimeを使用することにより、偶発的な状態の変化を防ぎ、潜在的なバグを防ぎます。

155
DesignerGuy

最初にデフォルトのタイムゾーンを設定してから日付を取得すると、日付は指定したタイムゾーンになります:

<?php 
 date_default_timezone_set('America/New_York');
 $date= date('m-d-Y') ;
 ?>

http://php.net/manual/en/function.date-default-timezone-set.php

52
Ghost-Man

PHP 5.3)にアクセスできる場合、 intl extension はこのようなことをするのに非常に便利です。

マニュアルの例を次に示します。

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
    'America/Los_Angeles',IntlDateFormatter::GREGORIAN  );
$fmt->format(0); //0 for current time/date

あなたの場合、次のことができます:

$fmt = new IntlDateFormatter( "en_US" ,IntlDateFormatter::FULL, IntlDateFormatter::FULL,
        'America/New_York');
 $fmt->format($datetime); //where $datetime may be a DateTime object, an integer representing a Unix timestamp value (seconds since Epoch, UTC) or an array in the format output by localtime(). 

America/New_Yorkなどのタイムゾーンを設定できるため、夏時間も考慮されるため、GMTまたはUTCオフセットを使用するよりもはるかに優れています。

最後に、intl拡張機能はICUデータを使用するため、独自の日付/時刻形式を作成する際に非常に便利な機能が多数含まれています。

4
F21

時間を任意のタイムゾーンに変換するために使用できる簡単な関数を作成しました:

function convertTimeToLocal($datetime,$timezone='Europe/Dublin') {
        $given = new DateTime($datetime, new DateTimeZone("UTC"));
        $given->setTimezone(new DateTimeZone($timezone));
        $output = $given->format("Y-m-d"); //can change as per your requirement
        return $output;
}
4
<?php
date_default_timezone_set('GMT-5');//Set New York timezone
$today = date("F j, Y")
?>
0
Kyle