PHP的日期时间考虑每年1月1日总是第一周?

时间:2020-06-11 09:22:27

标签: php datetime

是否有任何参数或配置提供给DateTime对象,以不考虑iso中的星期数,而是以1月1日作为一年的第一周?

由于Datetime使用ISO规则,因此一年的第一周就是具有第一个星期四的一周。

我需要对日期时间进行一些操作,但我需要将1月的第一天视为一年的第一周,即使它是星期日。

这可能吗?我尝试了一切。

谢谢。

4 个答案:

答案 0 :(得分:1)

别以为原生的DateTime是不可能的,不是-仅遵循ISO 8601规则。您必须自己解决这个问题,在所有使用这些值的地方,都应考虑到1月1日与1月4日之间在第一周开始之间的差异。

您应该考虑使用诸如Carbon之类的日期库-具有正确的语言环境设置,该数据库应该能够执行您想要的操作。

https://carbon.nesbot.com/docs/#api-week

Week方法遵循当前语言环境的规则(例如,使用默认语言环境en_US,一周的第一天是周日,,一年的第一周是包含1月1日的那一周

答案 1 :(得分:0)

没有选项来设置第一周的开始工作日。 您只能将以下格式用于一天中的星期几:

  • %U-当前年份的星期数,以十进制数表示,从第一个星期日作为第一周的第一天开始
  • %V-当年的ISO 8601:1988周号,以十进制数表示,范围为01到53,其中第1周是当年中至少有4天的第一周,而星期一为一周的第一天。 (将%G或%g用于对应于指定时间戳记中星期几的年份组成部分。)
  • %W-当前年份的星期数(以十进制数表示),从第一个星期一作为第一周的第一天开始

因此,如果要以一年的第一天为一年的第一周来计算周数,那么如果1月1日不是星期四或之前,则必须使用自己的函数加1。

答案 2 :(得分:0)

my own answer开始,并针对dateTime和从第1周开始的年份进行了调整。

function get_week($date){
    $w=(int)$date->format('W');
    $m=(int)$date->format('n');
    return $w==1?($m==12?53:1):($w>=51?($m==1?1:$w):$w);
    }

2016-01-01正式为第53周,但函数返回1。第1周现在有10天,直到2016-01-01。第2周从2016-01-11开始

答案 3 :(得分:0)

下面的函数提供从 1 月 1 日开始的第 01-53 周。注意:这样一年的第一周和最后一周可能不到 7 天。

function getWeekNumberStartingJan1(DateTime $date)
{
    if ((clone $date)->modify('1 january')->format('W') !== '01') {
        if ($date->format('o') !== $date->format('Y')) {
            return '01';
        }
        
        return sprintf('%02d', (int)$date->format('W') + 1);
    }

    return $date->format('W'); //year started from Monday
}