如何使用Carbon获得一个月中的所有星期

问题描述

我想用碳归还当月的所有星期。因此,我每个星期要返回2个日期。请在下面查看我的代码

$dt = Carbon::Now(); //or initialize it any other way
        
Carbon::setWeekStartsAt(Carbon::MONDAY);
Carbon::setWeekEndsAt(Carbon::SUNDAY);

$weeks += [
    'w1' => $dt->subDays($dt->dayOfWeek - 4)->format('Y-m-d H:i:s') . ' - ' . $dt->subDays($dt->dayOfWeek - 7)->format('Y-m-d H:i:s')
]; 

$weeks += [
    'w2' => $dt->subDays($dt->dayOfWeek - 3)->format('Y-m-d H:i:s') . ' - ' . $dt->subDays($dt->dayOfWeek - 7)->format('Y-m-d H:i:s')
]; 
$weeks += [
    'w3' => $dt->subDays($dt->dayOfWeek - 1)->format('Y-m-d H:i:s') . ' - ' . $dt->subDays($dt->dayOfWeek - 7)->format('Y-m-d H:i:s')
]; 

$weeks += [
    'w4' => $dt->subDays($dt->dayOfWeek - 1)->format('Y-m-d H:i:s') . ' - ' . $dt->subDays($dt->dayOfWeek - 7)->format('Y-m-d H:i:s')
];

return $weeks;

代码返回以下内容

"data": {
   "w1": "2020-08-27 06:45:01 - 2020-08-30 06:45:01","w2": "2020-09-02 06:45:01 - 2020-09-06 06:45:01","w3": "2020-09-07 06:45:01 - 2020-09-13 06:45:01","w4": "2020-09-14 06:45:01 - 2020-09-20 06:45:01"
}

我想要什么输出

"data": {
   "w1": "2020-08-03 06:09:06 - 2020-08-09 06:09:06","w2": "2020-08-10 06:09:06 - 2020-08-16 06:09:06","w3": "2020-08-17 06:09:06 - 2020-08-23 06:09:06","w4": "2020-08-24 06:09:06 - 2020-08-30 06:09:06",}

解决方法

[已解决]

$data = [];

$get_week_dates = function($position){

    $start = date('d-m-Y',strtotime("{$position} Monday of this month"));
    $time = strtotime($start);
    $end = strtotime('next sunday,12:00am',$time);
    $format = 'l,F j,Y g:i A';
    $end_day = date($format,$end);

    return [Carbon::parse($start)->format('m-d-Y'),Carbon::parse($end_day)->format('m-d-Y')];
};

$data += [
   'w1' => $get_week_dates('first'),'w2' => $get_week_dates('second'),'w3' => $get_week_dates('third'),'w4' => $get_week_dates('fourth')
];
,

让您的上下文更精确。根据您的示例,第四周可能与下个月重叠。他们可能是您要考虑的第五个星期一。

因此,您得到的不是我所说的“一个月中的所有星期”,而是当月的前四个星期(从星期一开始)。

关于您的函数,您可以将其缩短为:从时间获取日期,然后从日期获取时间将其设置为午夜,这是过大的,Carbon::parse处理的语法与strtotime相同,并且如果获取时间没有意义,您将其修剪为日期格式:

$get_week_dates = function ($position) {
    $start = CarbonImmutable::parse("$position Monday of this month");

    return [$start->format('m-d-Y'),$start->next('Sunday,12:00am')->format('m-d-Y')];
};

如果您要支持其他格式,则上面的代码,12:00am将保留,但是如果您仅使用m-d-Y则可以将其删除

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...