2011-11-04 87 views

回答

36

第一設置默認的時區和獲取日期屆時,日期將在時區指定:

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

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

+6

注意,使用'date_default_timezone_set()'設置它()'後點日期的'所有使用。查看我的答案,瞭解如何管理多個時區的示例。 – DesignerGuy

+5

目前不好的做法,如果你只是想在該時區獲得1日期,請參閱DesignerGuy的答案以獲得更豐富的解決方案。 –

+0

有很好的選擇時區的一般方法。 – Zan

-1
<?php 
date_default_timezone_set('GMT-5');//Set New York timezone 
$today = date("F j, Y") 
?> 
3

如果你有機會獲得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,這比使用一個更好格林威治標準時間或UTC時間偏差,因爲這也考慮了日光節約時間。

Finaly,因爲intl擴展使用ICU數據,當涉及到創建自己的日期/時間格式時,它包含許多非常有用的功能。

94

其他的答案設置時區爲所有日期系統。如果您想爲您的用戶支持多個時區,這並不總是奏效。

這裏的短版本:

<?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的擴展,增加了多語言支持。

我確定有一些其他庫可用,但這些是我熟悉的一些。


獎金課:永恆Date對象

當你在這裏,讓我救你將來頭痛。假設你想從今天開始計算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(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

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 

Hmmmm ...這並不完全是我們想要的。在PHP中修改傳統的DateTime對象不僅會返回更新的日期,還會修改原始對象。

這是DateTimeImmutable進來

$today = new DateTimeImmutable(); 

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

$oneWeekFromToday = $today->add(new DateInterval('P7D')); 
$twoWeeksFromToday = $today->add(new DateInterval('P14D')); 

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 

在第二個例子中,我們得到了我們的預期回來的日期。通過使用DateTimeImmutable而不是DateTime,我們可以防止意外狀態突變並防止潛在的錯誤。

+0

欣賞答案@DesignerGuy,但這裏是一個*適當的*支持時區列表:http://php.net/manual/en/timezones.php –

+1

謝謝@ChrisHarrison。剛更新了答案。 – DesignerGuy

+1

這應該是公認的答案,正是我所期待的。謝謝! – Brett

1

我創造了一些簡單的功能,你可以用時間轉換爲任何時區:

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; 
}