.

iT邦幫忙

0

如何用php撰寫行事曆的固定六日欄位?

  • 分享至 

  • xImage

如何用php撰寫行事曆撰寫程式控制星期六和日在第一欄後最後一欄排列,顯示日期?謝謝

看更多先前的討論...收起先前的討論...
<?php
function generateCalendar($year, $month) {
// 設定第一天
$firstDayOfMonth = strtotime("$year-$month-01");
$daysInMonth = date("t", $firstDayOfMonth); // 當月總天數
$firstDayOfWeek = date("w", $firstDayOfMonth); // 該月第一天是星期幾 (0:星期日, 6:星期六)

// 建立標題
echo "<table border='1' cellpadding='5' cellspacing='0' style='border-collapse: collapse; text-align: center;'>";
echo "<tr><th colspan='7'>$year 年 $month 月</th></tr>";
echo "<tr>
<th style='color: red;'>六</th>
<th>一</th>
<th>二</th>
<th>三</th>
<th>四</th>
<th>五</th>
<th style='color: red;'>日</th>
</tr>";

// 重新排列第一天,使星期六為第一欄
$adjustedStart = ($firstDayOfWeek == 0) ? 6 : $firstDayOfWeek - 1;

echo "<tr>";

// 填補空白
for ($i = 0; $i < $adjustedStart; $i++) {
echo "<td></td>";
}

// 開始填入日期
for ($day = 1; $day <= $daysInMonth; $day++) {
$currentDayOfWeek = ($adjustedStart + $day - 1) % 7;

// 若是星期六,則開新列
if ($currentDayOfWeek == 0 && $day != 1) {
echo "</tr><tr>";
}

// 設定星期六與星期日的顏色
$color = ($currentDayOfWeek == 0 || $currentDayOfWeek == 6) ? "red" : "black";
echo "<td style='color: $color;'>$day</td>";
}

// 補齊最後一列的空格
while (($adjustedStart + $day - 1) % 7 != 0) {
echo "<td></td>";
$day++;
}

echo "</tr></table>";
}

// 設定要顯示的年月
$year = date("Y");
$month = date("n");

// 生成行事曆
generateCalendar($year, $month);
?>
powered by chatgpt
淺水員 iT邦大師 6 級 ‧ 2025-03-18 14:40:45 檢舉
「星期六和日在第一欄後最後一欄排列」是什麼意思?
其實~~~現在不會再用 table 跟 while 來處理了。

提示:
1.先將整個月的資料陣列出來
2.找出1號是星期幾。
3.算出上一個星期六差幾日。
4.陣列前補算出的日數
5.再用此陣列來直接排版。依索引來分開。

懶的寫程式,自行意會做法。
以上的做法給你參考
淺水員 iT邦大師 6 級 ‧ 2025-03-18 19:50:23 檢舉
應補空白天數 = (「本月1號是星期幾」 + 7 - 「首欄是星期幾」) % 7
.

1 個回答

0
zivzhong
iT邦研究生 3 級 ‧ 2025-03-19 11:15:53

參考 chatgpt example:

<?php
// 設定時區
date_default_timezone_set("Asia/Taipei");

// 指定月份與年份
$year = date("Y"); // 目前年份
$month = date("m"); // 目前月份

// 取得該月的第一天是星期幾
$first_day_of_month = mktime(0, 0, 0, $month, 1, $year);
$days_in_month = date("t", $first_day_of_month); // 取得該月天數

// 取得當月第一天的星期幾 (0=星期日, 1=星期一, ..., 6=星期六)
$first_weekday = date("w", $first_day_of_month);

// 定義星期名稱 (控制顯示順序: 先星期六, 接著星期一到五, 最後是星期日)
$weekdays = ["六", "一", "二", "三", "四", "五", "日"];

// 顯示行事曆標題
echo "<h2>{$year}{$month} 月行事曆</h2>";

// 開始 HTML 表格
echo "<table border='1' cellpadding='5' cellspacing='0'>";
echo "<tr style='background:#ddd; text-align:center;'>";

// 顯示星期標頭
foreach ($weekdays as $day) {
    echo "<th>{$day}</th>";
}
echo "</tr><tr>";

// 調整起始位置: 讓 **星期六在第一欄**
$start_position = ($first_weekday == 6) ? 0 : $first_weekday + 1;

// 在第一列的前面填充空白格
for ($i = 0; $i < $start_position; $i++) {
    echo "<td></td>";
}

// 輸出每一天
for ($day = 1; $day <= $days_in_month; $day++) {
    $current_weekday = date("w", mktime(0, 0, 0, $month, $day, $year));

    // 控制新的一行開始 (當天是星期六時)
    if ($current_weekday == 6) {
        echo "<tr>";
    }

    // 顯示日期
    echo "<td style='text-align:center;'>{$day}</td>";

    // 控制結束當行 (當天是星期日時)
    if ($current_weekday == 0) {
        echo "</tr>";
    }
}

// 在最後一列補充空白格
$end_weekday = date("w", mktime(0, 0, 0, $month, $days_in_month, $year));
if ($end_weekday != 0) {
    for ($i = $end_weekday + 1; $i <= 6; $i++) {
        echo "<td></td>";
    }
    echo "</tr>"; // 結束最後一行
}

// 結束 HTML 表格
echo "</table>";
?>

淺水員 iT邦大師 6 級 ‧ 2025-03-19 16:08:43 檢舉

看了一下
雖然一開始有用 date_default_timezone_set 設定時區
但是 datemktime 函數的參數都是 utc 的時間
所以這個程式在臺灣時間每個月第一天 8:00 之前會顯示上個月的資料
而不是這個月的

淺水員
原來還有這樣的差異
想問一下如果設定時區後,想避開你說的
「在臺灣時間每個月第一天 8:00 之前會顯示上個月的資料」
那應該要怎麼做?

然後我問了chatgpt後

✅ 核心結論先說:
❗ 即使你已經用 date_default_timezone_set('Asia/Taipei') 設定了時區,
PHP 的 date() 和 mktime() 都會根據該時區運作,不是用 UTC!

所以我困惑誰對誰錯了XDDDD

我要發表回答

立即登入回答