2011-07-23 12 views
0

年とオプションの月を受け取るアクションがあります。私はその時間内に書かれたすべての記事を照会する必要があるので、そのタイムスパンには絶対的な最初と最後の有効な日時が必要です。年と月/年の最初と最後の日時

$start = new \DateTime(); 
    $start->setDate((int) $year, (int) ($month ?: 1), 1); 
    $start->setTime(0, 0); 

    $end = clone $start; 
    $end->add(new \DateInterval($month ? 'P1M' : 'P1Y')); 
    $end->sub(new \DateInterval('PT1S')); 

これを書くにはもっとクリーンな方法がありますか?

+0

記事は、記事の昇順または降順(最新または最古)で書かれた日付のORDER BY、最初または最新の記事のみを取得するLIMIT 1を検索しないのはなぜですか。おそらく、目的の行とは別にdatetimesを見つける必要はありません。 –

+0

これとはまったく違うもの: '\ DateTime'のバックスラッシュを常に使うのではなく(ネームスペースを使っているからだと思います)、ファイルの先頭に' use DateTime'を追加することができます。その後、バックスラッシュを省略することができます。 – acme

答えて

3
$start = mktime(0, 0, 0, $month ?: 1, 1, $year); 
$end = mktime(23, 59, 59, $month ?: 12, $month ? date('t', $start) : 31, $year); 

か、このクリーナーを検討したい場合はわからない

$start = new \DateTime("$year-" . ($month ?: 1) . '-1 00:00:00'); 
$end = new \DateTime("$year-" . ($month ?: 12) . '-' . ($month ? $start->format('t') : 31) . ' 23:59:59'); 

が、それは短いですし、相対的な計算をせずに行います。これを書くために

クリーンと最も理解しやすい方法は、おそらくです:

if ($month) { 
    $start = new \DateTime("$year-$month-1 00:00:00"); 
    $end = new \DateTime("$year-$month-" . $start->format('t') . ' 23:59:59'); 
} else { 
    $start = new \DateTime("$year-1-1 00:00:00"); 
    $end = new \DateTime("$year-12-31 23:59:59"); 
} 

あなたはSQLクエリの値としてこれを使用するつもりならあなたはすべてここでDateTimeくらいが関与する必要はないかもしれません。

関連する問題