如何从表单输入字段向日期添加月份
How to add a month to a date from form input field
我试图在通过表单域输入一个日期时添加 12 个维护提醒。这些维护提醒中的每一个都在每个月的同一天。在 运行 一些基本验证之后,我启动了一个 for 循环来执行此操作。问题是:第一个提醒日期是完美的,但所有 11 个日期都是 0000-00-00。我尝试在网上查看解决方案,但无法解决这个问题。
$this->load->model('Site_Model');
$this->load->model('Maintenance_Model');
$data['sites'] = $this->Site_Model->view_all_sites();
if($this->input->post('save'))
{
$this->form_validation->set_rules('site_id', 'Site ID', 'trim|required');
$this->form_validation->set_rules('date', 'Maintenance Date', 'trim|required');
$var = $this->input->post('date');
$date = str_replace('/', '-', $var);
$main_date = date('Y-m-d', strtotime($date));
if ($this->form_validation->run()){
for ($x = 1; $x <= 12; $x++) {
$maintenance_data = array(
'site_id' => $this->input->post('site_id'),
'date' => $main_date
);
$this->Maintenance_Model->add_maintenance($maintenance_data);
$main_date = strtotime(date("Y-m-d", strtotime($date)) . "+1 month");
}
$this->session->set_flashdata('success','Maintenance Scheduled Successfully');
redirect('dashboard/add_maintenance');
}else{
$this->session->set_flashdata('failure', validation_errors());
redirect('dashboard/add_maintenance');
}
}else {
$this->load->view('templates/header' , $data);
$this->load->view('dashboard/add_maintenance' , $data);
$this->load->view('templates/footer' , $data);
}
问题在于您的 for 循环,当它第一次运行时它具有 $main_date
的正确格式,但第二次它的格式被更改,这就是它在接下来的 11 次中不起作用的原因。此外,您还希望在 for 循环的下一行中使用 $main_date
。
$main_date = strtotime(date("Y-m-d", strtotime($date)) . "+1 month");
我想借此机会解释一下这个解决方案会给你带来问题,例如看看this之前问的问题。
所以我想建议使用库 Carbon 来计算日期和时间
这是一个非常直接的问题 - 您可以使用 DateTime
Class 完美解决这个问题,它是自版本 5.2 以来 PHP 的一部分。
像下面这样的东西应该可以完成这项工作
$strDate = $this->input->post('date');
$objDate = DateTime::createFromFormat('Y/m/d', $strDate);
for($i = 1; $i <= 12; $i++)
{
$maintenance_data = array(
'site_id' => $this->input->post('site_id'),
'date' => $objDate->format('Y-m-d')
);
$this->Maintenance_Model->add_maintenance($maintenance_data);
$objDate->add(new DateInterval('P1M'));
}
我试图在通过表单域输入一个日期时添加 12 个维护提醒。这些维护提醒中的每一个都在每个月的同一天。在 运行 一些基本验证之后,我启动了一个 for 循环来执行此操作。问题是:第一个提醒日期是完美的,但所有 11 个日期都是 0000-00-00。我尝试在网上查看解决方案,但无法解决这个问题。
$this->load->model('Site_Model');
$this->load->model('Maintenance_Model');
$data['sites'] = $this->Site_Model->view_all_sites();
if($this->input->post('save'))
{
$this->form_validation->set_rules('site_id', 'Site ID', 'trim|required');
$this->form_validation->set_rules('date', 'Maintenance Date', 'trim|required');
$var = $this->input->post('date');
$date = str_replace('/', '-', $var);
$main_date = date('Y-m-d', strtotime($date));
if ($this->form_validation->run()){
for ($x = 1; $x <= 12; $x++) {
$maintenance_data = array(
'site_id' => $this->input->post('site_id'),
'date' => $main_date
);
$this->Maintenance_Model->add_maintenance($maintenance_data);
$main_date = strtotime(date("Y-m-d", strtotime($date)) . "+1 month");
}
$this->session->set_flashdata('success','Maintenance Scheduled Successfully');
redirect('dashboard/add_maintenance');
}else{
$this->session->set_flashdata('failure', validation_errors());
redirect('dashboard/add_maintenance');
}
}else {
$this->load->view('templates/header' , $data);
$this->load->view('dashboard/add_maintenance' , $data);
$this->load->view('templates/footer' , $data);
}
问题在于您的 for 循环,当它第一次运行时它具有 $main_date
的正确格式,但第二次它的格式被更改,这就是它在接下来的 11 次中不起作用的原因。此外,您还希望在 for 循环的下一行中使用 $main_date
。
$main_date = strtotime(date("Y-m-d", strtotime($date)) . "+1 month");
我想借此机会解释一下这个解决方案会给你带来问题,例如看看this之前问的问题。
所以我想建议使用库 Carbon 来计算日期和时间
这是一个非常直接的问题 - 您可以使用 DateTime
Class 完美解决这个问题,它是自版本 5.2 以来 PHP 的一部分。
像下面这样的东西应该可以完成这项工作
$strDate = $this->input->post('date');
$objDate = DateTime::createFromFormat('Y/m/d', $strDate);
for($i = 1; $i <= 12; $i++)
{
$maintenance_data = array(
'site_id' => $this->input->post('site_id'),
'date' => $objDate->format('Y-m-d')
);
$this->Maintenance_Model->add_maintenance($maintenance_data);
$objDate->add(new DateInterval('P1M'));
}