【问题标题】:php Datetime considering 1 January always first week of the year?php Datetime 考虑到 1 月 1 日总是一年中的第一周?
【发布时间】:2021-02-28 20:25:50
【问题描述】:

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

由于 Datetime 使用 ISO 规则,因此一年中的第一周是第一个星期四所在的那一周。

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

这可能吗?我什么都试过了。

谢谢。

【问题讨论】:

  • 你到底想要什么功能?

标签: php datetime


【解决方案1】:

不要认为使用原生 DateTime 是可能的,不,它只遵循 ISO 8601 规则。您必须自己处理这个问题,将 1 月 1 日与 1 月 4 日之间的差异作为第一周的开始,在您使用这些值进行操作的所有地方都考虑在内。

您应该考虑使用日期库,例如 Carbon - 设置正确的区域设置,它应该能够执行您想要的操作。

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

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

【讨论】:

  • 很好,谢谢。实际上我使用的是碳,所以这对我很有用。我需要像你说的那样,但我需要把星期一作为一周的第一天。该配置是否有任何语言环境?
  • 不知道,你必须去某个地方找到可用语言环境的列表,然后自己检查。或者您修改现有设置的设置 - carbon.nesbot.com/docs/#api-localization 提到 Carbon::setWeekStartsAt,但表示已弃用 - 但也表示,“您还可以使用 'first_day_of_week' 语言环境设置来根据当前区域设置”
【解决方案2】:

没有选项可以设置第一周的开始工作日。 您只能将以下格式用于当天的周数:

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

因此,如果您想计算周数,假设一年中的第一天为一年中的第一周,那么如果 1 月 1 日不是星期四或更早,您必须创建自己的函数来加 1。

【讨论】:

    【解决方案3】:

    取自 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 开始

    【讨论】:

      【解决方案4】:

      以下函数提供从 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
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-01-18
        • 1970-01-01
        • 2021-10-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-06-18
        相关资源
        最近更新 更多