台灣最大程式設計社群網站
線上人數
1889
 
會員總數:246050
討論主題:189633
歡迎您免費加入會員
討論區列表 >> PHP >> strtotime回傳值問題
[]  
[我要回覆]
1
回應主題 加入我的關注話題 檢舉此篇討論 將提問者加入個人黑名單
strtotime回傳值問題
價值 : 50 QP  點閱數:827 回應數:9
樓主

迷路
高級專家
11226 137
7561 1743
發送站內信

捐贈 VP 給 迷路
碰到需要將資料庫中的時間欄位(格式為time)轉換成文字的需求
一開始用
date("H:i",strtotime("24:00:00"));
結果輸出
08:00

非常納悶,難道說是PHP只能用00:00:00,不能用24:00:00?
所以用另外一個測試專用的網站去測試
date("H:i",strtotime("24:00:00"));
結果輸出
00:00
意料中的結果

再進一步測試時間輸出
strtotime("24:00:00");
結果有問題的網站輸出空白
測試用網站輸出
1421856000

比較一下兩個網站的伺服器版本
有問題的是5.2.17
測試用的是5.4.35

請問是伺服器版本問題?還是php.ini的設定問題?

本篇文章發表於2015-01-21 18:33
1樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
時區問題啦~~~

你的php時區因該沒設定。
本篇文章回覆於2015-01-21 22:52
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
2樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
檢查兩個網站的phpinfo
在date部分有差異的如下

"Olson" Timezone Database Version
有問題的是2014.6
沒問題的是2014.8

Timezone Database
有問題的是external
沒問題的是internal

Default timezone
有問題的是Asia/Chongqing
沒問題的是Asia/Taipei

date.timezone
有問題的是no value和no value
沒問題的是Asia/Taipei和Asia/Taipei

看起來最有可能的是date.timezone
不過有問題的網站,下列程式都正確取得值
date("Y-m-d H:i:s");
time();
date("H:i","00:00:00");
date("H:i","12:00:00");

星空大,我只要請主機商把date.timezone補上設定就能正常顯示嗎?
本篇文章回覆於2015-01-22 09:51
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
3樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
timezone就是設定所在時區。
不過理論上 Asia/Chongqing 因該也是在+8區才對。

可以先用date("Y-m-d H:i")看看主機的時間對不對。
不對的話,再請主機商調整一下看看。
本篇文章回覆於2015-01-22 18:53
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
4樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
就是因為兩個都是+8時區,所以我才會猜是另外那個date.timezone沒設定
date("Y-m-d H:i:s");
有確認過是正確的
本篇文章回覆於2015-01-23 09:10
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
5樓
最有價值解答

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
那只好檢查linux內的設定了


etc/ntp.conf: 就是 NTP 伺服器的主要設定檔,也是唯一的一個
這個可以略過。除非你有用ntp

/usr/share/zoneinfo/: 由 tzdata 所提供,為各時區的時間格式對應檔。 例如台灣地區的時區格式對應檔案在 /usr/share/zoneinfo/Asia/Taipei 就是了!這個目錄裡面的檔案與底下要談的兩個檔案 (clock 與 localtime) 是有關係的喔!
這個是主要的,得看是否有提供Asia/Chongqing的設定。且也得確定內的設定也是+8時區的

/etc/sysconfig/clock: 設定時區與是否使用 UTC 時間鐘的設定檔。 每次開機後 Linux 會自動的讀取這個檔案來設定自己系統所預設要顯示的時間說!舉個例子來說, 在我們台灣地區的本地時間設定中,這個檔案內應該會出現一行『ZONE="Asia/Taipei"』的字樣, 這表示我們的時間設定檔案『要取用 /usr/share/zoneinfo/Asia/Taipei 那個檔案』的意思!

/etc/localtime: 這個檔案就是『本地端的時間設定檔』啦!剛剛那個 clock 檔案裡面規定了使用的時間設定檔 (ZONE) 為 /usr/share/zoneinfo/Asia/Taipei ,所以說這就是本地端的時間了,此時 Linux 系統就會將 Taipei 那個檔案複製一份成為 /etc/localtime ,所以未來我們的時間顯示就會以 Taipei 那個時間設定檔案為準。


不過基本上上面的設定都是需要有root的權限才能動到。如果你沒有root的權限。可能只能麻煩主機商給你設定了。
你可以先裝個探針看看。我猜測你這是內陸的主機商。那邊很常沒注意到這個問題。有可能是因作業系統沒設定到+8時區的影響。
我曾經還幫客戶的主機商教要怎麼去設定。(有點混的主機商)

如果你沒root。基本上將問題給主機商處理就好。他們會處理才對。除非是真的兩光的主機商。
本篇文章回覆於2015-01-24 13:45
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
6樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
感謝星空大的回答
對於主機部分實在非常陌生,星空大的回答讓我受益良多
現在請主機商的工程師幫忙檢查調整設定
本篇文章回覆於2015-01-26 10:29
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
7樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
主機商工程師回覆
這個不是設定的問題
PHP5.3.0的strtotime()有調整
24:00:00變成非合法格式
本篇文章回覆於2015-01-26 16:54
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
8樓
回應

浩瀚星空
捐贈 VP 給 浩瀚星空 檢舉此回應
抱歉~~~我倒是沒注意到你是24:00

不過那工程師因該是說錯了。或是你理解錯誤了。
其實5.3版後的php。已經可以幫你換算24:00的時間了。
5.3之前的 24:00是一個不正確的格式。會回傳「否」值

但這也不能解釋你會變成08:00的時間。

原則上先用探針測試看看。原本strtotime這個函數,只是偷懶用的函數。多少也很容易發生解析錯誤的問題。
所以也就見仁見智了。
本篇文章回覆於2015-01-26 23:59
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
9樓
作者回應

迷路
捐贈 VP 給 迷路 檢舉此回應
沒錯是我弄反了
能正確顯示24:00的是5.4版的主機
會有問題的是5.2版的主機

單純strtotime時
可以換算的能夠出現秒數"1422374400"
會有問題的就沒有顯示任何東西

以date()去轉換字串,strtotime()有問題時似乎被當成0秒來處理
因此變成"1970-01-01 08:00:00"
PHP5以上似乎會是1970年第一天第0秒,因為是+8時區,所以變成08:00
以上是我的想法
本篇文章回覆於2015-01-27 12:23
== 簽名檔 ==
--未登入的會員無法查看對方簽名檔--
   
1

回覆
如要回應,請先登入.