php - MySQL WEEK() 模式 6 PHP 等效项

标签 php mysql date datetime

我想使用 YEARWEEK 每周汇总数据,并且我希望周日作为一周的第一天。在 SQL 查询中,我使用模式 6 来聚合数据,但在 PHP 中没有等效的年周。 PHP 似乎没有更改周开始日的选项。

最佳答案

到目前为止我的解决方案

public static function getYearWeek(DateTime $dateTime)
    {
        $minDaysInWeek = 4;
        $numDaysInWeek = 7;
        $firstDayOfYear = clone $dateTime;
        $lastDayOfYear = clone $dateTime;
        $yearStartingDay = $firstDayOfYear->modify('first day of January this year')->format('N');
        $numberOfDaysInYear = $lastDayOfYear->modify('last day of December this year')->format('z') + 1;
        $ordinalDate = $dateTime->format('z') + 1;
        $weekOffset = $yearStartingDay < $minDaysInWeek ? 1 : 0;

        $weekNum = ceil(($ordinalDate + $yearStartingDay - $numDaysInWeek) / $numDaysInWeek) + $weekOffset;
        $maxWeekNum = ceil(($numberOfDaysInYear + $yearStartingDay - $numDaysInWeek) / $numDaysInWeek) + $weekOffset;

        if($weekNum < 1) {
            return self::getYearWeek(clone $dateTime->modify('last day of December previous year'));
        }

        if($weekNum > $maxWeekNum) {
            return self::getYearWeek(clone $dateTime->modify('first day of January next year'));
        }

        return intval($dateTime->format('Y') . ($weekNum < 9 ? '0' . $weekNum : $weekNum));
    }

有没有人有更好的解决方案?

关于php - MySQL WEEK() 模式 6 PHP 等效项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21525593/

相关文章:

php - 为什么这个字符串验证脚本不起作用?

php - 使用 while、do 或 for 循环生成新的 id 或编号

php - MySQL PHP pdo 插入值不起作用

matlab - 自 "Jan 1, 0000": is this -1 BC or +1 CE? 起的序列日期号

javascript - 过滤时间戳至今

php - 如何自动同步Mysql中的数据到Sphinx

javascript - 未使用 jquery 和 ajax 设置 session

MySQL根据连接表中的值限制结果

.net - 在 C# 中将整数转换为月份名称的最佳方法?

php - CakePHP ACL 教程 initDB 函数警告