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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

5283閲覧

Laravel:Carbonの日付がずれる

Ashi

総合スコア139

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

0クリップ

投稿2019/08/30 03:51

編集2019/08/30 04:19

解決したいこと

Laravelで「Carbon」を使用して表示した日付がズレるので、正しい日時(日本時間)にしたい。

概要

SampleController.php

省略 use Carbon\Carbon; class SampleController extends Controller { public function index() { $today = new Carbon();  $log = Log::orderBy('login_at' , 'desc')->get(); $logid = Log::select('id')->get(); $todaylog = Log::whereDay('login_at' , '30')->count(); $weeklog = Log::where('login_at' , '>' , $today->subWeek() )->count(); $monthlog = Log::where('login_at' , '>' , $today->subMonth() )->count(); return view('Sample.index',[ 'today' => $today ,  'logid' => $logid, 'today' => $today , 'todaylog' => $todaylog , 'weeklog' => $weeklog , 'monthlog' => $monthlog , ]); } }

index.blade.php

<p>{{ $today }}</p>

状況

これで今日の日付(2019-08-30)が表示されるはずなんですが、
なぜか「2019-07-23」と表示されてしまいます。

※時間は実際の時間とぴったりでした。

※タイムゾーンは「Asia/Tokyo」に設定しています。

懸念

さっきまでは正しく表示されていたはずなんですが、
なぜか急にずれてしまいました。

何かトリガーになることをやったからなのでしょうが、
特に変わったことは何もしていないので不思議です・・・。

ご回答よろしくお願いします!

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

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

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

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

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

m.ts10806

2019/08/30 04:03

何もせずに変わるはずはないので、どんな些細なことでも良いので思い出せませんか? 現在30日なのであれば1週間のずれです -1weekがどこかで発生しているかもしれません。 関係がありそうなコードは他にありませんか?
FKM

2019/08/30 04:14

まず、サーバの時計が合っているか確認してみては?
Ashi

2019/08/30 04:21

m.ts10806さん コントローラーの内容をちゃんと動いていた状態に戻しましたが、時間はずれたままです。コントローラーとブレード以外は何もいじっていないので、本当によくわからないんです(すみません) その間に他にやったことも、デュアルディスプレイにPCを接続するくらいで 特に関連があるようには思えません・・・。
Ashi

2019/08/30 04:22

FKMさん 大変無知で恐縮ですが、サーバーの時計はどのように合わせればいいのでしょうか? (MacでMAMPを使った開発をしています)
Ashi

2019/08/30 04:26

MAMPのタイムゾーンをAsia/Tokyoにしましたがダメでした・・・。
m.ts10806

2019/08/30 04:30

>サーバーの時計 インストールしたPCの時計で調整できると思います。
m.ts10806

2019/08/30 04:42

回答しています(私はあくまで原因と根拠のみです)
guest

回答3

0

ミュータブルとイミュータブル。
Carbon使う時に非常に間違えやすい所。

php

1$today = new Carbon(); 2 3$today->subWeek();//←この時点で$today自身も1週間引いた値になってる。 4$today->subMonth();//←ここでさらに1ヶ月引かれる。 5 6//$todayを表示したら1週間と1ヶ月引かれた日付になる。

インスタンス化せず常にCarbon::today()などを使ったほうがいい。

php

1$weeklog = Log::where('login_at' , '>' , Carbon::today()->subWeek() )->count();

Laravelで使う場合はヘルパーがある。↑こういうよくあるミスをなくすためだしuse Carbon\Carbon;も不要になるし結局Laravelの流儀に合わせるのが一番安全。

php

1$weeklog = Log::where('login_at' , '>' , today()->subWeek() )->count();

Carbon2とLaravel5.8ならイミュータブルにもできる。
Carbonは実際使ってると色々罠があるのでよく調べたほうがいい。

投稿2019/08/30 04:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

$today->subWeek()
$today->subMonth()
の処理で一か月一週間前の日付になっている
なので$todayで処理せずに別に変数用意して処理するか
Carbon::now()->subWeek();
を$today->subWeek()の代わりに入れればどうでしょうか

そのSQLがちゃんと動いていたのかちょっと疑問です

投稿2019/08/30 04:36

date

総合スコア1820

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

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

Ashi

2019/08/30 04:58

ご指摘の部分を修正したら直りました!
guest

0

ベストアンサー

php

1$today = new Carbon(); 2$today->subWeek(); 3$today->subMonth(); 4var_dump($today); 5// object(Carbon\Carbon)#3 (3) { ["date"]=> string(26) "2019-07-23 13:32:06.454268" ["timezone_type"]=> int(3) ["timezone"]=> string(10) "Asia/Tokyo" }

引数なしsubWeek()で-1週間
引数なしsubMonth()で-1ヶ月

実行すると保持している時間を更新しているようです。

追記:
コメントに書いてありました。

@method $this subWeek() Sub one week to the instance (using date interval).

引き算は英語でsubtraction つまり「インスタンスへ-1週間」ということですね。

投稿2019/08/30 04:35

編集2019/08/30 04:42
m.ts10806

総合スコア80888

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

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

Ashi

2019/08/30 04:57

直りました! ありがとうございます!
m.ts10806

2019/08/30 05:00

ドキュメントやコードをしっかりと読んでいったほうがいいかもしれません。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問