アプリ版:「スタンプのみでお礼する」機能のリリースについて

初心者です。
こういうタイトルの質問で良いかもちょっと疑問です、すみません。
現在の時間を取得しようとして
$now = new DateTime();
とすると、
DateTime Object
(
[date] => 2011-03-06 15:36:11
[timezone_type] => 3
[timezone] => Asia/Tokyo
)
が返されます。
これは配列かと思って
$now['date']
とするとFatal error: Cannot use object of type DateTime as array in.....となってしまい、ここで配列ではなくオブジェクトだということに気付き、
$now->date
など、色々と試行錯誤していますが、現在の時間を取得することができません。
どなたか教えていただけますでしょうか?

A 回答 (3件)

なるほど、紛らわしいですよね。


まず、先に日時の表示ですが、

echo $now->format(DateTime::W3C);

こんなふうに書いてみましょう。
多分 2011-03-06T15:36:11+09:00 こんな表示がされるかと思います。

これはタイムゾーンを含んだ表示がされています。
世界で決めた基準時間よりも9時間進んでますよという表現がW3Cという団体が決めたフォーマットで表示されています。
#時間の表現は今回のお題では無いと思うので、この辺にしておいて。

さて、なんだこれってのを説明しなくてはならないのですが
質問の配列と思った内容って var_dump($now) したときの結果ですよね。
これはオブジェクトの内部で持っているプロパティが表示されているんです。

で、「オブジェクトは、データと操作がセットになっている」と思ってください。
配列はデータのみですから、この点が違いますね。

で、DateTimeオブジェクト(データが入っていないのでクラスという言い方がいいですね)
の説明は http://jp.php.net/manual/ja/class.datetime.php こんな風に書かれてます。

最初にクラス概要とありますが、概要なのでその先に進んで「定義済み定数」があって、そこに先程の DateTime::W3C なんかがチラッと見えたりします。
変数じゃなくて定数なので、これはずっと決まった値です。

で、その先の「目次」からが、このクラスの操作。メソッドと呼ばれるものです。
先ほどの format も
「DateTime::format — 指定した書式でフォーマットした日付を返す」
とありますね。

「DateTime::format」をクリックして先にするんでみると、メソッドの詳細が書かれています。
「public string DateTime::format ( string $format )」
こんな感じ。

これは、format()の括弧の中に フォーマットを表す文字列を与えると、整形して日時を返してくれるということです。

で、皆が使う(つーか世界標準的な)フォーマットは、先程の定数であらかじめ、名前を付けて定義しているということです。

なので
echo $now->format('Y年m月d日 H時i分s秒');
ってのもアリです。

でこの元となるデータが先ほどの var_dump()の結果のプロパティです。

オブジェクトとかクラスと言いましたが、ざっくり
- クラス - 中身の入っていないお弁当箱(おかずの配置に決まり有り)
- オブジェクト - 中身が詰まったお弁当(インスタンスと言われることもある)
こんなイメージでいいかと。
なので、クラスを定義する→お弁当箱の仕切りを決める。
new する。インスタンスを取る。オブジェクトを作る→ご飯とかおかずを詰める
こんな感じで。(後からおかずをトッピングすることもあり)

で、メソッド「DateTime::format(String $format)」の読み方に戻りますが、public string って始まっていますね。
string は結果は文字列で返しますよという意味ですが、public ってのは権限を表しています。
public の他に protected, private とありますが、オブジェクトの外から影響を与えらるのが public です。その他2つはオブジェクトの内部で作用する権限です。

例えば、「DateTime::format(String $format)」では、引数パラメータ $format を解析して、年とか月とかを割り当てなければなりませんね。それを別メソッドとして書いたほうがスッキリまとまると思いますが、そんなメソッドが定義されていると、なんだか使ってみたくなりませんか?その結果肝心の format の戻り値が正確な時間じゃなくなったら困ります。ということで、内部だけに作用する権限にされていると思います。

長文になってしまいましたが、こんなこともできます。
<?php
class MyDateTime extends DateTime {
const myFormat = 'Y年m月d日H時i分s秒';
public function __toString() {
return $this->format(self::myFormat);
}
}

$now = new MyDateTime();
echo $now;
?>

ちょっと勉強が必要かもしれませんが、PHPのマニュアルにもいろいろ書かれてますから、遊んでみてください。
    • good
    • 2
この回答へのお礼

非常に丁寧な解説、ありがとうございました。
凄く分かりやすいです。
勉強します!!!

お礼日時:2011/03/06 18:44

$now = new DateTime();


$now->modify("+1 day");
echo $now->format("Y-m-d");
です
    • good
    • 1
この回答へのお礼

ありがとうございました。
おかげさまでできました。

お礼日時:2011/03/06 18:52

マニュアルを読みましょう。


http://jp2.php.net/manual/ja/class.datetime.php

日時を取り出すなら、↓ですね。
http://jp2.php.net/manual/ja/datetime.format.php

DateTimeクラスを使うのが目的でなければ、普通の日時関数を使うのがわかりやすいでしょう。
http://jp2.php.net/manual/ja/ref.datetime.php
    • good
    • 0
この回答へのお礼

ありがとうございました。
おかげさまでできました。

お礼日時:2011/03/06 18:53

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