是否有任何参数或配置提供给DateTime对象,以不考虑iso中的星期数,而是以1月1日作为一年的第一周?
由于Datetime使用ISO规则,因此一年的第一周就是具有第一个星期四的一周。
我需要对日期时间进行一些操作,但我需要将1月的第一天视为一年的第一周,即使它是星期日。
这可能吗?我尝试了一切。
谢谢。
答案 0 :(得分:1)
别以为原生的DateTime是不可能的,不是-仅遵循ISO 8601规则。您必须自己解决这个问题,在所有使用这些值的地方,都应考虑到1月1日与1月4日之间在第一周开始之间的差异。
您应该考虑使用诸如Carbon之类的日期库-具有正确的语言环境设置,该数据库应该能够执行您想要的操作。
https://carbon.nesbot.com/docs/#api-week:
Week方法遵循当前语言环境的规则(例如,使用默认语言环境en_US,一周的第一天是周日,,一年的第一周是包含1月1日的那一周)
答案 1 :(得分:0)
没有选项来设置第一周的开始工作日。 您只能将以下格式用于一天中的星期几:
因此,如果要以一年的第一天为一年的第一周来计算周数,那么如果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
}