1

私のマシンには (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より上に設定しました。なぜこの問題?

4

5 に答える 5

1

およびsystem_time_Zone変数については、MySQL Server Time Zone Supportのドキュメントを参照してください。time_zone

システムのタイム ゾーン設定が期待どおりではないことに気付くと思います。挿入クエリが を呼び出すと、MySQL はセッションの変数curdate()からのタイム ゾーンで配信します。time_zoneデフォルトでは、これはsystem_time_zone変数に設定されているのと同じゾーンになります。

次のようにタイムゾーン変数を確認できます。

SHOW VARIABLES LIKE '%time_zone'

MySQL サーバーのシステム タイム ゾーンを変更したくない場合は、クエリの前にこれを挿入して、セッションのタイム ゾーンを設定できます。

SET time_zone = 'Asia/Dhaka';

エラーが発生した場合は、タイム ゾーン テーブルが読み込まれていません。mysql_tzinfo_to_sqlを使用してそれらを設定できます。この回答も参照してください。

もちろん、はるかに簡単な解決策は、を使用せずcurdate()、代わりに PHP から現在の日付を収集し、それをパラメーターとしてクエリに渡すことです。

于 2013-09-20T17:38:42.133 に答える
0

PHP 5.1.0(date/time関数が書き直されたとき) 以降、関数を呼び出すたびに、タイムゾーンが有効でない場合、および/またはシステム設定または TZ 環境変数を使用している場合はメッセージdate/timeが生成されることに注意してください。E_NOTICEE_WARNING

この関数を使用してスクリプトでデフォルトのタイムゾーンを設定する代わりに、INI設定date.timezoneを使用してデフォルトのタイムゾーンを設定することもできます。

于 2013-09-19T07:07:10.997 に答える
0

この機能を使用しています。

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');
            }
        }
    }

この関数を呼び出して、システムの時刻を取得できます。引数はオプションです。現在の日付と時刻を取得したい場合は、次のように呼び出します。

$currentDatetime=currentDate();
于 2013-09-19T06:52:30.247 に答える
-1

time()

これにより、システムの時間を取得できます

マニュアル

于 2013-09-19T06:54:03.790 に答える
-1

これを試して

<?php
$date = new DateTime(null, new DateTimeZone('Europe/London'));
$tz = $date->getTimezone();
echo $tz->getName();
?>
于 2013-09-19T07:19:23.203 に答える