PHPについての質問です。

次のようなことがやりたいのですが、うまい方法があれば教えてください。

■日付を指定して、その週の最初(日曜日)と最後(土曜日)の日付を取得したい

例[2008/08/21]を与えると、[2008/08/17]と[2008/08/23]が取得できる

回答の条件
  • 1人50回まで
  • 登録:
  • 終了:2008/08/21 13:56:39
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

ベストアンサー

id:pahoo No.2

回答回数5960ベストアンサー獲得回数633

ポイント100pt

こんな感じでどうでしょう。

function getLastSunday($year, $month, $day) {
    $today = mktime(0, 0, 0, $month, $day, $year);
    $arr = getdate($today);
    $ww = $arr['wday'];      //指定日の曜日番号
    return $today - $ww * 24 * 60 * 60;  //その週の日曜日のUNIX TIME
}

function getSunSat($yyyymmdd) {
    if (($arr = split('\/', $yyyymmdd)) == FALSE)  return FALSE;  //年月日に分解
    if (count($arr) != 3)  return FALSE;    //引数が異常
    if (checkdate($arr[1], $arr[2], $arr[0]) == FALSE)  return FALSE;  //年月日が異常
    $sunday   = getLastSunday($arr[0], $arr[1], $arr[2]);  //その週の日曜日のUNIX TIME
    $saturday = $sunday + 6 * 24 * 60 * 60;                //その週の土曜日のUNIX TIME
    return array(date('Y/m/d', $sunday), date('Y/m/d', $saturday));
}

ご要望の関数は getThisWeek です。

getThisWeek('2008/08/21') のように引数を与えると、日曜日と土曜日が配列の形で返ってきます。

引数は、'年/月/日' のようにスラッシュで区切ってください。1桁の月日の場合、'0' で埋めても埋めなくても構いません。

以下のように使ってください。

list($sunday, $saturday) = getSunSat('2008/08/21');

引数のエラーチェックは行っていますが、UNIX TIMEを使っているので、極端に未来だったり、極端に過去の日付だったりすると、checkdate関数でエラーを出します。

id:southgate_01

ありがとうございます。

期待通りの結果が得られました。

2008/08/21 13:55:46

その他の回答1件)

id:standard_one No.1

回答回数252ベストアンサー獲得回数23

ポイント100pt

うまい方法というのが何を指すのかはわかりませんが、関数で組むならこんな感じかと。

b2e( 2008,8,21 );

function b2e( $year, $month, $day )

{

$adj = array( "Mon" => 1, "Tue" => 2, "Wed" => 3, "Thu" => 4, "Fri" => 5, "Sat" => 6, "Sun" => 0);

$ts = mktime( 0, 0, 0, $month, $day, $year );

$dow = date( "D", $ts );

$ts = mktime( 0, 0, 0, $month, $day-$adj[$dow], $year );

$day_b = date( "Y/m/d", $ts );

$ts = mktime( 0, 0, 0, $month, $day+(6-$adj[$dow]), $year );

$day_e = date( "Y/m/d", $ts );

echo "[" . $day_b . "] - [" . $day_e . "]\n";

}

id:southgate_01

ありがとうございます。

期待通りの結果が得られました。

2008/08/21 13:52:11
id:pahoo No.2

回答回数5960ベストアンサー獲得回数633ここでベストアンサー

ポイント100pt

こんな感じでどうでしょう。

function getLastSunday($year, $month, $day) {
    $today = mktime(0, 0, 0, $month, $day, $year);
    $arr = getdate($today);
    $ww = $arr['wday'];      //指定日の曜日番号
    return $today - $ww * 24 * 60 * 60;  //その週の日曜日のUNIX TIME
}

function getSunSat($yyyymmdd) {
    if (($arr = split('\/', $yyyymmdd)) == FALSE)  return FALSE;  //年月日に分解
    if (count($arr) != 3)  return FALSE;    //引数が異常
    if (checkdate($arr[1], $arr[2], $arr[0]) == FALSE)  return FALSE;  //年月日が異常
    $sunday   = getLastSunday($arr[0], $arr[1], $arr[2]);  //その週の日曜日のUNIX TIME
    $saturday = $sunday + 6 * 24 * 60 * 60;                //その週の土曜日のUNIX TIME
    return array(date('Y/m/d', $sunday), date('Y/m/d', $saturday));
}

ご要望の関数は getThisWeek です。

getThisWeek('2008/08/21') のように引数を与えると、日曜日と土曜日が配列の形で返ってきます。

引数は、'年/月/日' のようにスラッシュで区切ってください。1桁の月日の場合、'0' で埋めても埋めなくても構いません。

以下のように使ってください。

list($sunday, $saturday) = getSunSat('2008/08/21');

引数のエラーチェックは行っていますが、UNIX TIMEを使っているので、極端に未来だったり、極端に過去の日付だったりすると、checkdate関数でエラーを出します。

id:southgate_01

ありがとうございます。

期待通りの結果が得られました。

2008/08/21 13:55:46
  • id:GoldenDawn
    function get_both_end_days($d) {
    if (strtotime($d) == FALSE) return FALSE ;
    $sun = strtotime($d) ;
    if (date('w', $sun) != 0) $sun = strtotime('last Sunday', $sun) ;
    $sat = strtotime('next Saturday', $sun) ;

    return array(date('Y/m/d', $sun), date('Y/m/d', $sat)) ;
    }

    // 2038年問題対応版 (PHP5.2 以上)
    function get_both_end_days2($d) {
    try {$sun = new DateTime($d) ;}
    catch (Exception $e) {return FALSE ;}
    if ($sun->format('w') != 0) $sun->modify('last Sunday') ;

    try {$sat = new DateTime('next Saturday '.$sun->format('c')) ;}
    catch (Exception $e) {return FALSE ;}

    return array($sun->format('Y/m/d'), $sat->format('Y/m/d')) ;
    }

    $date = '2008/08/21' ;
    print_r(get_both_end_days($date)) ;
    print_r(get_both_end_days2($date)) ;
  • id:pahoo
    2038年問題を含め、記事にまとめました。ご参考まで。

    PHPセキュリティ対策:定義域エラー
    http://www.pahoo.org/e-soul/webtech/phpsec/phpsec-06-01.shtm

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません