Be part of JetBrains PHPverse 2026 on June 9 – a free online event bringing PHP devs worldwide together.

harryg's avatar

Laravel date parsing from datetime-local and freeform date request data

A very handy feature of Laravel is the ability of make use of automatic date mutators. This means, say I have a published_at attribute in my model I can add this to a $dates array and Laravel will automatically parse this to a Carbon instance and vice-versa when retrieving and persisting to the database.

On one of my forms, rather than make use of a datepicker library I thought I'd try the datetime-local input type (which currently has limited support but is in the HTML spec). This uses a format like 2012-12-14T19:00. This causes a problem with Laravel's date mutator as it assumes a format, usually based on the database in use (although you can override this it seems) and uses this the parse the date before saving.

What it comes down to is that I need to add my own mutator to my model to handle irregular date formats:

public function setPublishedAtAttribute($date)
{
    if (is_string($date))
        $this->attributes['published_at'] = Carbon::parse($date);
}

This can handle unexpected date formats so should also work if the datetime-local input isn't supported and falls back to a text input into which a use types the datetime in their own format. It seems this is fired before going through to the eloquent date parser which therefore receives a Carbon instance and just passes it on.

Shouldn't Eloquent be able to handle this natively? I imagine Carbon::parse() is slower than Carbon::createFromFormat() but it should be negligible.

0 likes
4 replies
Cataract0523's avatar

Today I spent many hours trying to find a workaround of that problem. Luckly I found your post. More people should see this. But I still can't convert it to 24h format. Do you know how to do that?

Cronix's avatar

couldn't you also just do $date = str_replace('T', ' ', $request->date) before saving/validating/inserting into the db?

1 like
AamirSohailKmAs's avatar

@cronix is right in case of saving/validating/inserting into the db. And off course replace space with T, when retrieving from db. So here we go, $date = str_replace(' ', 'T', $request->date);

Please or to participate in this conversation.