【问题标题】:how can I get my system timezone on my php server如何在我的 php 服务器上获取我的系统时区
【发布时间】:2013-09-19 06:48:28
【问题描述】:

我的机器有 (GMT +6:00 Astana,Dhaka)。我在我的 php 脚本上设置了我的时区

date_default_timezone_set('Asia/Dhaka');

但有时它会在date() 函数中显示错误的日期。可能是我的 php 服务器没有设置 GMT 时间。

但是我的 mysql 服务器捕获了我的机器系统时区。所以我需要在 php 中相同。
这是我的数据库表概述

  SHOP_BALANCE-------------shop_balance_id(PK,AI,INT),shop_balance(DOUBLE),dates(DATE)
  PRODUCT_PURCHASE_ITEM----product_purchase_item_id(PK,AI,INT),product_id(INT),
                           pr_pur_cost_price(DOUBLE),pr_pur_unit_price(DOUBLE),
                           quantity(INT),product_size(INT),dates(TIMESTAMP),
                           bool_check(TINYINT)
  PRODUCT_PURCHASES--------product_purchase_id(PK,AI,INT),insert_operation(INT),
                           product_purchase_item_id(FK ref of PRODUCT_PURCHASE_ITEM).
                           product_id(INT),dates(TIMESTAMP),product_size(INT)

如果日期匹配,则在这一天的商店余额减少。如果日期是上一个日期的新日期,则商店余额也会减少但插入新日期

这是我的代码

在 shop_balance 表上查找最后一行 mysql 日期。我的日期栏是date 类型

$query=$this->db->query("select dates from shop_balance order by dates desc limit 1");
$rowfind_last_stock=$query->row();
if(isset($rowfind_last_stock->dates)){
    $find_last_date=$rowfind_stock->dates;
}

在我的 php 服务器中查找今天的日期

$today=date("Y-m-d");

检查不同查询的日期

if($find_last_date==$today){
   //run update query 
   $this->db->query(
                   "UPDATE
                      shop_balance AS s
                    INNER JOIN
                    (
                     SELECT p.dates,SUM(pr_pur_cost_price*quantity) AS net 
                     FROM product_purchase_item AS i
                     LEFT JOIN product_purchases AS p
                     ON p.product_purchase_item_id=i.product_purchase_item_id
                     WHERE p.insert_operation='$id'
                     GROUP BY p.insert_operation
                    ) AS a
                    ON s.dates=date(a.dates)
                    SET s.shop_balance=s.shop_balance-a.net
                  );"
}
else{
 //run insert query
 $this->db->query(
                   "INSERT INTO shop_balance 
                      SELECT null,
                      (
                       (
                        SELECT shop_balance 
                        FROM shop_balance 
                        ORDER BY shop_balance_id 
                        DESC LIMIT 1
                       )
                      -
                       (
                        SELECT p.dates,SUM(pr_pur_cost_price*quantity) AS net 
                        FROM product_purchase_item AS i
                        LEFT JOIN product_purchases AS p
                        ON p.product_purchase_item_id=i.product_purchase_item_id
                        WHERE p.insert_operation='$id'
                        GROUP BY p.insert_operation             
                       )
                     ),
                     curdate();"
                 );
}

问题是当我安装不同时,有时它会在 php 和 mysql 日期中执行插入查询甚至相同的日期。我设置的两个时区都高于 GMT +6.00 。为什么会出现这个问题?

【问题讨论】:

  • 很难理解你在问什么。你能显示更多的代码吗?展示如何收集值,如何将其传递给 mysql,以及它存储在 mysql 中的数据类型。然后我们可以提供更好的帮助。
  • @MattJohnson 我更新了我的问题。也许你现在可以理解我的问题了。
  • 抱歉,我还是不太明白这个问题。进入 dates 字段的值是来自 PHP 还是 MySQL?我只能猜测,因为您没有显示插入和更新例程中发生的事情。请尝试将一个样本放在一起,以完整地重现该问题。谢谢。
  • @MattJohnson 请再次查看我的更新

标签: php mysql timezone


【解决方案1】:

请参阅文档MySQL Server Time Zone Support 以及time_zonesystem_time_Zone 变量。

相信你会发现你的系统时区设置不是你所期望的。当您的插入查询调用curdate() 时,MySQL 会在会话的time_zone 变量的时区中传递它。默认情况下,这将与system_time_zone 变量中设置的区域相同。

您可以像这样检查您的时区变量:

SHOW VARIABLES LIKE '%time_zone'

如果您不想更改 MySQL 服务器的系统时区,则可以通过在查询前插入以下内容来设置会话时区:

SET time_zone = 'Asia/Dhaka';

如果出现错误,则表示时区表尚未加载。您可以使用mysql_tzinfo_to_sql 来填充它们。另见this answer

当然,一个更简单的解决方案是不使用curdate(),而是从 PHP 中收集当前日期并将其作为参数传递给查询。

【讨论】:

    【解决方案2】:

    请注意,由于PHP 5.1.0(当date/time 函数被重写时),如果时区无效,每次调用date/time 函数都会生成E_NOTICE,和/或E_WARNING 消息如果使用系统设置或 TZ 环境变量。

    您也可以使用INI 设置date.timezone 来设置默认时区,而不是使用此函数在脚本中设置默认时区。

    【讨论】:

      【解决方案3】:

      我正在使用这个功能。

      function currentDate($dateOnly = false, $tillEnd = false)
          {
              // gmmktime(0, 0, 0, 7, 1, 2000) H i s m d Y
              if($dateOnly)
              {
                  if($tillEnd)
                  {
                      $t = explode('-',date('Y-m-d'));
                      return date('Y-m-d',mktime(23, 59, 59, $t[1], $t[2],$t[0]));
                  }else{
                      return date('Y-m-d');
                  }
              }else{
                  if($tillEnd)
                  {
                      $t = explode('-',date('Y-m-d'));
                      return date('Y-m-d H:i:s',mktime(23, 59, 59, $t[1], $t[2],$t[0]));
                  }else{
                      return date('Y-m-d H:i:s');
                  }
              }
          }
      

      你可以调用这个函数来获取系统的时间。 参数是可选的,如果要获取当前日期和时间,请调用 as 例如:

      $currentDatetime=currentDate();
      

      【讨论】:

      • 第二个参数是什么。请举一个使用调用你函数的例子
      • 第一个参数传入true
      • 我根本看不出这是如何解决时区问题的。
      【解决方案4】:

      time()

      通过这个你可以得到系统的时间

      Manual

      【讨论】:

        【解决方案5】:

        试试这个

        <?php
        $date = new DateTime(null, new DateTimeZone('Europe/London'));
        $tz = $date->getTimezone();
        echo $tz->getName();
        ?>
        

        【讨论】:

        • 伦敦只有格林威治标准时间的一半。另一半在英国夏令时。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-08
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 2016-09-22
        • 1970-01-01
        相关资源
        最近更新 更多