Carbon::now() 提供错误数据

Carbon::now() Giving Wrong Data

我在 Laravel 中使用 Carbon。

问题: 我需要使用 Carbon::now()->month() 函数制作碳日期。对于所有其他月份,它工作正常。但是当我试图确定 2021 年 2 月的日期时,它总是给我 2021 年 3 月的日期。

下面是我的函数

function findStartEndDateOfAMonth($month, $year)
{
    //Here $month = 2, $year = 2021
    $days_in_month = cal_days_in_month(CAL_GREGORIAN, $month, $year);
    $start_time    = Carbon::now()->year($year)->month($month)->day(1)->hour(0)->minute(0)->second(0);

    $end_time      = Carbon::now()->year($year)->month($month)->day($days_in_month)->hour(23)->minute(59)->second(59);
    return [
      'start_time'    => $start_time,
      'end_time'      => $end_time,
      'days_in_month' => $days_in_month
    ];
} 

这是输出:

{
  "code": 200,
  "message": "Successful",
  "time": {
   "start": {
      "date": "2021-03-01 00:00:00.000000",
      "timezone_type": 3,
      "timezone": "Asia/Dhaka"
    },
    "end": {
      "date": "2021-03-28 23:59:59.000000",
      "timezone_type": 3,
      "timezone": "Asia/Dhaka"
    }
  }
}

3 月的结果类似(当我给出 $month = 3 时)

{
  "code": 200,
  "message": "Successful",
  "time": {
   "start": {
      "date": "2021-03-01 00:00:00.000000",
      "timezone_type": 3,
      "timezone": "Asia/Dhaka"
    },
    "end": {
      "date": "2021-03-31 23:59:59.000000",
      "timezone_type": 3,
      "timezone": "Asia/Dhaka"
    }
  }
}

我无法弄清楚这里的问题。

提前致谢。

Carbon::now()->year($year)->month($month)->day(1)->hour(0)->minute(0)->second(0);

有问题,因为它首先更改 year/month,然后再更改其余部分,因此它可能会溢出。

第一个快速修复是:

Carbon::now()->day(1)->year($year)->month($month)->hour(0)->minute(0)->second(0);

但是不要将日期更改 6 次,您应该使用 setDateTime 一次性修改所有日期:

Carbon::now()->setDateTime($year, $month, 1, 0, 0, 0);

最后一个问题是:如果你改变所有的值,使用 now() 有什么意义,为什么不简单地 create 所以你根本没有突变?

Carbon::create($year, $month, 1, 0, 0, 0);

郑重声明,您可以在您创建的对象上使用 $start_time->daysInMonth getter,这样您就不需要调用 cal_days_in_month