PHPでdateとgmdate、どちらを使う?

このQ&Aのポイント
  • PHPで日本時間の時刻や日付を扱う際、date関数とgmdate関数のどちらを使うべきか迷っている方へ
  • date関数は動かしているパソコンの設定ファイル次第で結果が変わる可能性があるため、情報の信頼性が低い
  • gmdate関数は日本時間との時差を気にする必要がなく、確実に日本時間の時刻や日付を取得できる
回答を見る
  • ベストアンサー

PHPで、dateとgmdate、どちらを使う?

12月8日の午前0時台に、下記のプログラムを実行しました。 $strYear=date("Y"); $strMonth=sprintf("%02d",date("n")); $strDay=sprintf("%02d",date("j")); echo $strYear.$strMonth.$strDay; すると、20111207と表示されました。8日にならなかったわけです。 どうやら、date関数は動かしているパソコンの設定ファイル次第で結果が変わってくると分かりました。 よく似た関数に、gmdateがありますよね。こちらは、明確に日本時間と何時間ずれるか分かっています。 そこで質問なのですが、日本時間の時刻や日付を扱うプログラムを組むとき、どちらの関数を使っていますか? gmdateの方が、動かしているパソコンの環境を考えなくていいので、使うならgmdateかなあ? と思うのですが…。

  • PHP
  • 回答数3
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • bm_hiro
  • ベストアンサー率51% (200/388)
回答No.1

いつもは date のほう使いますね。 gmdate なんて関数の存在すら知らなかったってのは秘密です。 > すると、20111207と表示されました。8日にならなかったわけです。 タイムゾーン間違ってたんじゃないですか?と思ってみたり。 ちなみに、↓ これ $strMonth=sprintf("%02d",date("n")); $strDay=sprintf("%02d",date("j")); ↓これで 良くないですか?とも思ってみたりみなかったり。 $strMonth=date("m"); $strDay=date("d") 俺が いつも 使う書き方は date("Y-m-d") です。

dv8hjkwf
質問者

お礼

m、dを使用することで、2ケタ表記になりました。 タイムゾーンをチェックしてみます。

その他の回答 (2)

  • shimix
  • ベストアンサー率54% (865/1590)
回答No.3

dateを使いますね。もしdateでズレがあるようなら(そういうサーバ設定なら)自分で設定を上書きするか(それが出来ないサーバなら)補正します。 正直、サーバ設定がJST以外のサーバにはあまり縁がありません。とりあえず国内では困ったことがないです。

dv8hjkwf
質問者

お礼

了解しました。助言に感謝します。

  • ts3m-ickw
  • ベストアンサー率43% (1248/2897)
回答No.2

date()を使ってますよ。 わざわざ日本時間に変更する面倒がありませんから。 date()で正しい日時が表示されないのなら、 パソコン(またはサーバ)の時計が正確でないか、 php.iniの中でタイムゾーンの設定がAsia/Tokyoになってないか、 を真っ先に疑ってみるべきだと思います。 あと、"n"、"j"じゃなくて"m"、"d"を使えば整形する必要ないです。

dv8hjkwf
質問者

お礼

確認しました。m、dの方が簡単ですね。手間が省けました。

