發表回覆建立主題發起投票

> 搞很久的時差問題, 主機架在國外,訂單一直有時差問題
Charson
發表於: 2006-09-29, 02:44 PM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



因為主機架在國外,購物車訂單有時差問題。
查過論壇試過各種方式,
例如改tchinese.php裡面的語法,

完全不能成功!
也改過twe_date_long_inc.php用加上時差方式,
return gmdate('Y/m/d H:i:s', gmmktime($hour,$minute,$second,$month,$day,$year)+(3600*X));

是否還有其他的方式?


=============================================

  Apache 版本 1.3.36 (Unix)
  MySQL 版本 4.1.20-standard
  PHP 版本 4.4.2
  PHP 資訊 按這查看
  PERL 版本 5.8.7
  Kernel 版本 2.6.16.17-grsec
  Machine Type i686
  cPanel 版本 10.8.2-RELEASE-119
  cPanel Pro Version 1.0 (RC36)

=============================================
若還需要其他資訊請告知,謝謝!



傳送簡訊Email
Top
Charson
發表於: 2006-09-30, 12:56 PM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



對不起,我常常在這裡發表的文章都沒有人回,若是我有什麼疏忽之處請告知!
關於時差問題,我試著將下列的程式碼放在伺服器上執行:

QUOTE
<?php
define('DATE_FORMAT_SHORT', '%m /%d/%Y');
define('DATE_FORMAT_LONG', '%Y 年%B%d 日%A');
define('DATE_FORMAT', 'm/d/Y');
define('DATE_TIME_FORMAT', DATE_FORMAT_SHORT . ' %H+15:%M:%S' . ' %c %Z');

setlocale(LC_TIME, 'en_US');
echo strftime(DATE_FORMAT_SHORT) . '<br>';
echo strftime(DATE_FORMAT_LONG) . '<br>';
echo date(DATE_FORMAT) . '<br>';
echo strftime(DATE_TIME_FORMAT) . '<br>';

$TIMESTAMP = time() + (1 * 3600);

echo '------------------------------------<br>';
setlocale(LC_TIME, 'zh_TW');
echo strftime(DATE_FORMAT_LONG) . '<br>';
echo strftime(DATE_TIME_FORMAT) . '<br>';

echo '------------------------------------<br>';
setlocale(LC_TIME, 'zh_TW.utf8');
echo strftime(DATE_FORMAT_LONG) . '<br>';
echo strftime(DATE_TIME_FORMAT) . '<br>';
echo time() . '  ' . $TIMESTAMP . '<br>';
echo date("Y-m-d H:i:s", $TIMESTAMP) . '<br>';

$NEW_TIMESTAMP = time() + (15 * 3600); // add 15 hours .

echo 'Current OS time is ' . date("Y-m-d H:i:s",time()) . '<br>';
echo '3 hours later is ' . date("Y-m-d H:i:s",$NEW_TIMESTAMP);
?>


結果出現
QUOTE

09 /29/2006
2006 騫碨eptember29 鏃riday
09/29/2006
09 /29/2006 20+15:55:28 Fri 29 Sep 2006 08:55:28 PM PDT PDT
------------------------------------
2006 騫搐E29 鏃g
09 /29/2006 20+15:55:28 「20060929 (秅) 205528 PDT
------------------------------------
2006 騫翠節鏈�鏃€變簲
09 /29/2006 20+15:55:28 瑗垮崖2006騫�湀29鏃� (閫變簲) 20鏅�垎28縐� PDT
1159588528 1159592128
2006-09-29 21:55:28
Current OS time is 2006-09-29 20:55:28
15 hours later is 2006-09-30 11:55:28


我想伺服器上更改時差問題看來只有最末一個方式是有效的,
另外若於前面置入
putenv("TZ=Asia/Taipei") ;

則所有的時間可以調過來,
只是一個是X*3600另一個是putenv的方式,
我試過在tchinese.php裡面改,後台訂單顯示還是有時差問題,
也試過在twe_date_long_inc.php,甚至想在orders.php裡面直接改,
都無法成功,因我對php語法不熟悉,翻了第一版的書找不到答案,
請oldpa幫個忙,感激不盡!
 



傳送簡訊Email
Top
m0_0m
  發表於: 2006-09-30, 08:57 PM
引用文章


