gpt4 book ai didi

PHP date() 作为 MySQL YEARWEEK()

转载 作者:行者123 更新时间:2023-11-29 09:34:30 28 4
gpt4 key购买 nike

这个问题与 this 非常相似和 this (和其他)问题,但我想做的是相反的,我期望 PHP 答案显示与 MySQL YEARWEEK() 相同的结果。

今天是 2019 年 9 月 16 日,MySQL YEARWEEK 说:

SELECT YEARWEEK(NOW()) -- returns 201937

PHP 说:

echo date('oW') // returns 201938

我必须在 PHP 中做什么才能像 MySQL YEARWEEK 那样显示“201937”?

最佳答案

有两个问题:

  1. 周数在不同日期发生变化(PHP 为星期一,MySQL 为星期日)
  2. 一年的第一周的确定方式不同(对于 PHP,该周包含 1 月 4 日;对于 MySQL,该周从该年的第一个星期日开始)

这会导致这些差异:

First day of year: | Mo | Tu | We | Th | Fr | Sa | Su |
PHP week | ------- 01 ------ | --- 52/53 -- |
MySQL week | ----------- 52/53 ----------| 01 |

根据年份开始的时间,我们有 2 种不同的情况:

  1. 如果从周五、周六或周日开始,PHP 将“晚”1 天开始第 1 周(可以通过在 PHP 中获取明天的周数来解决)
  2. 如果从周一、周二、周三或周四开始,最终会出现 3-6 天的偏差,这次 PHP 领先,解决起来会变得一团糟。

总而言之,您似乎最好只计算今年已经过去了多少个星期日,这显然可以通过以下方式完成(改编自 this ):

ceil((date("z") + 1 - date("w")) / 7); //added +1 in case the year starts a Sunday

如果它是 0,则计算去年有多少个星期日:

$ldly = strtotime(date("Y")-1)."-12-31"); //last day last year
ceil((date("z", $ldly ) + 1 - date("w", $ldly )) / 7);

通过将两者结合起来(如果您想检查今天以外的日期,则添加一个参数),您将得到:

function weekNum($date = false) {
$day = $date ? strtotime($date) : time();
if($res = ceil((date("z", $day) + 1 - date("w", $day)) / 7)){
return $res;
}
$ldly = strtotime((date("Y", $day)-1)."-12-31"); //last day last year
return ceil((date("z", $ldly ) + 1 - date("w", $ldly )) / 7);
}

我认为这应该始终与 MySQL 日期匹配,但请自行测试以确保! :)

关于PHP date() 作为 MySQL YEARWEEK(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57959787/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com