我的机器有(格林威治标准时间+6:00阿斯塔纳,达卡)。我在 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)
想法是如果日期匹配,这一天的商店余额会减少。如果日期是新日期到商店余额上一个日期,则车间余额也会减少,但插入新日期
这是我的代码
在表上查找最后一行 mysql 日期shop_balance。我的日期列是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 日期中执行相同的日期执行插入查询。我设置的两个时区都高于格林威治标准时间+6.00。为什么会出现这个问题?
请参阅文档MySQL服务器时区支持以及time_zone
和system_time_Zone变量。
我相信你会发现你的系统时区设置不是你所期望的。 当您的插入查询调用curdate()
时,MySQL从会话的time_zone
变量以时区传递它。 默认情况下,这将是在 system_time_zone
变量中设置的相同区域。
您可以像这样检查时区变量:
SHOW VARIABLES LIKE '%time_zone'
如果您不想更改MySQL服务器的系统时区,则可以通过在查询之前插入以下内容来设置会话时区:
SET time_zone = 'Asia/Dhaka';
如果收到错误,则时区表尚未加载。 您可以使用mysql_tzinfo_to_sql来填充它们。 另请参阅此答案。
当然,一个更简单的解决方案是不使用curdate()
,而是从 PHP 收集当前日期并将其作为参数传递给查询。
请注意,自 PHP 5.1.0
年以来(重写 date/time
函数时),如果时区无效,则每次调用 date/time
函数都会生成一个E_NOTICE
,如果使用系统设置或 TZ 环境变量,则会生成E_WARNING
消息。
使用此函数在脚本中设置默认时区外,您还可以使用 INI
设置date.timezone
来设置默认时区。
我正在使用这个函数。
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();
time()
通过这个你可以得到系统的时间
手动
试试这个
<?php
$date = new DateTime(null, new DateTimeZone('Europe/London'));
$tz = $date->getTimezone();
echo $tz->getName();
?>