【问题标题】:PHP date_create function, converting UTC time to different timezone using the timezone abbrevPHP date_create 函数,使用时区缩写将UTC时间转换为不同的时区
【发布时间】:2012-05-13 07:51:32
【问题描述】:
$placename=timezone_name_from_abbr("", $timezone * 3600, false);
                        $date = date_create($list['stamp'], timezone_open($placename));
                        $datetimezone=new DateTimeZone('Europe/London');
                        $dateTime = new DateTime($list['stamp'],$datetimezone); 
                        $dateTime->setTimeZone(new DateTimeZone($placename)); 

编辑

我尝试了以下建议的代码作为答案,它产生的时间比它应该的时间少了 2 小时。我检查了我的数据库,数据库中的时间与 GMT 匹配。所以问题在于使用转换将其从 GMT 转换

$timezone=-4

来自用户回答的代码,下面会产生两个小时的休息时间。从 GMT 转换为 America/New_York 但慢了两个小时。我检查了地名变量以确保它是 America/New_York。是什么原因造成的?

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$dateTime = new DateTime($list['stamp']); 
$dateTime->setTimeZone(new DateTimeZone($placename)); 
echo $dateTime->format('F d g:i a'); 

原始问题

它没有将它转换为美国/纽约时间,而是生成了一个我存储在我的数据库中的 UTC 时间,为什么会这样,为什么它没有转换时间?它以2012-05-13 07:30:47 的形式存储在数据库中

$placename=timezone_name_from_abbr("", $timezone * 3600, true);
$date = date_create($list['stamp'], timezone_open($placename));
echo date_format($date, 'F d g:i a');

【问题讨论】:

    标签: php datetime date timezone


    【解决方案1】:
    $dateTime = new DateTime($date,new DateTimeZone('Europe/London')); 
    $dateTime->setTimeZone(new DateTimeZone('America/New_York')); 
    echo $dateTime->format('F d g:i a'); 
    

    请注意,我在创建 DateTime 对象时添加了第二个参数,以确保它知道我传递的是 GMT 时间,其他方式它将假定您的服务器为本地时间并可能结束得到不同的结果。

    不带引号的第一个版本。

    顺便说一句,您正在(在您的代码上)分配一个不带引号的字符串,这可能会也可能不会导致错误,因为 PHP 将尝试查找名为 America 的常量并将其除以常量名称New_York 但我假设那不是你所追求的。

    如果所有警告/通知/错误显示您会看到以下内容:

    Notice: Use of undefined constant America - assumed 'America' in line 3;
    

    如果您想考虑一下,最终会返回一个实际警告(前两个是通知),告诉您您的潜水为零。 PHP 是危险的,因为它可以让你做各种疯狂的事情,而不会明显地破坏任何东西。不要误会我的意思,我喜欢 PHP,你只需要一开始就小心。

    我给你的代码有效:)

    如果您在创建时未指定时区(作为构造函数的第二个参数),它将假定时区是您当前的时区(服务器时区),您可以通过将 GMT 传递到那里或您存储在数据库中的任何内容。

    但是,文档上有一条警告说: 注意:

    $timezone 参数和当前时区在 $time 参数要么是 UNIX 时间戳(例如 @946684800)要么 指定时区(例如 2010-01-28T15:00:00+02:00)。

    Docs

    【讨论】:

    • @arboles 这是根据需要格式化日期的最佳选择。只需将 $date 替换为 $list['stamp'] 所需的结果(根据您之前的问题)
    • 我使用 timezone_name_from_abbr 函数从 GMT 偏移量获取时区名称。 $placename=timezone_name_from_abbr("", $timezone * 3600, true);其中 $timezone= -4。我如何将其合并到您建议的 setTimeZone 对象中?
    • 好的,所以我尝试了这个,它给我的时间是 2 小时的休息时间。而不是凌晨 4 点 20 分,它说的是凌晨 2 点 20 分。如果我关闭夏令时,则关闭一小时。我检查了我的数据库,我的数据库中的时间与 GMT 匹配。所以问题在于将地名转换为时间。
    • 我用您在回答中建议的代码编辑了我的问题,但它没有产生正确的结果。
    • 好吧,你需要像以前那样做,new DateTimeZone('Europe/London') 因为这将返回一个 DateTimeZone 对象,而不是像你通过放置 Europe/London 传递它的字符串直接。
    猜你喜欢
    • 2012-11-22
    • 2018-02-24
    • 1970-01-01
    • 2013-06-10
    • 2016-07-06
    • 2013-06-30
    • 1970-01-01
    • 1970-01-01
    • 2012-06-24
    相关资源
    最近更新 更多