I have a date that's being selected in a datepicker in the following format
Y-m-d g:i A
So using AM/PM, it shows the following in my input field, which is correct
When I submit the form offcourse Laravel won't update the record because the format is unknown to my DATETIME field in mysql.
My 'date' field is added to the $dates array so it should be parsed by Laravel
I tried using a Mutator on my Model as following, without success
public function setDateAttribute($value)
{
$this->attributes['date'] = Carbon::createFromFormat('Y-m-d g:i A', $value)->format('Y-m-d H:i:s');
}
The original value is not being updated.
Any idea what I might be doing wrong?
Thank you
Take a look at Laravel's date mutators, this handles the accessing and mutating dates going into and out of the database for you much like it does with created_at and the other default dates.
Basically, you need to add the date field to the $dates array on your model like so:
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class User extends Model
{
/**
* The attributes that should be mutated to dates.
*
* #var array
*/
protected $dates = [
'created_at', // Add if you're using timestamps on the model
'updated_at', // Add if you're using timestamps on the model
'deleted_at', // Add if you're using softDeletes on the model
'date'
];
}
This way when the model is persisted to the database it's done so as a DATETIME, whereas when it is being read from the database into your model it will be a Carbon instance
It seems that your carbon function is ok. But why it does not work, don't understand. But I have solution using PHP date function.
public function setDateAttribute($value)
{
$this->attributes['date'] = date("Y-m-d H:i:s", strtotime($value);
}
Laravel's date mutator expects a format like 'Y-m-d H:i:s', but you can use the $dateFormat attribute on your model to specify a different format. E.g.:
protected $dateFormat = 'Y-m-d g:i A';
Check out the Date Formats section in the docs under Date Mutators
Alternatively, you can parse the date using Carbon outside of the model, because attributes listed in the $dates will also accept Carbon instances:
$model->date = Carbon::createFromFormat('Y-m-d g:i A', '2016-11-29 02:00 PM');
This is the approach I typically use. To me this feels more like a front-end concern where you're trying to map a user-friendly format to one your models/DB expects, so I'll usually put this logic into a controller.
Related
I want to ask if how do you parse this date to look like : "12/24/1990" using Carbon in laravel or built in php date methods
$user->profile->birthdate
Just do this
use Carbon\Carbon;
Carbon::parse($user->profile->birthdate)->format('m/d/Y')
You may use date mutators like this in your Profile model (or date casting as #Jesper said):
class Profile extends Model
{
protected $dates = [
'birthdate', // date fields that should be Carbon instance
];
}
So, whenever you retrieve the model, Laravel will automatically cast the birthdate property to Carbon instance and you can use the format method to format it, for example:
$user->profile->birthdate->format('m/d/y');
Both solutions works for both Laravel 5.* and 6.*
First Solution
You can cast your birthdate variable to always be in the format you want, by putting the following in your Profile model.
/**
* The attributes that should be cast to native types.
*
* #var array
*/
protected $casts = [
'birthdate' => 'datetime:m/d/Y',
];
Reference:
https://laravel.com/docs/6.x/eloquent-mutators#date-casting
Second solution:
You can also cast the birthdate to always be a Carbon object in your Profile model, which you can then later format as you want, using the following code:
/**
* The attributes that should be mutated to dates.
*
* #var array
*/
protected $dates = [
'birthdate',
];
And then you can always do the following to format it in different ways:
$user->profile->birthdate->format('m/d/Y')
Reference: https://laravel.com/docs/6.x/eloquent-mutators#date-mutators
Using laravel Carbon, you can parse date like below
$carbonToday = Carbon::now();
$date = $carbonToday->format('m/d/Y');
Using PHP method
$carbonToday = Carbon::now();
$date = date('m/d/Y',strtotime($carbonToday));
Hope this will help you.
using Laravel carbon method
$date = "12-24-1990";
$carbon_date = Carbon\Carbon::createFromFormat('m/d/Y', $date);
using PHP method
$newdate = date('m/d/Y',strtotime($date));
I'm looking for a DateTime Mutator that change the format of dates, I'm working with Oracle DB and the admitted Format is (DD/MM/YYYY) and the input type "date" stores dates in (YYYY,MM,DD) format.
I found the $date function and a trait by Torzer, but I have to indicate the fields that I want to convert the format.
is there some trait or function that detect all date fields and convert them automatically in a format (DD/MM/YYYY)? this without indicate the field.
nowadays I use protected $date in my model:
protected $dates = [ 'fecha_nac', 'fecha_nac1', 'fecha_nac2', ];
By default laravel uses date formate 'Y-m-d H:i:s' if you want to use a different format you can customize it in your model in the following way.
protected $dateFormat = 'your date formate';
in your case it will be.
protected $dateFormat = 'd-m-Y';
You can override the getDates method on HasAttributes trait.
/**
* Get the attributes that should be converted to dates.
*
* #return array
*/
public function getDates()
{
$defaults = [static::CREATED_AT, static::UPDATED_AT];
return $this->usesTimestamps()
? array_unique(array_merge($this->dates, $defaults))
: $this->dates;
}
On your model:
public function getDates()
{
$dates = parent::getDates();
// add your dynamic logic here
return $dates;
}
I would really go for explicitly defining which fields should be converted as these dynamic operations can be expensive if you are working with the model quite a lot.
I have this, and it works nicely to give me UK-formatted dates:
protected $dateFormat = 'd-m-Y';
protected $dates = ['purchased', 'warranty_expires', 'scrapped_on', 'location_date', 'user_date'];
However, I also have created and modified (not the standard Laravel ones, but my own) that are Timestamps, not dates. How can I automate the formatting of those two fields when they are retrieved, to something like 'd-m-Y H:i:s' ?
You can do this with Carbon library
public function getFormattedPurchasedAttribute($date)
{
return Carbon::createFromFormat('Y-m-d H:i:s', $date)->format('d-m-Y H:i:s');
}
You have to use carbon class. Write this line in the top where all namespace are used.
use Carbon;
I personally don't use $dateFormat attribute because it changes format for all dates fields. What I would do is creating custom accessors to get formatted fields for example:
public function getFormattedPurchasedAttribute($value) {
return $this->asDateTime($value)->format('d-m-Y H:i:s');
}
so you can now use $model-formatted_purchased to get purchased field formatted in way you want
I have a datepicker plugin to pop-up a calendar view to allow users to select a date + time, however the format which it produces is:
May 9, 2016 8:30 AM
When storing to the database, I need the format to be:
2016-09-05 08:30:00
In the controller of my application, I have:
public function save(Request $request)
{
Entry::create($request->all());
return redirect('entries');
}
Which saves the users form input, however it doesn't save the datetime due to the incorrect format. I have tried creating a new function to format the date before entering it into the database.
public function formatDate($data)
{
$returnDate = DateTime::createFromFormat('Y-d-m G:i:s', $data);
return $returnDate->format('Y-d-m G:i:s');
}
However when I call the function from the save function, it says undefined function. Am I doing something wrong or what would be the correct way to achieve this?
You have to set the correct format for DateTime::createFromFormat(). Create from format means, you have to tell a pattern to match any information in the given date. For your date, the pattern is:
DateTime::createFromFormat('F j, Y g:i A', $data);
Here is a demo: https://eval.in/567629
A list of all format options: http://php.net/manual/en/function.date.php
Both functions are inside the model?
If so, how are you trying to call the formatDate function?
You could use an anonymous function instead, try:
$formatted_date = function() use ($data) {
$returnDate = DateTime::createFromFormat('Y-d-m G:i:s', $data);
return $returnDate->format('Y-d-m G:i:s');
};
Inside your controller or model.
In Laravel, the created_at and updated_at are casted to Carbon objects
https://laravel.com/docs/5.2/eloquent-mutators#date-mutators
With your date, you could do the same thing
class User extends Model
{
/**
* The attributes that should be mutated to dates.
*
* #var array
*/
protected $dates = ['created_at', 'updated_at', 'your_date'];
}
then, when saving the date, it will be cast to the correct format.
Give that a try and let us know how you get on!
For example;
$data = "May 9, 2016 8:30 AM";
return date('Y-d-m H:i:s',strtotime($data));
According to Laravel Docs that says :
By default, timestamps are formatted as 'Y-m-d H:i:s'. If you need to customize the timestamp format, set the $dateFormat property on your model. This property determines how date attributes are stored in the database, as well as their format when the model is serialized to an array or JSON
<?php
namespace App;
use Illuminate\Database\Eloquent\Model;
class Flight extends Model
{
/**
* The storage format of the model's date columns.
*
* #var string
*/
protected $dateFormat = 'U';
}
I want to store all created_at and updated_at values as integer unix timestamp.
Which values should I set for protected $dateFormat variable without using Date Mutators ?
I don't know why the documentation tells to set dateFormat as a property, but this works:
protected function getDateFormat()
{
return 'U';
}
I thought that default value of dateFormat property is U that cause all dateTime values stored as String TimeStamp (YYYY-MM-DD HH:MM:SS) while when I want to Store as integer timeStamp, must to add protected $dateFormat = 'U'; to desired Model.
Sorry for this Careless.