【问题标题】:PHP get number of week for current month only using phpPHP仅使用php获取当前月份的周数
【发布时间】:2017-09-15 12:11:49
【问题描述】:

这里是我的星期数组。当前月份9和年份2017,我尝试了下面的代码,

function getWeekDates($date, $start_date, $end_date) {
    $week = date('W', strtotime($date));
    $year = date('Y', strtotime($date));
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1"));

    if ($from < $start_date)
        $from = $start_date;

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7"));
    if ($to > $end_date)
        $to = $end_date;

    $array1 = array(
        "ssdate" => $from,
        "eedate" => $to,
    );

    return $array1;
}

$mm = date('m');
$yy = date('y');
$startdate = date($yy . "-" . $mm . "-01");
$current_date = date('Y-m-t');
$ld = cal_days_in_month(CAL_GREGORIAN, $mm, $yy);
$lastday = $yy . '-' . $mm . '-' . $ld;
$start_date = date('Y-m-d', strtotime($startdate));
$end_date = date('Y-m-d', strtotime($lastday));
$end_date1 = date('Y-m-d', strtotime($lastday . " + 7 days"));
$count_week = 0;
$week_array = array();

for ($date = $start_date; $date < $end_date1; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) {
    $getarray = getWeekDates($date, $start_date, $end_date);
    $week_array[] = $getarray;
    $count_week++;
}
echo '<pre>';
print_r($week_array);

我从PHP get number of week for month 这个链接获得了代码。但没有任何办法。

这里是我的星期数组:

Array
(
    [0] => Array
        (
            [ssdate] => 2017-09-01
            [eedate] => 2017-09-03
        )

    [1] => Array
        (
            [ssdate] => 2017-09-04
            [eedate] => 2017-09-10
        )

    [2] => Array
        (
            [ssdate] => 2017-09-11
            [eedate] => 2017-09-17
        )

    [3] => Array
        (
            [ssdate] => 2017-09-18
            [eedate] => 2017-09-24
        )

    [4] => Array
        (
            [ssdate] => 2017-09-25
            [eedate] => 2017-09-30
        )

    [5] => Array
        (
            [ssdate] => 2017-10-02
            [eedate] => 2017-09-30
        )

)

但我只想要当前月份数组,如下所示

 Array
(
    [0] => Array
        (
            [sdate] => 2017-09-01
            [sdate] => 2017-09-02
            [sdate] => 2017-09-03
        )

    [1] => Array
        (
            [sdate] => 2017-09-04
            [sdate] => 2017-09-05
            [sdate] => 2017-09-06
            [sdate] => 2017-09-07
            [sdate] => 2017-09-08
            [sdate] => 2017-09-09
            [sdate] => 2017-09-10
        )
     [2] => Array
        (
            [sdate] => 2017-09-11
            [sdate] => 2017-09-12
            [sdate] => 2017-09-13
            [sdate] => 2017-09-14
            [sdate] => 2017-09-15
            [sdate] => 2017-09-16
            [sdate] => 2017-09-17
            [sdate] => 2017-09-18
        )

    [3] => Array
        (
            [sdate] => 2017-09-18
            [sdate] => 2017-09-19
            [sdate] => 2017-09-20
            [sdate] => 2017-09-21
            [sdate] => 2017-09-22
            [sdate] => 2017-09-23
            [sdate] => 2017-09-24
        )

    [4] => Array
        (
            [sdate] => 2017-09-25
            [sdate] => 2017-09-26
            [sdate] => 2017-09-27
            [sdate] => 2017-09-28
            [sdate] => 2017-09-29
            [sdate] => 2017-09-30
        )
)

请帮我解决这个问题

提前致谢!!!

【问题讨论】:

  • 例如,如果是 2 月,您想要 4 周?
  • 2 月它的工作正常.. bt 如果它是 sep、oct 等等......那么它也会给我下个月的日期。我只想要当前月份的星期日期。
  • 您想要特定月份的日期或周数?
  • @MasivuyeCokile,我想像周一到太阳一样每周约会一次

标签: php arrays datetime


【解决方案1】:

如果您想要当前月份的数据,那么您为什么要比较 $end_date1(距最后一天 +7 天)。您需要在 for 循环中为 $end_date 添加条件。改变for循环如下:

for ($date = $start_date; $date < $end_date; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) {
    $getarray = getWeekDates($date, $start_date, $end_date);
    $week_array[] = $getarray;
    $count_week++;
}

编辑根据您的评论,每月 31 天时会出现问题。所以我改变了一些代码。试试看。更改function getWeekDates如下:

