【发布时间】:2021-02-28 20:25:50
【问题描述】:
是否有任何参数或配置可以提供给 DateTime 对象以不考虑 iso 中的周数,而是将 1 月的第一天作为一年中的第一周?
由于 Datetime 使用 ISO 规则,因此一年中的第一周是第一个星期四所在的那一周。
我需要对日期时间进行一些操作,但我需要将一月的第一天视为一年中的第一周,即使它是星期日。
这可能吗?我什么都试过了。
谢谢。
【问题讨论】:
-
你到底想要什么功能?
是否有任何参数或配置可以提供给 DateTime 对象以不考虑 iso 中的周数,而是将 1 月的第一天作为一年中的第一周?
由于 Datetime 使用 ISO 规则,因此一年中的第一周是第一个星期四所在的那一周。
我需要对日期时间进行一些操作,但我需要将一月的第一天视为一年中的第一周,即使它是星期日。
这可能吗?我什么都试过了。
谢谢。
【问题讨论】:
不要认为使用原生 DateTime 是可能的,不,它只遵循 ISO 8601 规则。您必须自己处理这个问题,将 1 月 1 日与 1 月 4 日之间的差异作为第一周的开始,在您使用这些值进行操作的所有地方都考虑在内。
您应该考虑使用日期库,例如 Carbon - 设置正确的区域设置,它应该能够执行您想要的操作。
https://carbon.nesbot.com/docs/#api-week:
Week 方法遵循当前语言环境的规则(例如使用 en_US,默认语言环境,一周的第一天是星期日,一年的第一周是包含 1 月 1 日的一周强>)
【讨论】:
Carbon::setWeekStartsAt,但表示已弃用 - 但也表示,“您还可以使用 'first_day_of_week' 语言环境设置来根据当前区域设置”
没有选项可以设置第一周的开始工作日。 您只能将以下格式用于当天的周数:
因此,如果您想计算周数,假设一年中的第一天为一年中的第一周,那么如果 1 月 1 日不是星期四或更早,您必须创建自己的函数来加 1。
【讨论】:
取自 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 开始
【讨论】:
以下函数提供从 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
}
【讨论】: