質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
date

dateは、date型や日付に関する関数や処理についてのタグです

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

585閲覧

PHP7で日付を比較したい

ttpk

総合スコア338

date

dateは、date型や日付に関する関数や処理についてのタグです

Laravel

LaravelとはTaylor Otwellによって開発された、オープンソースなPHPフレームワークです。Laravelはシンプルで表現的なシンタックスを持ち合わせており、ウェブアプリケーション開発の手助けをしてくれます。

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2022/08/28 08:43

編集2022/08/30 13:58

前提

Twitter APIと連携したlaravelのサービスを開発しています

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • twitter APIで取得したレスポンスから取り出した日付をif文に使いたい

該当のソースコード

Twitter APIから最新1件のツイートを取得してそのツイートが15日以上前の物だった場合
フラグをfalseにする処理を書いています。
テストコードでtodayの日付を固定化するためcarbonを使っています。

PHP

1 $targetTweets = $twitter->get("statuses/user_timeline", $targetParameters); 2 $latestTweetTime = ''; 3 foreach ($targetTweets as $target_tweet) { 4 $latestTweetTime = new DateTime($target_tweet->created_at); 5     // レスポンスにはグリニッジの標準時刻で登録されているため時差調整 6 $latestTweetTime = $latestTweetTime->modify('+9 hours'); 7 8 9 } 10 $today = Carbon::now(); 11 $unfollow_day = $latestTweetTime->modify('+15 days'); 12 Log::debug($today->format('Y-m-d H:i:s')); 13 Log::debug($unfollow_day->format('Y-m-d H:i:s')); 14 if ($today > $unfollow_day) { 15 $chk_flg = false; 16 }

ログに出力された日付は
$today: 2022-01-07 14:24:01
$unfollow_day:2022-01-07 13:01:31
のためtodayの方が新しい日付となりif文の中の
フラグの値変更処理が動く想定ですが動いていません。

確認する箇所はどこになるでしょうか?

試したこと

回答をいただいて$unfollow_dayもcarbon化し、gtメソッドを使うようにしてみました

PHP

1 $targetTweets = $twitter->get("statuses/user_timeline", $targetParameters); 2 $latestTweetTime = ''; 3 foreach ($targetTweets as $target_tweet) { 4 $latestTweetTime = $target_tweet->created_at; 5 6 7 } 8 $today = Carbon::now(); 9 $unfollow_day = new Carbon($latestTweetTime); 10 $unfollow_day = $unfollow_day->addDays(15); 11 $unfollow_day = $unfollow_day->addHours(9); 12 Log::debug($today->format('Y-m-d H:i:s')); 13 Log::debug($unfollow_day->format('Y-m-d H:i:s')); 14 var_dump($today->gt($unfollow_day)); 15 var_dump($today->lt($unfollow_day)); 16 if ($today->gt($unfollow_day)) { 17 Log::debug('到達確認'); 18 $chk_flg = false; 19 }

ログに出力された日付は
$today: 2022-01-07 14:24:01
$unfollow_day:2022-01-07 13:01:31
のためtodayの方が新しい日付ですが
var_dump($today->gt($unfollow_day));
はfalseを
var_dump($today->lt($unfollow_day));
はtrueを返しています

また、$todayの日付の方が古いテストパターンも試しました
$today: 2022-08-30 22:54:48
$unfollow_day:2022-09-14 01:37:00
ところがこちらも
var_dump($today->gt($unfollow_day));
はfalseを
var_dump($today->lt($unfollow_day));
はtrueを返しています

補足情報(FW/ツールのバージョンなど)

Laravel v8.83.23
PHP v7.4.18

twitter APIからのレスポンス

https://developer.twitter.com/en/docs/twitter-api/v1/tweets/timelines/api-reference/get-statuses-user_timeline

"created_at": "Thu Apr 06 15:28:43 +0000 2017",
を取得して比較に使用しています

JSON

1[ 2 { 3 "created_at": "Thu Apr 06 15:28:43 +0000 2017", 4 "id": 850007368138018817, 5 "id_str": "850007368138018817", 6 "text": "RT @TwitterDev: 1/ Today we’re sharing our vision for the future of the Twitter API platform!nhttps://t.co/XweGngmxlP", 7 "truncated": false, 8 "entities": { 9 "hashtags": [], 10 "symbols": [], 11 "user_mentions": [ 12 { 13     中略 14 } 15 ], 16 "urls": [ 17 { 18     中略 19 } 20 ] 21 }, 22 "source": "<a href="http://twitter.com" rel="nofollow">Twitter Web Client</a>", 23 "in_reply_to_status_id": null, 24 "in_reply_to_status_id_str": null, 25 "in_reply_to_user_id": null, 26 "in_reply_to_user_id_str": null, 27 "in_reply_to_screen_name": null, 28 "user": { 29 "id": 6253282, 30 "id_str": "6253282", 31 "name": "Twitter API", 32 "screen_name": "twitterapi", 33 "location": "San Francisco, CA", 34 "description": "The Real Twitter API. I tweet about API changes, service issues and happily answer questions about Twitter and our API. Don't get an answer? It's on my website.", 35 "url": "http://t.co/78pYTvWfJd", 36 "entities": { 37 "url": { 38 "urls": [ 39 { 40      中略 41 } 42 ] 43 }, 44 "description": { 45 "urls": [] 46 } 47 }, 48 中略 49 }, 50 "geo": null, 51 "coordinates": null, 52 "place": null, 53 "contributors": null, 54 "retweeted_status": { 55 "created_at": "Thu Apr 06 15:24:15 +0000 2017", 56 "id": 850006245121695744, 57 "id_str": "850006245121695744", 58 "text": "1/ Today we’re sharing our vision for the future of the Twitter API platform!nhttps://t.co/XweGngmxlP", 59 "truncated": false, 60 "entities": { 61 "hashtags": [], 62 "symbols": [], 63 "user_mentions": [], 64 "urls": [ 65 { 66     中略 67 } 68 ] 69 }, 70     中略 71 "entities": { 72 "url": { 73 "urls": [ 74 { 75 "url": "https://t.co/66w26cua1O", 76 "expanded_url": "https://dev.twitter.com/", 77 "display_url": "dev.twitter.com", 78 "indices": [ 79 0, 80 23 81 ] 82 } 83 ] 84 }, 85 "description": { 86 "urls": [ 87 { 88       中略 89 } 90 ] 91 } 92 }, 93     中略 94 }, 95    中略 96 }, 97   中略 98 }, 99 { 100 "created_at": "Mon Apr 03 16:09:50 +0000 2017", 101 "id": 848930551989915648, 102 "id_str": "848930551989915648", 103 "text": "RT @TwitterMktg: Starting today, businesses can request and share locations when engaging with people in Direct Messages. https://t.co/rpYn…", 104 "truncated": false, 105 "entities": { 106 "hashtags": [], 107 "symbols": [], 108 "user_mentions": [ 109 { 110     中略 111 } 112 ], 113 "urls": [] 114 }, 115    中略 116 "entities": { 117 "url": { 118 "urls": [ 119 { 120      中略 121 } 122 ] 123 }, 124 "description": { 125 "urls": [] 126 } 127 }, 128     中略 129 }, 130   中略 131 "entities": { 132 "hashtags": [], 133 "symbols": [], 134 "user_mentions": [], 135 "urls": [ 136 { 137     中略 138 } 139 ] 140 }, 141    中略 142 "entities": { 143 "url": { 144 "urls": [ 145 { 146       中略 147 } 148 ] 149 }, 150 "description": { 151 "urls": [] 152 } 153 }, 154    中略 155 }, 156   中略 157 }, 158   中略 159 } 160] 161

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

phper.k

2022/08/29 13:19

$targetTweets = $twitter->get("statuses/user_timeline", $targetParameters); これが返す値がどんな形式なのかわからないと回答できません。 具体的に配列の構造がわかるようにサンプルを提示してください。
guest

回答2

0

Carbonでの日付の比較は単純に比較演算子を使用する方法は間違っていて、gt、gte、lt、lteメソッドを使います。

参考)
https://codeclub965.com/?p=1782 の日付の比較の項

if ($today->gt($unfollow_day)) {

などとするのが正しいかと思います。

投稿2022/08/28 17:23

AbeTakashi

総合スコア4537

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttpk

2022/08/29 13:13

回答ありがとうございます。 carbonライブラリのメソッドを使うように修正しましたが期待通りの結果には至っていません。。。
AbeTakashi

2022/08/30 02:46

ソース詳しく見てなかくて申し訳なかったのですが、片方はCatbonオブジェクトのインスタンスではなかったんですね。新しい方のソースコードで「期待通りの結果はこう」「実際はこうなっている」という情報があれば、回答は出てくるのではないでしょうか? gtとltが逆になってるとかだけのようにも見えますけど。
ttpk

2022/08/30 14:00

コメントありがとうございます $todayの日付の方が古いテストケースも試しましたが、 同じ結果を返してきました。。。
guest

0

自己解決

レスポンスから取った値を一旦DBに入れて取り出したところ比較できるようになりました

PHP

1 $targetTweets = $twitter->get("statuses/user_timeline", $targetParameters); 2 $latestTweetTime = ''; 3 foreach ($targetTweets as $target_tweet) { 4 $latestTweetTime = new Carbon($target_tweet->created_at); 5 $latest_tweet = new LatestTweet(); 6 $latest_tweet->tweeted_time = $latestTweetTime; 7 $latest_tweet->save(); 8 $latest_data = LatestTweet::orderBy('id', 'desc')->first(); 9 $latestTweetTime = new Carbon($latest_data->tweeted_time); 10 11 12 } 13 $today = Carbon::now(); 14 $unfollow_day = new Carbon($latestTweetTime); 15 $unfollow_day = $unfollow_day->addDays(15); 16 $unfollow_day = $unfollow_day->addHours(9); 17 Log::debug($today->format('Y-m-d H:i:s')); 18 Log::debug($unfollow_day->format('Y-m-d H:i:s')); 19 var_dump($today->gt($unfollow_day)); 20 var_dump($today->lt($unfollow_day)); 21 if ($today->gt($unfollow_day)) { 22 Log::debug('到達確認'); 23 $chk_flg = false; 24 }

投稿2022/08/30 13:59

ttpk

総合スコア338

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問