進階會員
***

所屬群組: 註冊會員
發表總數: 179
會員編號: 5993
註冊日期: --



我也很抱歉...
上次我問過這問題 SO 很瞭解你的沮喪&失望

最後僅有好心的simmonhsu 解決了部分的顯示問題
因為那只是測試站 前台顯示正常 已經足夠我應付客戶了..


套用 OSC論壇某位大大所言
﹝ 修改這個問題是要花很大的 effort . 對我來說 -- 它不值得! ﹞
也許TWE .....

SO 這方面目前真的是很難解決..

------------------------------------
又.. 我想後台訂單 的部分要由 寫入資料庫的時間 那下手 ...

又又.. 不知道可不可以請主機商處理? 
------------------------------------
話說回來
oldpa 新的2.3書 不知道有沒有關於這方面的修正
------------------------------------

一整個哀怨 省錢不一定省事...
天黑的..像不會再天亮了...

傳送簡訊Email
Top
Alexander
  發表於: 2006-09-30, 10:32 PM
引用文章


版主
***

所屬群組: 註冊會員
發表總數: 479
會員編號: 1321
註冊日期: --



Hi all,

Charson 其實都快解決了....我推你一把吧

1.首先tchinese.php再最上面加上這一行
putenv("TZ=Asia/Taipei") ;

2.修改checkout_process.php


找到
'date_purchased' => 'now()',
改成
'date_purchased' => date("Y-m-d H:i:s"),

注意這部份至少有兩處....

解釋一下為什麼putenv("TZ=Asia/Taipei") 會沒作用....
因為它只能影響php,可是'now()'是Mysql的語法....他還是抓伺服器的時間 ㄏㄏ

本篇文章已被 Alexander 於 2006-10-01, 05:25 AM 編輯過
傳送簡訊Email
Top
m0_0m
發表於: 2006-10-01, 02:26 AM
引用文章


進階會員
***

所屬群組: 註冊會員
發表總數: 179
會員編號: 5993
註冊日期: --




我查了一下 2.3的版本 全部檔案中有使用到 now() 的地方
找到 268個 (因為有複製個檔備份 可能有虛增)

例如create_account.php 就有找到多處..

QUOTE
$db->Execute("insert into " . TABLE_CUSTOMERS_INFO . " (customers_info_id, customers_info_number_of_logons, customers_info_date_account_created) values ('" . (int)$customer_id . "', '0', now())");


像這樣子散佈在各檔案中的now() 可以直接全部都取代掉嗎?

BTW
假設他存入資料庫用了 Y-m-d H:i:s
取出資料顯示的時候 會 DATE_FORMAT_LONG , DATE_FORMAT_SHORT 的設定顯示嗎?
(Charson 麻煩你測試一下~ 我目前沒有站在國外主機.. )



天好像要亮了 ^_^
傳送簡訊Email
Top
Charson
發表於: 2006-10-01, 10:30 AM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



m0_0m,天亮了!
感謝Alexander!

難怪用了那麼多方式都無效,TWE在寫入時間都是用now()函數,
在訂購過程中,對應的檔為checkout_process.php,
裡面有三處,分別為:

QUOTE

155行  'date_purchased' => 'now()',
201行  'date_purchased' => 'now()',
226行  'date_added' => 'now()',


所以依據之前PHP那段語法實驗的結果,
若不用putenv的方式,我猜直接將'now()',改成如下兩種方式應該都可以。
QUOTE

date("Y-m-d H:i:s",time()+(15*3600)),

或是
QUOTE

$gmt = time() + (15 * 3600); // add 15 hours .
date("Y-m-d H:i:s",$gmt),


不過用putenv的方式較簡單且主機在國內外都沒關係。
而另外加時差的方式,若主機在國內,就又快了。

若如m0_0m所說,2.3版全部檔案有兩百多個,
是否建議oldpa未來的版本用後台的方式處理時差問題,
這樣就更棒了!實在蠻喜歡TWE的...~

感謝了!
傳送簡訊Email
Top
Charson
發表於: 2006-10-01, 11:12 AM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



剛剛找了一下,有now()字串的*.php檔者並沒有m0_0m兄說的那麼多啊?

在此列出來供各位參考:

QUOTE

