Laravel 不接受来自带有 axios 的 Vuex 的 Js 日期格式,捕获 500 内部错误

Lavarel don't accept Js Date format from Vue with axios, catch an 500 Internal Error

我有一个 Vue 组件,通过 axios 请求传递日期。

我有一个介绍日期的输入,例如。 (“2021-03-06”),它正在工作,但如果我使用 datePicker,它就不会。

public function store()
    {

        $attributes = request();

        Task::create([
            'name' => $attributes['name'],
            'client_id' => $attributes['client_id'],
            'task_date' => $attributes['task_date'],
            'state' => 1,
            'type' => $attributes['type'],
            'details' => $attributes['details'],
            'invoiced_date' => $attributes['invoiced_date'],
            'programing_worked_minutes' => $attributes['programing_worked_minutes'],
            'support_worked_minutes' => $attributes['support_worked_minutes'],
            'closed_date' => null,
        ]);
        return 1;
    }
        <datepicker
                    v-model="task.task_date"
                    :lower-limit="new Date()"
                    placeholder="click here to choose a date"
                    id="task_date"
                    name="task.task_date"
                    class="block rounded p-0 shadow-inner  border-gray-300 w-1/2"
                    required
                />
export default {
    name: "addTask",
    components: {
        Datepicker
    },
    data() {
        return {
            task: {
                name: null,
                client_id: null,
                task_date: null,
                type: null,
                details: null,
                invoiced_date: null,
                programing_worked_minutes: null,
                support_worked_minutes: null,
            },

            message: "",
            visual_spinner: false,
        }
    },
    methods: {
        sendData() {
            this.message = '';
            this.visual_spinner = true;
            axios.post('/create-task', {
                name: this.task.name,
                client_id: this.task.client_id,
                task_date: this.task.task_date,
                type: this.task.type,
                details: this.task.details,
                invoiced_date: this.task.invoiced_date,
                programing_worked_minutes: this.task.programing_worked_minutes,
                support_worked_minutes: this.task.support_worked_minutes,

            })
                .then((response) => {
                    this.onSuccess();
                })
                .catch(function (error) {
                    console.log(error);

                });
        },

因此,请求运行良好,问题在于格式 Date , 如果 2021-03-01 它在工作,但如果它是 2021 年 3 月 13 日星期六 00:00:00 GMT+0200(东欧标准时间) 不工作

谢谢

2021 年 3 月 7 日星期日 00:17:59 GMT+0600(孟加拉国标准时间)与 2021-03-07 不一样。 500 internal error 表示服务器端发生了一些事情。 我想,问题出在您的 Laravel 数据库架构 例如:$table->dateTime('task_date'); 替换为 $table->string('task_date'); 然后迁移。

如果问题出在日期格式上,您可以在将其提交到数据库之前将其格式化为预期的格式。

一旦 JavaScript 日期格式 Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time) 被 Laravel 接收到,您可以使用框架自带的 Carbon PHP library 对其进行格式化。即:


use Carbon\Carbon;


$javaScriptDateFormat = "Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time)";
$date = explode("(", $javaScriptDateFormat, 2)[0];
$formattedDate = Carbon::parse($date)->format('Y-m-d');
print_r($formattedDate); // "2021-03-13"

附录

另一种选择是,您可以使用 Moment.js 将从 datePicker Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time) 获得的 'date string' 格式化为预期格式 before 将其发送到服务器。即:

import moment from "moment";

const date = new Date("Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time)");
console.log(moment(date).format("YYYY-MM-DD"));  // 2021-03-13

因为 Moment.js has been discontinued, as suggested by @AnuratChapanond, use Day.js 而不是替代。

import dayjs from "dayjs";

const date = new Date("Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time)");
console.log(dayjs(date).format("YYYY-MM-DD"));  // 2021-03-13

终于用上了

formatDate(date) {
            var d = new Date(date),
                month = '' + (d.getMonth() + 1),
                day = '' + d.getDate(),
                year = d.getFullYear();

            if (month.length < 2)
                month = '0' + month;
            if (day.length < 2)
                day = '0' + day;

            return [year, month, day].join('-');
        }

转换 Sat Mar 13 2021 00:00:00 GMT+0200 (Eastern European Standard Time) 进入 2021-03-13