関連するQ&A

  • 教えてください。PHPの改造をしています。

    教えてください。PHPの改造をしています。 下記で日付の表示内容を決定しています。 まずは「$format = "y/m/d G:i";」と指定し、 表示については、下記となっています。 $row['date'] = gmdate($format, $ptime+9*3600); 上記だと、数値を0と置いたときに、1970年1月1日 9:00 となってしまい、Aなどの文字を置いても、同じく 1970年1月1日 9:00 が出てきます。 やりたいこと。 ある文字を置いたら時間が出てこないようにしたいと 考えています。「文字を置いたらその文字が出てくる」 または、「0だと何も出てこない」などです。 初心者なので良く分からないまま $row['date'] = if(is_numeric($dt)){ gmdate($format, $ptime+9*3600); } } else { echo "AAA"; } としてみたのですが、何も表示されなくなってしまいました。 (dtは文字のある場所) 私の希望する表示(時間を出さない方法)を教えてください。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • PHP時間の比較

    お世話になっております。 毎度、毎度、どうも日付や時間の比較で戸惑ってしまいます; 今回はPHPの時間の比較なのですが。 現在の時刻が午前8:00より前か後かで処理を分けたいと思っております。 $totime =date("H:i"); IF($totime > "8:00"){ echo "8:00より後"; } else { echo "8:00より前"; } というような感じで書いたのですが。 $totimeが10:00のときelse処理を通ってしまいます… ご教授願います;;

    • ベストアンサー
    • PHP
  • php date関数について

    xamppを使ってphpを勉強している初心者です。 date関数についてわからない現象が起きてしまいました。 以下のように記入したところ  $date = date("Y n d");  echo $date; ブラウザには次のように表示されてしまいます。  12013 6 18   ↑ 先頭の「1」がどうして付いてしまうのかわかりません。 どなたかご存知の方がいましたら教えて頂きたいと思います。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • php メールフォーム日付チェック方法

    現在メールフォームで生年月日を記述しており、生年月日の値を確認画面に渡し、確認画面にて日付チェックをして、日付が間違っていたらフォーム画面に戻るということをやりたいのですが、日付チェックの部分で困っています。 例→2月20日は○  →2月30日は× form.php <?php //年の入力 print '<select name="year">' . "\n"; $start = date('Y') -29; $end = date('Y') -16; for ($i = $start; $i <= $end; $i++) { print '<option value="' . sprintf("%04d",$i) . '">' . sprintf("%04d",$i) . '</option>' . "\n"; } print '</select>年' . "\n"; //月の入力 print '<select name="month">' . "\n"; for ($i = 01; $i <= 12; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>月' . "\n"; //日の入力 print '<select name="day">' . "\n"; for ($i = 01; $i <= 31; $i++) { print '<option value="' . sprintf("%02d",$i) . '">' . sprintf("%02d",$i) . '</option>' . "\n"; } print '</select>日' . "\n"; ?> confirm.php //生年月日をチェック if (checkdate($month, $day, $year)) { $error[] = '生年月日が正しくありません。'; } という記述です。 この記述方法ですと、 2月20日は「生年月日が正しくありません。」とでてきますが、 2月31日を指定すると確認画面を通過できるという謎の状態になっています。 できれば閏年の計算もできる方法もお願いします。 どうかご教授お願いします。

    • ベストアンサー
    • PHP
  • ロレックス、デイトジャストの日付け合わせについて

    ロレックスのデイトジャスト(日付けあり)を最近購入しましたがたまにしかつけることがなく、つけたらゼンマイを巻かないのでとまってしまいます。 つけるときに時刻・日付を合わせるのですが、説明書には午前0時に日付が変わってから午前6時までと、針を反時計回りに回し、午前0時に日付が戻り始めてから午後4時までは、カレンダーの早送りは控えてくださいとあります。 例えば、日付が10日、針が4時で止まった状態で、時計を午前10時30分と日付を15日にしたい場合以下の手順でよいでしょうか? (1) 時刻を時計回りで回しながら0時まで回す。針が0時にきた時点で日付けが変われれば、その時点で午前0時と分かる。 (2) 午前0時すぎまで回して午前か午後か判断できたら、午前6時過ぎ(午前9じぐらい?)までいったん針を回す。 (日付けを早送りしていけない時間帯まで針をもってくる。 (3) 早送りしていけない時間をさけた所まで針をもってきてから、日付を15日に合わせる。 (4) 日付あわせが終わったら、針を時計回りに動かして、あわせたい時間(10時30分)に合わせる。 (5) ゼンマイを巻く このような手順で問題ないでしょうか?

  • 日付をPHPに渡す

    下記のようなPHPとHTMLがあります。 HTMLに日付を指定できるフォームを設置しており、ここに入力されたデータを、 PHPの日付の部分に渡せるようにしたいと思っております。 <?PHP //言語設定、内部エンコーディングを指定する mb_language("japanese"); mb_internal_encoding("UTF-8"); //ライブラリ include('googleanalytics.class.php'); //アカウント $ga = new GoogleAnalytics('ID','PW'); $ga->setProfile('ga:GAID'); //日付指定 $today1 = mktime(0, 0, 0, date("m"), date("d")-30, date("Y")); $today2 = mktime(0, 0, 0, date("m"), date("d")-30, date("Y")); $g1 = date("Y-m-d", $today1); $g2 = date("Y-m-d", $today2); $ga->setDateRange($g2,$g1); //読み込み $report = $ga->getReport( array('dimensions'=>urlencode('ga:keyword'), 'metrics'=>urlencode('ga:visits,ga:pageviews'), 'sort'=>'-ga:pageviews' ) ); //表示 echo "<html><head><meta content='text/html; charset=UTF-8' http-equiv='Content-Type'/>"; echo "</head><body>"; echo "キーワード:セッション数:ページビュー数<BR>- - - - - <BR>"; foreach( $report as $d => $m ){ echo $d; foreach( $m as $a => $b ){ echo " : ".$b; } echo "<BR>"; } echo "</body></html>"; ?> <html> <br> ■ 期間 <form action="gaapisample.php" method="post"><label>日付(type="date1"):<input type="date" name="date"></label> <br> <form action="gaapisample.php" method="post"><label>日付(type="date2"):<input type="date" name="date"></label> <input type="submit" value="期間設定"></form> </html>

    • 締切済み
    • PHP
  • 0を自動的に入れたいのですが・・

    <script language="javascript"> <!-- var dtToday = new Date; var strMonth; var strDate; var strDay = new Array("<font color=\"red\">日</font>","月","火","水","木","金","<font color=\"blue\">土</font>"); var strHours; var strMinutes; strMonth = dtToday.getMonth() + 1; strDate = dtToday.getDate(); strHours = dtToday.getHours(); strMinutes = dtToday.getMinutes(); document.write(strHours+"時"+strMinutes+"分  "+strMonth+"月"+strDate+"日 "+strDay[dtToday.getDay()]+"曜日"); //--> </script> あまりスクリプトに関しては詳しいではありません。 コピーペーストを元に時刻の部分を予測で自分で手を加えたものですが、 「0」をどうやって入れるかがわかりません。 このままだと、 6時1分 9月1日土曜日  とはなりますが、できれば、時刻の部分を 06:01 としたいと思っています。 必ずしもこのスクリプトでなくてもかまいません。 「0」さえ付いてくれればよいのですが・・。 どうぞよろしくご教授ください、お願いします。

  • 明日・明後日・明々後日

    <script language="javascript"> <!-- //変数宣言 var dtToday = new Date; var strMonth; var strDate; var strDay = new Array("<font color=\"red\">日</font>","月","火","水","木","金","<font color=\"blue\">土</font>"); //年月日を取得 strMonth = dtToday.getMonth() + 1; strDate = dtToday.getDate(); stsDate = dtToday.getDate() + 1; sttDate = dtToday.getDate() + 2; stuDate = dtToday.getDate() + 3; document.write("■"+strMonth+"月"+strDate+"日 "+strDay[dtToday.getDay()]+"曜日のお勧め<br>"); document.write("■"+strMonth+"月"+stsDate+"日 "+strDay[dtToday.getDay() +1]+"曜日のお勧め<br>"); document.write("■"+strMonth+"月"+sttDate+"日 "+strDay[dtToday.getDay() +2]+"曜日のお勧め<br>"); document.write("■"+strMonth+"月"+stuDate+"日 "+strDay[dtToday.getDay() +3]+"曜日のお勧め"); //--> </script> まず前提として、あまりスクリプトには詳しくありません。 とあるサイトのコピーペーストをもとに、「明日・明後日・明々後日」の部分の表示を推測で手を加えました。 一応ちゃんと表示されていました。 御察しかとは思いますが、今日が木曜で明々後日が日曜日です。 さっき気づいたのですが、日曜は 0 なので「日」ではなく「undefined」となってしまいました。 このままだとたぶん月末に、日にちも同じになるかと思います。 スクリプトはもっと勉強したいとは思ってますが、なかなか時間がさけず行き詰ってしまいました。 ・曜日  6 の次を 0 にする。 ・日にち 28 29 30 31 の次を 1 にする。 ということは察しがつきます。方法を御教授ください。よろしくお願いします。

  • CGIについて(時間表示)

    CGI初心者ですが、掲示板を作成中です。投稿するたびにメッセージの投稿時間がすべて現在時刻に書き換わります。 メッセージ毎に時間表示させたいのですが、いかのプログラムのどこを変更すればよいのでしょうか?宜しくお願いいたします。 # 時間処理 sub totime { ($sec,$min,$hour,$mday,$month,$year,$wday,$yday,$isdst) = localtime(time); $year +=1900; $month++; $year = sprintf("%04d", $year); $month = sprintf("%02d", $month); $mday = sprintf("%02d", $mday); $hour = sprintf("%02d", $hour); $min = sprintf("%02d", $min); $sec = sprintf("%02d", $sec); $date = "$month/$mday $hour:$sec"; }

    • ベストアンサー
    • CGI
  • PHP  date関数を変数に代入

    下記のようにerror_log関数に、日付やホスト名を出力させようようとしています。 $log_messageに、date関数や_SERVER変数を入れたいのですが、構文エラーとなります。 Parse error: syntax error, unexpected '(', expecting ',' or ';' … -------------------- private static $log_message = date("Y/m/d l H:i:s")."\n".$_SERVER["REMOTE_ADDR"]; (中略) error_log(("【info】".self::$log_message.$log), 3, $log_file_path); -------------------- 「"」の前を全て\でエスケープしたり、$log_message = date('YmdHis')を試したのですが、 同様でした。 記述方法で誤りがあれば、どなたかご指摘頂きたいです。

    • ベストアンサー
    • PHP

専門家に質問してみよう