碳改变了我原来的变量

时间:2015-12-22 10:39:53

标签: php laravel php-carbon

我正在尝试在我正在创建的日历类型中制作一些导航按钮,并使用碳来创建日期。

这是控制器中的代码:

if ($date == null) {
        $date = \Carbon\Carbon::now();
    }else{
        $date = \Carbon\Carbon::createFromFormat('Y-m-d', $date);
    }
    $navDays = ['-7Days' => $date->subDay('7')->toDateString(),
                '-1Day'  => $date->subDay('1')->toDateString(),
                'Today'    => $date->today()->toDateString(),
                '+1Day'  => $date->addDay('1')->toDateString(),
                '+7Days' => $date->addDay('7')->toDateString()];

然后我认为,我这样做:

        @foreach($navDays as $key => $i)
            <li><a href="/planner/bookings/{{ $i }}" class="small button">{{ $key }}</a></li>
        @endforeach

这个问题是,碳似乎在数组创建期间改变了$ date,因为这些是我得到的日期($ date设置为2015-11-29):

<ul class="button-group even-5">
                        <li><a href="/planner/bookings/2015-11-22" class="small button">-7Days</a></li>
                        <li><a href="/planner/bookings/2015-11-21" class="small button">-1Day</a></li>
                        <li><a href="/planner/bookings/2015-12-22" class="small button">Today</a></li>
                        <li><a href="/planner/bookings/2015-11-22" class="small button">+1Day</a></li>
                        <li><a href="/planner/bookings/2015-11-29" class="small button">+7Days</a></li>
                </ul>

有人知道我做错了吗?

此致 约翰

3 个答案:

答案 0 :(得分:31)

当您针对Carbon对象运行这些方法时,它会更新对象本身。因此addDay()向前移动Carbon的值。

这是您需要做的事情:

$now = Carbon::now();

$now->copy()->addDay();
$now->copy()->addMonth();
$now->copy()->addYear();
// etc...

复制方法实质上创建了一个新的Carbon对象,然后您可以应用更改而不会影响原始$now变量。

总之,复制Carbon实例的方法是:

  • copy
  • clone - 别名copy

查看文档:{​​{3}}

答案 1 :(得分:10)

问题在于你假设subDay()/ addDay()没有改变日期对象,而他们确实......他们只是绕着{{1对象DateTime方法:

  

DateTime :: modify - date_modify - 更改时间戳

(我的重点)

相反,请使用

modify()

答案 2 :(得分:0)

Doco

  

您还可以创建现有Carbon实例的copy()。正如预期的那样,日期,时间和时区值都将复制到新实例。

widget._firebaseMessaging.configure(
  onMessage: (Map<String, dynamic> message) async {
    print('on message $message');



    AudioCache player = new AudioCache();
    const alarmAudioPath = "sounds/notification.mp3";
    player.play(alarmAudioPath);
  },
  onResume: (Map<String, dynamic> message) async {
    print('on resume $message');
  },
  onLaunch: (Map<String, dynamic> message) async {
    print('on launch $message');
  },
);