You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PHP/jQuery AJAX日历改造:将周起始日设置为周日

如何将PHP/jQuery AJAX日历的周起始日改为周日?

我用PHP/jQuery AJAX开发了一个日历,功能正常,但希望把周起始日从周一改成周日。已经更新了星期标签为["SUN","MON","TUE","WED","THU","FRI","SAT"],但无法调整日历生成逻辑以匹配新的标签顺序。

尝试过两种修改方式,都有问题:

  • 将$this->currentMonthStart改为当月2号:$this->currentMonthStart = $this->currentYear . '-' . $this->currentMonth . '-02';,仅对当前二月有效,切换到其他月份时日期会混乱。
  • 尝试调整当月第一天的计算:$firstDayOfTheWeek = date ( 'N', strtotime ( "+1 day", strtotime($this->currentMonthStart)) );,效果和修改currentMonthStart为2号一致,同样存在跨月份日期混乱的问题。

请问是否可以通过全局修改构造函数实现周从周日开始?附上完整代码:

<?php
class PHPCalendar {
    // Original weekday labels
    // private $weekDayName = array ("MON","TUE","WED","THU","FRI","SAT","SUN");
    
    // New weekday labels with Sunday as the start day
    private $weekDayName = array ("SUN","MON","TUE","WED","THU","FRI","SAT");
    private $currentDay = 0;
    private $currentMonth = 0;
    private $currentYear = 0;
    private $currentMonthStart = null;
    private $currentMonthDaysLength = null; 
    
    function __construct() {
        $this->currentYear = date ( "Y", time () );
        $this->currentMonth = date ( "m", time () );
        
        if (! empty ( $_POST ['year'] )) {
            $this->currentYear = $_POST ['year'];
        }
        if (! empty ( $_POST ['month'] )) {
            $this->currentMonth = $_POST ['month'];
        }
        $this->currentMonthStart = $this->currentYear . '-' . $this->currentMonth . '-01';
        $this->currentMonthDaysLength = date ( 't', strtotime ( $this->currentMonthStart ) );
    }
    
    function getCalendarHTML() {
        $calendarHTML = '<div id="calendar-outer">'; 
        $calendarHTML .= '<div class="calendar-nav">' . $this->getCalendarNavigation() . '</div>'; 
        $calendarHTML .= '<ul class="week-name-title">' . $this->getWeekDayName () . '</ul>';
        $calendarHTML .= '<ul class="week-day-cell">' . $this->getWeekDays () . '</ul>';        
        $calendarHTML .= '</div>';
        return $calendarHTML;
    }
    
    function getCalendarNavigation() {
        $prevMonthYear = date ( 'm,Y', strtotime ( $this->currentMonthStart. ' -1 Month'  ) );
        $prevMonthYearArray = explode(",",$prevMonthYear);
        
        $nextMonthYear = date ( 'm,Y', strtotime ( $this->currentMonthStart . ' +1 Month'  ) );
        $nextMonthYearArray = explode(",",$nextMonthYear);
        
        $navigationHTML = '<div class="prev" data-prev-month="' . $prevMonthYearArray[0] . '" data-prev-year = "' . $prevMonthYearArray[1]. '"><<</div>'; 
        $navigationHTML .= '<span id="currentMonth">' . date ( 'M ', strtotime ( $this->currentMonthStart ) ) . '</span>';
        $navigationHTML .= '<span contenteditable="true" id="currentYear">'.    date ( 'Y', strtotime ( $this->currentMonthStart ) ) . '</span>';
        $navigationHTML .= '<div class="next" data-next-month="' . $nextMonthYearArray[0] . '" data-next-year = "' . $nextMonthYearArray[1]. '">>></div>';
        return $navigationHTML;
    }
    
    function getWeekDayName() {
        $WeekDayName= '';       
        foreach ( $this->weekDayName as $dayname ) {            
            $WeekDayName.= '<li>' . $dayname . '</li>';
        }       
        return $WeekDayName;
    }
    
    function getWeekDays() {
        $weekLength = $this->getWeekLengthByMonth ();
        $firstDayOfTheWeek = date ( 'N', strtotime ( $this->currentMonthStart ) );
        $weekDays = "";
        for($i = 0; $i < $weekLength; $i ++) {
            for($j = 1; $j <= 7; $j ++) {
                $cellIndex = $i * 7 + $j;
                $cellValue = null;
                if ($cellIndex == $firstDayOfTheWeek) {
                    $this->currentDay = 1;
                }
                if (! empty ( $this->currentDay ) && $this->currentDay <= $this->currentMonthDaysLength) {
                    $cellValue = $this->currentDay;
                    $this->currentDay ++;
                }
                $weekDays .= '<li>' . $cellValue . '</li>';
            }
        }
        return $weekDays;
    }
    
    function getWeekLengthByMonth() {
        $weekLength =  intval ( $this->currentMonthDaysLength / 7 );    
        if($this->currentMonthDaysLength % 7 > 0) {
            $weekLength++;
        }
        $monthStartDay= date ( 'N', strtotime ( $this->currentMonthStart) );        
        $monthEndingDay= date ( 'N', strtotime ( $this->currentYear . '-' . $this->currentMonth . '-' . $this->currentMonthDaysLength) );
        if ($monthEndingDay < $monthStartDay) {         
            $weekLength++;
        }
        
        return $weekLength;
    }
}
?>

当前日历效果:
当前日历效果

期望效果:
期望日历效果

内容的提问来源于stack exchange,提问作者user19103974

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 09:35:57