【问题标题】:How to get local time in php?如何在php中获取当地时间?
【发布时间】:2014-07-23 15:08:51
【问题描述】:

我正在尝试使用 php 获取本地时间。我写了两个不同的版本,但都给出了错误的时间

date_default_timezone_set('UTC');
$now = new DateTime();
echo $now->getTimestamp(); 

另一种方式

date_default_timezone_set('America/New York');
echo strtotime("now")."<br/>";;
$now = new DateTime();
echo $now->getTimestamp(); 

在这两种情况下,我的时间都比当地时间早了 4 个。还有其他方法可以获取当地时间吗?

【问题讨论】:

  • America/New York 是您当地的时区吗?它们都返回相同的值吗?
  • @esqew 是的,他们都同时返回
  • @SureshKamrushi 你是怎么想到的?
  • 您正在检索时间戳。时间戳始终为 UTC。换句话说,您将永远,我的意思是永远在您致电getTimestamp() 时获得 UTC 时间。
  • 注:是正确的。而不是打印 UNIX 时间戳,打印 $now-&gt;format(DateTime::W3C) 会给你一个更完整的画面。

标签: php


【解决方案1】:

DateTime::getTimestamp() 返回 unix 时间戳。该数字始终为 UTC。你想要的是根据你的时区格式化日期。

$dt = new DateTime("now", new DateTimeZone('America/New_York'));

echo $dt->format('m/d/Y, H:i:s');

或者根据需要使用不同的日期格式。

此外,您可以使用 DateTime 库来满足您的所有日期需求。每次要获取日期时都无需更改服务器的默认时区。

【讨论】:

  • 谢谢,我还有一个问题。一旦我得到当地时间,无论如何我可以将该时间转换为 unix 时间?
  • 你说的unix时间是什么意思?当我们谈论 unix 时间时,这意味着时间戳——这让我们回到开始——你会得到自 1970 年以来的秒数,即 UTC。
  • 作为 N.B.说虽然上面只适用于 1970 年之后的日期;)
  • 我正在一个项目中工作,我们需要将本地时间与存储在我的数据库中的时间进行比较。我认为使用unix时间戳会更容易。但它不会起作用,因为它总是比实际时间提前几个小时。
  • 最好的办法是完全忽略本地时间,只在代码中使用 UTC 时间。如果您需要显示它,您可以使用 DateTimeZone 将其格式化为“人眼”。 DateTime 对象也有一个 ->diff 方法
【解决方案2】:

只需使用函数 date_default_timezone_set()。这是一个例子:

<?php 
date_default_timezone_set("Asia/Dhaka");
echo date('d-m-Y h:i:s A');
?>

希望对你有帮助 谢谢。

【讨论】:

    【解决方案3】:

    您需要使用 javascript,因为您希望从客户端获取时间值。 PHP 是一种服务器端语言,它在服务器上进行评估并将结果发送到客户端。因此,如果您尝试使用 PHP 函数提取日期/时间,它将从服务器中提取日期,而该日期并不总是在客户端的时区中。

    您可以在 javascript 函数中执行此操作,然后在显示中引用该值。

    var thisDateTime = new Date();

    【讨论】:

    • +1。我不完全确定为什么这被否决了。这是为用户提供本地时间并使用 Date::toLocaleString() 正确格式化数据的好方法。
    • 但是如果服务器知道(比如)零售店在哪里,服务器就可以计算出该位置所在时区的时间。
    • js 是个问题。发布在数据库上的日期和时间将是服务器日期而不是客户端计算机时间
    【解决方案4】:

    如果你不想使用时区,你可以混合使用 windows 和 php 命令:

    <?php 
      $D = exec('date /T');
      $T = exec('time /T');
      $DT = strtotime(str_replace("/","-",$D." ".$T));
      echo(date("Y-m-d H:i:s",$DT));
    ?>
    

    【讨论】:

    • 谢谢。我不知道为什么这个答案被否决了,即使它是一个有效的答案。
    • 是个好技巧,但任何语言环境的任何时候都不起作用。不过是个好技巧。谢谢。
    【解决方案5】:

    作为记录,我发现读取机器真实小时的唯一解决方案是读取 PHP 之外的信息(javascript、shell 或其他进程)。为什么?

    例如,假设我们有一个基于每日储蓄的小时。如果操作系统的时区(在我的例子中是 Windows)与 PHP 的时区不同步,我的意思是,它的计算方式可能不同。或者机器正在使用不同的时间,它忽略了每日节省时间。

    现在,我的时区是 UTC -4 Santiago 晚上 9:35(每日节省)。但是,PHP 认为是晚上 10:35(使用本地时间、时间、日期和日期时间)。

    【讨论】:

      【解决方案6】:

      我想知道为什么没有人在 PHP 中提到带有索引键数组结果的 localtime(time()); 或带有关联键数组结果的 localtime(time(), true);

      【讨论】:

      • 这个还是需要date_default_timezone_set(timezonestring)
      【解决方案7】:

      如果这里有人想根据用户的时区(动态)获取本地时间,那么您可以考虑以下代码:

      $ip = $_SERVER['REMOTE_ADDR'];
      $ipInfo = file_get_contents('http://ip-api.com/json/' . $ip);
      $ipInfo = json_decode($ipInfo);
      $timezone = $ipInfo->timezone ?? "UTC";
      
      $dt = new DateTime("now", new DateTimeZone($timezone));
      echo $dt->format('Y-m-d H:i:s');
      

      上面的代码会得到用户的本地时区,并据此打印时间。

      如果您想在您的本地主机上测试上述代码,请确保在那里对您的 IP 地址进行硬编码,因为 API 无法根据您的本地地址 (127.0.0.1) 为您提供时区,但上述代码有效很好 实时服务器。

      对于本地主机,请执行以下操作:

      $ip = '-------'; //your IP address
      

      【讨论】:

        【解决方案8】:

        您可以使用 localtime() 函数或 date_default_timezone_set() 函数来解决此问题。

        详细了解 localtime() 函数参考:
        http://php.net/manual/en/function.localtime.php

        了解更多关于 date_default_timezone_set() 函数参考http://www.php.net/manual/en/function.date-default-timezone-set.php

        我认为这对你有帮助..

        【讨论】:

          猜你喜欢
          • 2010-10-14
          • 1970-01-01
          • 2014-07-06
          • 1970-01-01
          • 2011-01-20
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-10-03
          相关资源
          最近更新 更多