PHP中的时区转换

2020/11/07 01:42 · php ·  · 0评论

谁能建议一种简单的方法来将日期和时间转换为php中的不同时区?

您可以为此使用datetime对象或其函数别名:

示例(从PHP手册中删节

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');

编辑评论

但我无法使用此方法,因为当用户从不同位置登录时,我需要显示不同时区的日期

那不是问题。用户登录后,您将确定其时区并将其设置为DateTime对象,如图所示。我在我的一个项目中使用了类似的方法,它的工作原理很吸引人。

在数据库中,我需要获取任何单个时区中的日期,然后只有它才能正确处理

您可以将时间存储为一个时区中的时间戳或日期时间。查询DateTime字段时,可以将DateTime对象中的时间转换为该时区,或者-如果您的数据库支持,则使用选定的时区进行查询。

一个更简单的方法如下所示:

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"));

PHP手册中所述,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);

这些答案都不对我有用(我跳过了尝试使用过于庞大的代码)。我还认为仅针对一次转换更改默认时区就很奇怪。

这是我的解决方案:

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个时区之间切换,您需要提供2个时区:

changeTimeZone("2016-10-24 16:28", "America/New_York", "Asia/Tokyo");

DateTime :: setTimezone-date_timezone_set —设置DateTime对象的时区

面向对象的风格

<?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

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');

?>
<?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; 
?>
// Convert date from one zone to another..
/* 
$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");
}

我总是很难记住setTimezone()方法是如何工作的。是否根据时区调整日期时间?还是要使用给定的日期时间,删除其时区并使用您通过的日期时间?总而言之,我希望有一种更直观的方式来处理时区。

我喜欢这个:

(new AdjustedAccordingToTimeZone(
    new DateTimeFromISO8601String('2018-04-25 15:08:01+03:00'),
    new Novosibirsk()
))
    ->value();

它以新西伯利亚时区输出ISO8601格式的日期时间。

这种方法使用了蛋白酥皮库,请查看快速入门以获取更多示例。

本文地址:http://php.askforanswer.com/phpzhongdeshiquzhuanhuan.html
文章标签: ,   ,   ,  
版权声明:本文为原创文章,版权归 admin 所有,欢迎分享本文,转载请保留出处!

文件下载

老薛主机终身7折优惠码boke112

上一篇:
下一篇:

评论已关闭!