function getWeekDates($date, $start_date, $end_date) {
    $week = date('W', strtotime($date));
    $year = date('Y', strtotime($date));
    $from = date("Y-m-d", strtotime("{$year}-W{$week}+1"));

    if ($from < $start_date)
        $from = $start_date;

    $to = date("Y-m-d", strtotime("{$year}-W{$week}-7"));
    if ($to > $end_date)
        $to = $end_date;
    if($from > $end_date)
    {
      $array1 = array(
    );
    }
    else
    {
      $array1 = array(
        "ssdate" => $from,
        "eedate" => $to,
    );
    }


    return $array1;
}

然后改变循环如下:

for ($date = $start_date; $date <= $end_date1; $date = date('Y-m-d', strtotime($date . ' + 7 days'))) {    
    $getarray = getWeekDates($date, $start_date, $end_date);
    if(count($getarray))
    {
      $week_array[] = $getarray;
      $count_week++;  
    }


}

【讨论】:

  • 如果月份有 31 天,例如 10 月有 31 天,该月的最后一周是 29 天,那么您的解决方案是正确的,那么它将从数组中删除 30 和 31 天,bt I想要那个。
  • 您需要针对新问题提出新问题。 @天使
【解决方案2】:
<?php

function getFullWeeksOfMonth($iYear, $iMonth, $sFirstDayOfWeek = 'Sunday', $bExclusive = true)
{
    $iYear           = filter_var($iYear, FILTER_VALIDATE_INT, array(
        'options' => array(
            'default' => (int) date('Y')
        )
    ));
    $iMonth          = filter_var($iMonth, FILTER_VALIDATE_REGEXP, array(
        'options' => array(
            'default' => (int) date('m'),
            'regexp' => '/^([1-9]|1[012])$/'
        )
    ));
    $aDay            = array(
        'monday' => 1,
        'sunday' => 1
    );
    $sFirstDayOfWeek = filter_var($sFirstDayOfWeek, FILTER_VALIDATE_REGEXP, array(
        'options' => array(
            'default' => 'sunday', //Set default week
            'regexp' => '/^monday|sunday$/'
        )
    ));
    $bExclusive      = filter_var($bExclusive, FILTER_VALIDATE_BOOLEAN);
    $oStart          = new DateTime($iYear . '-' . $iMonth . '-01');

    if ($bExclusive === true || ($bExclusive === false && isset($aDay[strtolower($oStart->format('l'))]))) {
        if ((int) $oStart->format('d') === 1) {
            $oStart->modify('-1 day');
        }
        $oStart->modify('first ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i'));
    } else {
        $oStart->modify('last ' . $sFirstDayOfWeek . ' ' . $oStart->format('H:i'));
    }

    $oEnd = clone ($oStart);
    if ((int) $oStart->format('m') === $iMonth) {
        $oEnd->modify('last day of this month');
    } else {
        $oEnd->modify('last day of next month');
    }

    $oInterval  = new DateInterval('P1W7D');
    $oDaterange = new DatePeriod($oStart, $oInterval, $oEnd);

    $aDate = array();
    $i     = 1;
    foreach ($oDaterange as $oDate) {
        $oTestDate    = clone $oDate;
        $oLastWeekDay = $oTestDate->modify('+6 days');
        if (((int) $oDate->format('m') === (int) $iMonth || (int) $oLastWeekDay->format('m') === (int) $iMonth) && (($bExclusive === true && (int) $oLastWeekDay->format('m') === (int) $iMonth) || ($bExclusive === false))) {
            $aDate[$i]['First'] = $oDate->format('Y-m-d');
            $aDate[$i]['Last']  = $oLastWeekDay->format('Y-m-d');
        }
        $i++;
    }
    return $aDate;
}

echo "<pre>";

print_r(getFullWeeksOfMonth(2017, 9, 'Sunday'));

echo "<pre>";
?>

$iYear 是年份的变量 $iMonth 是数字 月份的表示 (1 – 12) $sFirstDayOfWeek 采用 星期一或星期日作为一周的第一天;默认为星期一。 $bExclusive 是一个布尔值,如果为真,则在 选择月份,但当为假时,它允许重叠考虑 记下与所选月份相关的所有周。

结果:

【讨论】:

    【解决方案3】:
    function weeks_in_month($year, $month, $start_day_of_week)
      {
        // Total number of days in the given month.
        $num_of_days = date("t", mktime(0,0,0,$month,1,$year));
    
        // Count the number of times it hits $start_day_of_week.
        $num_of_weeks = 0;
        for($i=1; $i<=$num_of_days; $i++)
        {
          $day_of_week = date('w', mktime(0,0,0,$month,$i,$year));
          if($day_of_week==$start_day_of_week)
            $num_of_weeks++;
        }
    
        return $num_of_weeks;
      }
      $year = 2017;
      $i=9;
      echo $year."-".$i."=>&nbsp;".weeks_in_month($year, $i, 1).' weeks<br />';
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-09-28
      相关资源
      最近更新 更多