首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在php服务器上获得系统时区?

问如何在php服务器上获得系统时区?
EN

Stack Overflow用户
提问于 2013-09-19 06:48:28
回答 5查看 3.9K关注 0票数 1

我的机器已经(GMT +6:00,达卡) .I在我的php脚本上设置了我的时区

代码语言:javascript
复制
date_default_timezone_set('Asia/Dhaka');

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

但是我的mysql服务器会捕获我的机器系统时区。所以我在php中需要同样的。

在这里,我的数据库表概要

代码语言:javascript
复制
  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类型

代码语言:javascript
复制
$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服务器中找到今天的日期

代码语言:javascript
复制
$today=date("Y-m-d");

不同查询的检查日期

代码语言:javascript
复制
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();"
                 );
}

问题是,当我安装高于GMT +6.00的different.Both时区时,它有时执行插入查询,甚至在php和mysql date中执行相同的日期。为什么有这个问题?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2013-09-20 17:38:42

请参阅文档MySQL服务器时区支持以及time_zone和区域变量。

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

您可以检查时区变量,如下所示:

代码语言:javascript
复制
SHOW VARIABLES LIKE '%time_zone'

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

代码语言:javascript
复制
SET time_zone = 'Asia/Dhaka';

如果您得到一个错误,那么时区表还没有加载。您可以使用sql来填充它们。另见这个答案。

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

票数 1
EN

Stack Overflow用户

发布于 2013-09-19 06:52:30

我正在使用这个函数。

代码语言:javascript
复制
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');
            }
        }
    }

您可以调用此函数来获取系统的时间。参数是可选的,如果您想获得当前的时间日期,那么调用例如:

代码语言:javascript
复制
$currentDatetime=currentDate();
票数 0
EN

Stack Overflow用户

发布于 2013-09-19 07:07:10

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18887915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档