電子書籍の厳選無料作品が豊富!

PHPを勉強中の者です。

タイトルの通りですが、date()をCronで実行しても空白の時間ができてしまい困っています。

具体的には例えば、var_dump出力すると

Tue Mar 05 01:00:00 +0000 2013…(1)
Tue Mar 05 03:00:00 +0000 2013…(2)
Tue Mar 05 07:00:00 +0000 2013…(3)
Tue Mar 05 09:00:00 +0000 2013…(4)
Tue Mar 05 13:00:00 +0000 2013…(5)
Tue Mar 05 15:00:00 +0000 2013…(6)
Tue Mar 05 21:00:00 +0000 2013…(7)

Wed Mar 06 1:00:00 +0000 2013…(8)
Wed Mar 06 3:00:00 +0000 2013…(9)
Wed Mar 06 7:00:00 +0000 2013…(10)

という(1)~(10)のString文字列があって、これを

$yesterday = date('D M d', strtotime('-1 day'));

という、昨日の日付のみを抽出する形で、当日の夜0:30に実行します。
これを毎日行うようにしています。
(例でいうと、2013年3月5日のみを抽出するのに、2013年3月6日の0:30に実行します)

自分のパソコンのxamppでテストした場合は問題なく拾えます。
この場合だと「3月5日分のみ」の(1)~(7)です。

しかし、このPHPファイルをさくらサーバーに置いてcronに設定して同じことをすると
(4)~(7)のみしか拾えません。
(1)~(3)を拾ってくれないのです。

つまり、
9:00(朝)~0:30(夜)→この時間のある記述は拾う
0:30(夜)~9:00(朝)→この時間のある記述は拾ってくれない

なぜか9:00(朝)~0:30(夜)の時間だけ
$yesterday = date('D M d', strtotime('-1 day'));
で読み込まないようで、何がこの空白の時間を生むのか分からなくて困っています。


まだPHPも慣れないため、ところどころ語弊があるような奇妙な文章だったら恐縮ですが、御存知の方がいらっしゃいましたらご教示頂けたら幸いに存じ上げます。

A 回答 (1件)

>$yesterday = date('D M d', strtotime('-1 day'));



これって(たとえば)"Tue Mar 05"といった文字列ですよね?これと提示されている文字列をどのように比較されているんでしょうか?

文字列としての「含む・含まない」とは違う比較方法じゃないかと推測するのですが(データベースに格納されている日付時刻値とか)。文字列でなく日付時刻として比較すると、提示されているのがGMT(+0000)ですからJST(+0900)とは「9時間の時差」があります。

#xamppは明示的にDateTimeZoneをTokyo/Asiaに
#指定しないとJSTにならなかった気がするので・・・

この回答への補足

agunuz様。回答ありがとうございます。

そうです。言葉足らずで申し訳ございませんでした。

TwitterAPIにて一日前の日付のみ抽出したいと試みて練習しています。

文字列の「含む・含まない」は、

$yesterday = date('D M d', strtotime('-1 day'));

if (preg_match( "/$yesterday/",$val->created_at))
{


のように比較しています。


御指摘の通り、

9:00(朝)~0:30(夜)→この時間のある記述は拾う
0:30(夜)~9:00(朝)→この時間のある記述は拾ってくれない

…なので、おそらく仰る通り、9時間の時差分が抽出されていないのだと思います。

そこでここ数日、調べつつ試行錯誤してみたのですが、どこで調節すればいいのか分からず暗礁に乗り上げてしまいました。

例えば、
$yesterday = date('D M d', strtotime('-1 day -9 hour'));
だと
→2日前全部と1日前0:30(夜)~9:00(朝)の日付のみ拾ってしまう

・1日前の拾わなかった時間を拾ってくれるが、9:00(朝)~0:30(夜)を拾ってくれない。なによりも2日前の日付を全部抽出したいわけではないのでダメ


時差の方を調節するのかと思い、

if (preg_match( "/$yesterday/",$val->created_at) - 9*60*60)
だと
→3日前の途中と2日前全部と1日前全部の日付のみ拾ってしまう

・1日前の全部の時間を拾ってくれるが、なぜか3日前から2日前全部から1日前全部まで拾うのでダメ



…それなのになぜか両方ともタイムスタンプされて表示される時間は、ツイートをした日本時間で間違いなく合致しています。

しかしなぜか、0:30(夜)~9:00(朝)の時間帯のみのタイムスタンプを

$yesterday = date('D M d', strtotime('-1 day'));

は無視するようです。

+ 9時間の時差が補正される前に対して、-1 day の命令が行ってしまっていることは分かるのですが、どこを修正すればいいのか分からず困っています。

お手数でなければご教示頂けたら幸いに存じ上げます。

補足日時:2013/03/09 03:06
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!