任何人都可以提出一個簡單的方法來將日期和時間轉換爲不同的時區在PHP中?在php中的時區轉換
回答
您可以使用此DateTime對象或它們的功能別名:
Example (abridged from PHP Manual)
date_default_timezone_set('Europe/London');
$datetime = new DateTime('2008-08-03 12:35:23');
echo $datetime->format('Y-m-d H:i:s') . "\n";
$la_time = new DateTimeZone('America/Los_Angeles');
$datetime->setTimezone($la_time);
echo $datetime->format('Y-m-d H:i:s');
關於編輯點評
但我cannt使用此方法,因爲我需要像美國一樣在不同的時區顯示日期呃從不同地點登錄
這不是問題。當用戶登錄時,您可以確定他的時區並將其設置爲您的DateTime對象,如圖所示。我在我的一個項目中使用了類似的方法,它像一個魅力。
在我需要得到的具體日期,任何單一時區數據庫,那麼只有它才能正確處理
您存儲的時間無論是作爲一個時間戳或在一個時區中的日期時間。在查詢DateTime字段時,您可以將DateTime對象中的時間轉換爲此時區,或者 - 如果您的db支持它 - 使用所選時區查詢。
一個更簡單的方法是這樣的:
date_default_timezone_set('Europe/London'); // your user's timezone
$my_datetime='2013-10-23 15:47:10';
echo date('Y-m-d H:i:s',strtotime("$my_datetime UTC"));
如上所述in the PHP manual,的strtotime()接受一個時區也是如此,你就必須把它添加到您的日期時間。
我建議您將所有日期時間存儲在UTC中,因爲這樣您不會遇到夏時制問題。
這工作對我來說,它也很乾淨!
function convert_to_user_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
try {
$dateTime = new DateTime ($date, new DateTimeZone($serverTimeZone));
$dateTime->setTimezone(new DateTimeZone($userTimeZone));
return $dateTime->format($format);
} catch (Exception $e) {
return '';
}
}
function convert_to_server_date($date, $format = 'n/j/Y g:i A', $userTimeZone = 'America/Los_Angeles', $serverTimeZone = 'UTC')
{
try {
$dateTime = new DateTime ($date, new DateTimeZone($userTimeZone));
$dateTime->setTimezone(new DateTimeZone($serverTimeZone));
return $dateTime->format($format);
} catch (Exception $e) {
return '';
}
}
//example usage
$serverDate = $userDate = '2014-09-04 22:37:22';
echo convert_to_user_date($serverDate);
echo convert_to_server_date($userDate);
DateTime::setTimezone -- date_timezone_set — Sets the time zone for the DateTime object
面向對象的風格
<?php
$date = new DateTime('2000-01-01', new DateTimeZone('Pacific/Nauru'));
echo $date->format('Y-m-d H:i:sP') . "\n";
$date->setTimezone(new DateTimeZone('Pacific/Chatham'));
echo $date->format('Y-m-d H:i:sP') . "\n";
?>
程序風格
<?php
$date = date_create('2000-01-01', timezone_open('Pacific/Nauru'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
date_timezone_set($date, timezone_open('Pacific/Chatham'));
echo date_format($date, 'Y-m-d H:i:sP') . "\n";
?>
上述例子將輸出:
2000-01-01 00:00:00+12:00
2000-01-01 01:45:00+13:45
<?php
$time='6:02';
$dt = new DateTime($time, new DateTimeZone('America/New_York'));
//echo $dt->format('Y-m-d H:i:s') . PHP_EOL;
$dt->setTimezone(new DateTimeZone('Asia/Kolkata'));
echo $dt->format('H:i') . PHP_EOL;
?>
//將日期從一個區域轉換爲另一個區域.. /* $ zone_from ='Asia/Kolkata';
$zone_to='America/Phoenix';
date_default_timezone_set($zone_from);
$convert_date="2016-02-26 10:35:00";
echo $finalDate=zone_conversion_date($convert_date, $zone_from, $zone_to);
*/
function zone_conversion_date($time, $cur_zone, $req_zone)
{
date_default_timezone_set("GMT");
$gmt = date("Y-m-d H:i:s");
date_default_timezone_set($cur_zone);
$local = date("Y-m-d H:i:s");
date_default_timezone_set($req_zone);
$required = date("Y-m-d H:i:s");
/* return $required; */
$diff1 = (strtotime($gmt) - strtotime($local));
$diff2 = (strtotime($required) - strtotime($gmt));
$date = new DateTime($time);
$date->modify("+$diff1 seconds");
$date->modify("+$diff2 seconds");
return $timestamp = $date->format("Y-m-d H:i:s");
}
UTC到本地:
<?php
$datetime = date("Y-m-d H:i:s");
$utc = new DateTime($datetime, new DateTimeZone('UTC'));
$utc->setTimezone(new DateTimeZone('America/Sao_Paulo'));
echo $utc->format('Y-m-d H:i:s');
?>
這些答案都不對工作對我來說(我想跳過的代碼,是大小過於笨重)。我也認爲僅僅爲了一次轉換就改變默認時區是很奇怪的。
這裏是我的解決方案:
function changeTimeZone($dateString, $timeZoneSource = null, $timeZoneTarget = null)
{
if (empty($timeZoneSource)) {
$timeZoneSource = date_default_timezone_get();
}
if (empty($timeZoneTarget)) {
$timeZoneTarget = date_default_timezone_get();
}
$dt = new DateTime($dateString, new DateTimeZone($timeZoneSource));
$dt->setTimezone(new DateTimeZone($timeZoneTarget));
return $dt->format("Y-m-d H:i:s");
}
因此,要轉換爲服務器默認情況下,你只需通過一個時區:
changeTimeZone("2016-10-24 16:28", "Asia/Tokyo");
要從服務器默認轉換爲用戶,您會留下第二個參數爲空或空白:
changeTimeZone("2016-10-24 16:28", "", "Asia/Tokyo");
並且在無時區之間切換遲來的默認情況下,將提供2個時區:
changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");
似乎很好! – 2017-01-26 21:44:35
很好的答案。我更喜歡try catch而不是(空)來避免時區字符串中的拼寫錯誤。嘗試新的DateTimeZone($ timeZoneSource); } \t catch(Exception $ e){ $ timeZoneSource = date_default_timezone_get(); } – 2018-01-13 19:13:58
- 1. 在PHP中轉換時區
- 2. 在php中轉換時區
- 3. PHP時區轉換
- 4. 在php中的時區轉換
- 5. PHP:轉換timezone的時區
- 6. PHP:轉換時區名稱
- 7. 在C#中轉換時區
- 8. PHP時區轉換/ PHP日期不顯示正確的時區
- 9. 基本的PHP時區轉換
- 10. LINQ中的時區轉換
- 11. 時區轉換
- 12. 時區轉換
- 13. 時區轉換
- 14. 在javascript中的時區轉換
- 15. 在PHP中轉換從fullcalendar生成的日期時區問題
- 16. php將datetime轉換爲unixtime和時區
- 17. 在時區之間轉換
- 18. 在PHP轉換時間字符串到不同的時區
- 19. 支持轉換的時區從其他時區IST在Ruby中
- 20. C++ - 時區轉換
- 21. PostgreSQL時區轉換
- 22. JS時區轉換
- 23. Flex-時區轉換
- 24. silverlight時區轉換
- 25. XSLT時區轉換
- 26. Rails - 時區轉換
- 27. Jodatime時區轉換
- 28. Java轉換時區
- 29. 時區轉換層
- 30. Java時區轉換
感謝戈登,而是因爲我需要在不同的時區從不同地點的用戶登錄 – raki 2010-03-24 06:25:04
@raki顯示日期我cannt使用此方法:因此只要用戶後已登錄 - 使用適當的用戶選擇的時區設置date_default_timezone_set()。 – zerkms 2010-03-24 06:44:04
這也是不可能的..因爲..在數據庫中我需要在任何單個時區中獲取日期,那麼只有它可以被正確處理 – raki 2010-03-24 06:51:44