🐙

ChatGPTにPHPでY年M月の第n週のm曜日が何日か求める関数を作ってもらった

2023/09/17に公開

過去にY年M月の第n週のm曜日が何日か求める良さげな方法がググっても見つからなかったので自分で考えて作ったという趣旨の記事を投稿しました。
https://zenn.dev/kasamifutoshi/articles/1517185839b2be

ここに書いたコードは最適ではない気がしていて、今ならChatGPTにやってもらえばよくね?と思い立ったので試してみました。
結論、こっちの方がクセが少なくていいかも。

入力したプロンプト

いわゆる深津式プロンプトで下のように要件を入力しました。GPT-4を選んでいます。

# 命令書:
あなたはプロのシステムエンジニアです。
以下の制約条件に基づいて最良のソースコードを作成してください。

# 制約条件:
•PHPで記述
•入力条件で記載した日付が引数として渡され、日にちdを返却する
•一連のロジックを1つの関数として提供
•処理速度を重視

# 入力条件:
•西暦: y
•月: M
•曜日: m
•その月の週番号: n

# 出力条件:
•ソースコードはコードブロック形式で出力をお願いします

ChatGPTの回答

制約条件と入力条件に基づいて、西暦y、月M、曜日m、週番号nを入力として受け取り、該当する日にちdを返すPHP関数を以下に示します。

<?php

/**
 * 日付を取得する関数
 *
 * @param int    $y 西暦
 * @param int    $M 月
 * @param string $m 曜日 ('Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat')
 * @param int    $n 週番号
 *
 * @return int 日にち
 */
function getDay($y, $M, $m, $n) {
    // 月の初めの日付を取得
    $date = new DateTime("{$y}-{$M}-01");

    // 月の初めが指定した曜日になるまで進める
    while ($date->format('D') !== $m) {
        $date->modify('+1 day');
    }

    // 指定した週番号になるまで進める
    for ($i = 1; $i < $n; $i++) {
        $date->modify('+7 days');
    }

    // 指定した月を超えた場合はエラー
    if ((int)$date->format('m') !== $M) {
        return -1;  // その月に存在しない日付を指定した場合
    }

    return (int)$date->format('d');
}

// 使用例
echo getDay(2023, 9, 'Mon', 3);  // 2023年9月の第3月曜日の日にちを返す

?>

この関数は、指定された年と月の初めから始めて、指定された曜日と週番号に該当する日にちを探し、その日にちを返します。指定された曜日と週番号に該当する日にちが存在しない場合は、-1を返します。

Discussion