首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法找到从今天起动态返回每周日期数组的函数。

无法找到从今天起动态返回每周日期数组的函数。
EN

Stack Overflow用户
提问于 2019-02-25 07:10:58
回答 3查看 53关注 0票数 0

就像标题上说的,我一直在搜索它,但毫无头绪。

事情是这样的,假设我有一个函数,它接受一个整数参数。当我调用它即scoutWeekly(1)时,它列出了本月的第一周(1月28日至2月3日)。如果给出函数的参数2,它将列出本月的第二周(2月4日至2月10日)。所以..。这一切应该是相对于今天,例如,如果它被调用scoutWeekly(1),它跳转到(1月28日-03年2月28日)

你们有线索或片段吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2019-02-25 07:51:49

代码语言:javascript
复制
function weeks($month, $year)
{
    $num_of_days = date("t", mktime(0, 0, 0, $month, 1, $year));
    $lastday     = date("t", mktime(0, 0, 0, $month, 1, $year));
    $no_of_weeks = 0;
    $count_weeks = 0;
    while ($no_of_weeks < $lastday)
    {
        $no_of_weeks += 7;
        $count_weeks++;
    }
    return $count_weeks;
}

function getRangeByWeek($weekNo)
{
    $firstDayOfCurrentMonth = date('Y-m-01');
    $globalWeek             = intval(date('W', strtotime($firstDayOfCurrentMonth)));
    $globalYear             = intval(date('Y', strtotime($firstDayOfCurrentMonth)));
    $globalMonth            = intval(date('m', strtotime($firstDayOfCurrentMonth)));
    $totalNumberOfWeeks     = weeks($globalMonth, $globalYear);
    $date                   = new DateTime();
    $result                 = [];
    for ($i = 1; $i <= $totalNumberOfWeeks; $i++)
    {
        $startDate  = $date->setISODate($globalYear, $globalWeek)->format("d M");
        $endDate    = $date->setISODate($globalYear, $globalWeek, 7)->format("d M");
        $result[$i] = $startDate . '-' . $endDate;
        $globalWeek++;
    }
    return $result[$weekNo];
}
echo getRangeByWeek(1);
  1. 从当前月份的第一天提取“全球周”,所需年份和月份
  2. 这个月总共花了几个星期
  3. 创建空的DateTime实例,以执行简单的计算并获取全局周的第一个日期
  4. 将全球周增加到当月的总周数
  5. 无论生成什么结果,我都将索引保留为当前月份的周数。
  6. 当前周数从当月返回的日期范围

输出

代码语言:javascript
复制
28 Jan-03 Feb

演示

票数 1
EN

Stack Overflow用户

发布于 2019-02-25 08:05:35

有更简单的方法..。

代码语言:javascript
复制
function scoutWeekly($n) {
    // today's date
    $today = new DateTime();
    // set to first day of the month
    $today->setDate($today->format('Y'), $today->format('m'), 1);
    // get the Monday earlier
    $today->sub(new DateInterval('P' . ($today->format('N') - 1) . 'D'));
    // add the required number of weeks
    if ($n > 1) {
        $today->add(new DateInterval('P' . ($n - 1) . 'W'));
    }
    // and format the result
    return $today->format('d M') . '-' . $today->add(new DateInterval('P6D'))->format('d M');
}
echo scoutWeekly(1)

输出:

代码语言:javascript
复制
28 Jan-03 Feb

基于3v4l.org的演示

票数 1
EN

Stack Overflow用户

发布于 2019-02-25 08:17:39

我是行动组

这就是解决问题的答案:

代码语言:javascript
复制
    private static function addScoutWeek(int $addNumb = null) : array
    {
        $addStart = Carbon::now()->startOfMonth()->addWeek($addNumb)->startOfWeek();
        $interval = new \DateInterval('P1D');
        $addEnd = Carbon::now()->startOfMonth()->addWeek($addNumb)->endOfWeek();
        $dateRange = new \DatePeriod($addStart, $interval, $addEnd);

        foreach ($dateRange as $date) {
            $arrOfDate[] = $date;
        }

        return $arrOfDate;
    }

结案

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/54861134

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档