My application is setted with pt-BR culture (Date is dd-mm-yyyy) in web.config:
There's a gotcha with the default model binder that is not easy to know about but once you know it you no longer make the same mistake:
When you use a POST request, the default model binder uses your culture settings to parse the dates.
When you use a GET request, the default model binder uses CultureInfo.InvariantCulture
to parse the dates and ignores your current culture settings.
Since you are using a GET request and passing the date as a query string parameter, you should format it using the invariant culture format when sending it in the url. The correct way to format your date as a query string parameter is yyyy-MM-dd
.
You may take a look at the following blog post which gets into more details.
Got the same problem using an @Html.Action(..)
in a view. For this situation it can be solved by putting the DateTime
in a model:
public class MyModel
{
public DateTime Value {get;set;}
}
and in the view:
@Html.Action("MyAction", new { myModel })
Note the new { }
around the instance of MyModel
, this way the DateTime
is not converted to a string. This solution only works for Html.Action()
and not for Html.ActionLink()
or Url.Action()
since MVC is doing a myModel.ToString()
in the URL.
As someone who does a lot of work with US companies, I've had a lot of experience with date issues.
My best advice is to choose an unambiguous format when transmitting.
dd-MMM-yyyy
and
yyyy-MM-dd
Are safe bets, and will be successfully parsed by DateTime.Parse(obj).
If changing the date format is not an option, you should look at DateTime.ParseExact
, which allows you to specify the exact format string you are after.
One approach would be to accept the date as a string and then manipulate it in the controller to the correct locale/culture.