年の最初から数えて何週目か。年の最初の日曜日を週の最初として数える。最初の日曜日の週が01。年の最初から数えて何週目か。少なくとも4日を持つ週を年の最初の週とする。月曜日を週の最初として数える。年の最初の月曜日を週の最初として数える。最初の月曜日の週が01。メソッドを利用することができる。日付や時刻を加算するにはaddメソッドを使用します。日付からある期間を減算するにはsubtractメソッドを使用します。1);日付どうしの引き算を行うこともできます。-記号を使って普通に計算するようにできます。(演算子のオーバーロードという機能を使って実現されています。)戻り値は、DateTimeオブジェクトではなくて、期間を表すDateTime::Durationオブジェクトになります。メソッドで、期間の年月日を取得できます。$dt1;日付の引き算には2種類あります。日付にある期間を引き算(たとえば1ヶ月前)するものと、日付どうしの引き算(たとえば2008年10月10日と2009年3月14日の差)するものがあります。期間を表すオブジェクト日付と日付の間の期間はDateTime::Durationオブジェクトによって表現されます。DateTimeが日付の情報を表現するのに対して、DateTime::Durationは期間の情報を表現します。日付にある期間を加えたりある期間を引いたりした場合は、addメソッドやsubstructメソッドを使用しましたが、内部的には、DateTime::Durationオブジェクトが作成された上で演算がなされています。DateTimeオブジェクトどうしの引き算を行うと、戻り値としてDateTime::Durationオブジェクトが返却されます。記号を使ってDateTimeオブジェクトどうしの引き算を行うことができます。$dt1;以下のメソッドで期間の情報を取得できます。秒$duration->seconds;注意しないといけないことは、それぞれのメソッドは単独では意味を持たないということです。期間の日数そのものを表しているのではないということです。上記のメソッドは常に正の値を返却するので、どちらの期間が先かという判定を行うことができません。is_negativeメソッドを使用します。日付1が負$duration->is_negative期間をある単位で取得するにはin_unitsメソッドを使用します。'months');引数を2つ渡す場合は、リストコンテキストで受け取る必要があります。単位で変換可能であるのは以下の4つだけです。(1秒は1000ミリ秒)日と月は相互に変換できません。日数が月によって異なるためです。分と秒は相互に変換できそうですが、変換できません。うるう秒の存在によって、1分が61秒になることがあるためです。日付の計算は不規則な部分があるのでできるだけ単純な方法で済ますほうがよいです。日付計算を複雑にしている原因を含めて、日付計算の注意点について書いておきます。メソッドで作成されて、タイムゾーンが指定されない場合は、デフォルトのタイムゾーンは、フローティングタイムゾーンと呼ばれるものになります。フローティングタイムゾーンとは、存在するどのタイムゾーンとも関係がない、うるう秒を考慮しないタイムゾーンのことです。タイムゾーンとうるう秒を考慮する必要がない場合は、フローティングタイムゾーンを用いて計算を行えばもっとも安心だということになります。ログから年月日を取得して、3ヶ月後の年月日を取得したいといった場合、フローティングタイムゾーンで計算して問題はありません。うるう秒とは時刻は絶対的なものではなくて、地球の自転が1週したときが一日と数えますから、地球の自転が遅れると一日の長さが変わってしまいます。うるう秒とは地球の自転が年々遅れていくために、何年かに一度挿入される秒のことです。うるう秒が考慮されているタイムゾーンを用いて、うるう秒が間に挟まるように日付を計算すると、うるう秒が間に挟まらない場合と1秒のずれが生じます。サマータイムとはサマータイムとは1年のある期間だけ時刻を1時間早めるという政策のことです。ある瞬間に時刻を1時間早めるわけですから、1時間時刻が重複してしまいます。普通の時刻が2時だったとしたら、サマータイム変更した直後は1時になるけです。この日は、1時から2時が重なってしまいます。サマータイムを導入している国では、時刻の計算を行おうとすると非常に複雑なことになってしまいます。日本の場合はサマータイムがありませんので、サマータイムの影響は考える必要がありません。特定のタイムゾーンをUTCに変換する日付の計算を単純にするために、特定のタイムゾーンをUTCに変換してから計算します。計算が終わった後で、元のタイムゾーンに戻します。元のタイムゾーンに戻す。$dt->datetime;日本の場合はサマータイムがありませんので、ローカル時刻で計算をしても奇妙な結果になることはありません。世界的にはサマータイムを導入している国が結構あるようです。特定のタイムゾーンで計算を行ってもたいていの場合は正しい結果が返ります。サマータイムが導入されている場合で、サマータイムへの変更の時間帯付近を含む場合は、奇妙な結果が返ります。上記で解説したように、いったんUTCに変換して計算してから元に戻すのが安全です。nowメソッドのデフォルトのタイムゾーンnowメソッドで現在時刻を取得することができますが、デフォルトのタイムゾーンはUTCになります。newでDateTimeオブジェクト作った場合は、デフォルトのタイムゾーンは、フローティングタイムゾーンになります。前の月と次の月を取得する方法DateTimeを使って、前の月と次の月を取得する方法です。'limit'」オプションをつけると、日付が1/31日とかでも、正しく日付が取得できる気がします。1/31に1月を足した結果は、2/28とかになる。先の月や次の月にページ遷移したいアプリケーションとかでは便利ではないかと思います。サンプルコード最後にサンプルコードを掲載しておきます。DateTimeを使ったサンプルです。(1900年からの経過年ではなく、そのままの年を使用する。(月は0から数えるのではなくて1から数える。曜日の番号(曜日は1から始まり1は月,7は日になる。5番目の曜日16時12分47秒290日目(1年で数えて)4期(4半期のうち)現在の日付と時刻を取得するサンプルです。タイムゾーンを明示的に指定する場合。"(1)現在の時刻を取得する。"${qtr}期(4半期のうち)\n");実行結果(1)現在の時刻を取得する。7番目の曜日8時11分5秒307日目(1年で数えて)4期(4半期のうち)エポック秒から日付情報を作成するサンプルです。エポック秒から日付情報を作成する。#曜日の番号(曜日は1から始まり1は月,7は日になる。"(1)エポック秒から日付情報を作成する。$qtr,"期(4半期のうち)\n");実行結果(1)エポック秒から日付情報を作成する。7番目の曜日1時35分52秒307日目(1年で数えて)4期(4半期のうち)タイムゾーンを指定するサンプルです。ロケールを設定するサンプルです。"(1)月名と曜日名を日本語で出力する。UTF-8フラグが立っているので、エンコードする。"\n");出力結果(1)月の名前と曜日を日本語で出力する。金DateTimeでロケールを指定するサンプルです。"\n";日付や時刻を取得するサンプルです。$ymdhms\n");うるう年の判定、月末日を取得するサンプルです。"(1)うるう年かどうかを判定する。"今年はうるう年です。"今年はうるう年ではありません。"(2)月末日を取得する。\n";strftimeメソッドのサンプルです。全書式をサンプルで試しています。9)の2桁目はスペースになる。年の最初から初めて何日目か。9)の2桁目はスペースになる。