...\twecommerce\account_edit.php(114)
...\twecommerce\account_password.php(63): 
...\twecommerce\create_account.php(233):
...\twecommerce\create_account.php(263):                
...\twecommerce\create_account.php(265):                 
...\twecommerce\create_account.php(278):
...\twecommerce\create_guest_account.php(232):
...\twecommerce\gv_redeem.php(64):    
...\twecommerce\login.php(72):       
...\twecommerce\orders.php(112):
...\twecommerce\product_reviews_write.php(46):      
...\twecommerce\redirect.php(66):

註:括弧中是行數


另外,其實也不用在後台多設更改時差問題的選項,
因為若用putenv的方式應該國內外或相差多少的時差應都可適用吧?
除非是較舊的PHP版本伺服器不認識putenv...

傳送簡訊Email
Top
Charson
發表於: 2006-10-01, 11:17 AM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



對不起,再補充一下,
我想用sql語法的方式導入資料庫應該也行,
但sql語法的部分我就更不懂了...
傳送簡訊Email
Top
Charson
發表於: 2006-10-01, 12:24 PM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



再發問:
如果我想更改Mysql now()的方式,想先作一個時差的定義:
QUOTE

define ('NOW', gmdate ('Y-m-d H:i:s', time())); // 當putenv() 有用時

QUOTE

define ('NOW', gmdate ('Y-m-d H:i:s', time() + 15 *3600)); //當putenv() 無用時

然後再將程式中有用到now()的部分,
now()改為'".NOW."'

1.我需要將這個定義放在哪一個檔案?是tchinese.php或是twe_date_long_inc.php?或application_top.php?

2.另外time()的部分呢?是否也需一併定義及更改?

因為搜到相關討論串,不過是OScommerce的,
請參考http://forums.oscommerce.com/index.php?showtopic=32920

對不起,還不是很瞭解購物車系統的架構...
傳送簡訊Email
Top
Alexander
發表於: 2006-10-01, 02:02 PM
引用文章


版主
***

所屬群組: 註冊會員
發表總數: 479
會員編號: 1321
註冊日期: --



你的主機不認識putenv()嗎?自己手動加不是個好方法
要定義NOW建議你放在include/applicatopn_top.php裡面
但是請務必至於語系定義引入的位置之下
傳送簡訊Email
Top
Charson
發表於: 2006-10-01, 04:22 PM
引用文章


一般會員
**

所屬群組: 註冊會員
發表總數: 18
會員編號: 7577
註冊日期: --



謝謝Alaxander,
我的主機是認得putenv,只是好奇因查到OScommerce的論壇有人提及,
若未來遇到不認得putenv的情況,是否可以試試這種方式?
我已將所有有now()的程式全部改成'".date("Y-m-d H:i:s")."',
目前運作上一切正常,所有需要取得日期的部分應該都可以正常顯示台灣的時間才是!

不過time()的部分呢?
是不是也需要一併改?
只有三個檔案,create_account.php,download.php及login.php
傳送簡訊Email
Top
m0_0m
發表於: 2006-10-01, 10:18 PM
引用文章


進階會員
***

所屬群組: 註冊會員
發表總數: 179
會員編號: 5993
註冊日期: --



剛找了 07/03 下載的版本 twecommerce2.3-utf8.zip
再可以搜尋的1517個文件中 找到 now() 208個

-------------------------
沒辦法上傳圖片 懶的貼...

includes\modules\payment 多個檔案皆有多處 (會不會影響付款模組的時差?)
例 atm.php 行108~115

admin、inc 資料夾下有、gv_send.php 有 ....
總之 找到的有這麼多個...搞不清楚沒有影響...

-------------------------

time()
因為它是php函式 所以會受putenv() 影響 //Alexander大教的 不知道我有沒有又學壞了..

-------------------------
我覺得 putenv() 比較好 這樣要搬家的話就不用改...
傳送簡訊Email
Top
Alexander
發表於: 2006-10-01, 11:02 PM
引用文章


版主
***

所屬群組: 註冊會員
發表總數: 479
會員編號: 1321
註冊日期: --




汗~我還以為mysql那時候多了一個time()咧?

果然三人行必有我師阿~
傳送簡訊Email
Top
1 位使用者正在閱讀本主題 (1 位訪客及 0 位匿名使用者)
0 位會員:

主題選項 發表回覆建立主題發起投票