EDIT: See important new update below in the Workaround
As I was preparing the code for my upcoming Pluralsight course about Lightning Best Practices, I ran into an error with the new lightning:input base lightning component that up until today had me banging my head on the desk. Since I would hate to see any of you go through all the agony I have faced with this issue, I am writing this up and hope it saves someone unnecessary grief.
The Problem
The lightning:input component creates an HTML input component and supports the datetime-local input type. This particular base lightning component is still in beta, so I am not terribly surprised that it has a few issues and I suspect that this problem will be resolved eventually.
In the meantime, if you attempt to use the input component and the datetime-local type, such as in the following code:
<lightning:input label="Date/Time" type="datetime-local" name="DateTime" aura:id="DateTime" value="{!v.newRace.DateTime__c}" />
And you attempt to save the record to the database, you will get back an error message similar to the following:
Error The following error has occurred: [{"fieldErrors":{"DateTime__c":[{"message":"Invalid data type.","fieldApiName":"DateTime__c","fieldLabel":"Date Time"}]},"pageErrors":[{"message":"The Record provided contains field(s) with invalid data."}]}]
Countless searches did not help find a solution and after playing around with it for a while, I determined that the problem was coming from the fact that the seconds (which should be optional) were not included in the string that was being sent to the server.
For example, if I were to print to the console log the value of the input date time after it had been entered, but before it was saved, it would look like this:
2017-09-01T09:00
Notice the missing seconds?
The Workaround
Of course, you can always go back to using the ui:inputDateTime component, which does not seem to have this same problem.
EDIT: Turns out using the ui:inputDateTime is the only suitable workaround for this problem at this time. I was contacted by a member of the Salesforce team, who told me that using the workaround I describe below has one major drawback. It converts all dates to using GMT time and not the users local time and therefore is NOT a good workaround. They suggest just using the ui:inputDateTime until the fix is released as part of the Spring 18 release.
As looking for another option, I discovered that if I use the AuraLocalizationService to format the date time string and include the missing seconds, then the save to the database would work.
So, the code I needed to do that, resides in my client-side controller and looks like the following:
var rawDate = component.get("v.newRace.DateTime__c"); var formattedDate = $A.localizationService.formatDate(rawDate, "yyyy-MM-ddTHH:mm:ss"); component.set("v.newRace.DateTime__c", formattedDate);
Now if I print to the console log the value of the formattedDate variable, I see this and the record save successfully.
2017-09-01T09:00:00
I suspect this is a bug (EDIT: YES, it is and it will be fixed in the Spring 18 release) and imagine it will soon be fixed, but hope this helps someone struggling with using the component in the meantime.
Nice one!
Worked for me. Thanks for sharing.