Convert to DateTime from a string '10-April-2020' - c#

Looking for assistance in converting a date string i receive from a web form, where the format will be something like "10-April-2020". I need to save this into the database in the US date format "yyyy-mm-dd" so that the example date provided would go in as '2020-04-10'.
This is what I have so far, which complains that it is not a valid datetime.
string LicenseExpiry = LicenseExpiry.Text;
IFormatProvider culture = new CultureInfo("en-US", true);
DateTime dateExpires = DateTime.ParseExact(LicenseExpiry, "yyyy-MM-dd", culture);
I have also tried the following which also fails.
DateTime dateExpires;
string LicenseExpiry = LicenseExpiry.Text;
IFormatProvider culture = new CultureInfo("en-US", true);
if (DateTime.TryParseExact(LicenseExpiry, "yyyy-MM-dd", culture, DateTimeStyles.None, out dateExpires))
{
// Do something
}
Can anyone help with either of the attempts to see what went wrong? I am not allowed to change the Ui/Form to do any client side date manipulation either, and so my solution needs to be done in the C# code behind file.

MM means the month number (from 01 through 12)
To parse 10-April-2020, you
need MMMM, see
Custom date and time format strings
The "MMMM" custom format specifier represents the full name of the month

Related

String was not recognized as a valid DateTime when string is 13/07/15

I have a string date = 13/07/15 in this format and I want to convert it into DateTime, but I get the error mentioned below
String was not recognized as a valid DateTime.
What can I do to convert into datetime. I have tried this
DateTime dt = Convert.ToDateTime(date);
Never noticed that different cultures write their data and time in different formats? Although the format you use is valid in most Western European countries it is rubbish in the United States.
To overcome this problem, you can ask the system for the current date and time format:
var currentCulture = System.Globalization.CultureInfor.CurrentCulture
IFormatProvider dateTimeFormat = currentCulture.DateTimeFormat;
string dateTxt = #"13/7/2015";
System.DateTime myDate = System.DateTime.Parse(dateTxt, dateTimeFormat);
That should do the trick if your computer has the correct culture.
If you want to be able to understand a lot of cultures, don't ask for the current culture but use one of the constructors of System.Globalization.CultureInfo
Not wise, because does 1/3/2015 mean March 1st, or January 3rd?
Your code DateTime dt = Convert.ToDateTime(date); is perfect. Seems to me like the error is in your database, because it converts it into date if it gets the full year. Please check it in your database.
Do like this,
DateTime date = DateTime.ParseExact(s, "dd/MM/yy", null);
Source : DateTime.ParseExact

Parsing "mm/dd/yy" string to "mm/dd/yyyy" date object in C#

I am working on an ASP.NET Mvc application with C# and facing a problem when I try to upload a .CSV file in order to save its data to database.
The problem comes from the date column of the .CSV file. There are two formats of date used in that column. The first one is "mm/dd/yyyy" that I have no problem to parse to a DateTime object by the following code:
// for the date : 09/30/2014
DateTime tempo = Convert.ToDateTime("09/30/2014");
The second format is "mm/dd/yy". The same method above doesn't work for this format and throws an exception
// for the date : 09/30/14
DateTime tempo = Convert.ToDateTime("09/30/14");
// this line throws ;
// [09/30/14] String was not recognized as a valid DateTime. exception
Is there a solution which works for both of date formats ?
Thanks for your help.
First, mm specifier is for minutes, MM specifier is for months. Convert.ToDateTime method uses your CurrentCulture by default. That means MM/dd/yy is not a standard date and time format your CurrentCulture but MM/dd/yyyy is.
You can use custom date and time formatting string like;
string s = "09/30/14";
DateTime date;
if(DateTime.TryParseExact(s, "MM/dd/yy", CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
// Successfully parse
}
Be aware "/" custom format specifier has a special meaning of replace me with the current culture or supplied culture date separator. That means even if your string and format matches, you parsing will fail.
Is there a solution which works for both of date formats ?
DateTime.TryParseExact method has an overload that takes formats as a string array. If your string matches one of your formats, it will returns true.
string s = "09/30/14";
sstring[] formats = {"MM/dd/yy", "MM/dd/yyyy"};
DateTime date;
if(DateTime.TryParseExact(s, formats, CultureInfo.InvariantCulture,
DateTimeStyles.None, out date))
{
// Successfully parse
}
Also you can see all standard date and time patters of your CurrentCulture like;
foreach (var format in CultureInfo.CurrentCulture.
DateTimeFormat.
GetAllDateTimePatterns())
{
Console.WriteLine (format);
}

Console application string was not recognised as valid datetime

I have a excel sheet in which am taking a date column in this format "23/8/11 01:33:01:PM"
and am inserting it in sql 2008 using datarow but am getting a error
String was not recognised as valid datetime.
Can any one please help?
DateTime newdate = Convert.ToDateTime(row[8].ToString());
Here how Convert.ToDateTime method looks like when you decompile it;
public static DateTime ToDateTime(string value)
{
if (value == null)
return new DateTime(0L);
else
return DateTime.Parse(value, (IFormatProvider) CultureInfo.CurrentCulture);
}
As you can see, this method use DateTime.Parse method with your CurrentCulture. And if your string doesn't match your current culture date format, your code will be broken. That's the reason you get this error.
Use DateTime.ParseExact with "dd/M/yy hh:mm:ss:tt" format instead.
Converts the specified string representation of a date and time to its
DateTime equivalent. The format of the string representation must
match a specified format exactly or an exception is thrown.
string s = "23/8/11 01:33:01:PM";
DateTime newdate = DateTime.ParseExact(s, "dd/M/yy hh:mm:ss:tt", CultureInfo.InvariantCulture);
Console.WriteLine(newdate);
Output will be;
8/23/2011 1:33:01 PM
Here a DEMO.
For your case;
DateTime newdate = DateTime.ParseExact(row[8].ToString(), "dd/M/yy hh:mm:ss:tt", CultureInfo.InvariantCulture);
For more informations, take a look;
Custom Date and Time Format Strings
Convert.ToDateTime internally calls DateTime.Parse which by default will use the current culture of your application. If 23/8/11 01:33:01:PM is not a valid format for this culture then this method will fail.
For specific date formats it's best to use DateTime.ParseExact e.g.
DateTime.ParseExact("23/8/11 01:33:01:PM", "dd/M/yy hh:mm:ss:tt", CultureInfo.InvariantCulture);
This approach makes your code culture independent which means the date will always be parsed correctly (given it's in the specified format).
This will work:
DateTime newdate = Convert.ToDateTime("8/23/11 01:33:01 PM");
I changed day and month and removed the colon a the end. But that is very specific. You need to know more about the dates passed to do that.

C# Datetime format conversion

I have a conversion problem with datetime. I have a date string as MM/dd/yyyy. Now I need to convert it to yyyy-MM-dd.
But I'm facing some error. Please help
public static DateTime ToDBDateTime(string _dateTime)
{
string sysFormat = "MM/dd/yyyy hh:mm:ss tt";
string _convertedDate = string.Empty;
if (_dateTime != null || _dateTime != string.Empty)
{
_convertedDate = DateTime.ParseExact(_dateTime, sysFormat, System.Globalization.CultureInfo.InvariantCulture).ToString(_toDBDateFormat);
//_convertedDate = Convert.ToDateTime(_dateTime).ToString(_toDBDateFormat);
/// Debug.Print(sysFormat);
}
return Convert.ToDateTime(_convertedDate);
}
And I want to know that is there is any way to pass the datetime in various formats and it would return the expected format.
E.g.: if I pass date as dd/MM/yyyy or MM/dd/yyyy, the above function would return the date in format as yyyy-MM-dd.
Please provide some suggestion to solve datetime issues.
I have a date string as MM/dd/yyyy
Right... and yet you're trying to parse it like this:
string sysFormat = "MM/dd/yyyy hh:mm:ss tt";
...
_convertedDate = DateTime.ParseExact(_dateTime, sysFormat,
CultureInfo.InvariantCulture)
You need to give a format string which matches your input - so why are you including a time part? You probably just want:
string sysFormat = "MM/dd/yyyy";
However, that's not the end of the problems. You're then converting that DateTime back into a string like this:
.ToString(_toDBDateFormat)
... and parsing it once more:
return Convert.ToDateTime(_convertedDate);
Why on earth would you want to do that? You should avoid string conversions as far as possible. Aside from anything else, what's to say that _toDBDateFormat (a variable name which raises my suspicions to start with) and Convert.ToDateTime (which always uses the current culture for parsing) are going to be compatible?
You should:
Work out how you want to handle being given an empty string or null, and just return an appropriate DateTime then
Otherwise, just parse using the right format.
This part of your question also concerns me:
E.g.: if I pass date as dd/MM/yyyy or MM/dd/yyyy, the above function would return the date in format as yyyy-MM-dd.
There's no such thing as "the date in format as yyyy-MM-dd". A DateTime is just a date and time value. It has no intrinsic format. You specify how you want to format it when you format it. However, if you're using the value for a database query, you shouldn't be converting it into a string again anyway - you should be using parameterized SQL, and just providing it as a DateTime.
As you have a date in a string with the format "MM/dd/yyyy" and want to convert it to "yyyy-MM-dd" you could do like this:
DateTime dt = DateTime.ParseExact(dateString, "MM/dd/yyyy", CultureInfo.InvariantCulture);
dt.ToString("yyyy-MM-dd");
Use the inbuilt tostring like this:
Convert.ToDateTime(_convertedDate).ToString("MM/dd/yyyy") or whatever format you want.
I tried this and its working fine.
DateTime date1 = new DateTime(2009, 8, 1);
date1.ToString("yyyy-MM-dd hh:mm:ss tt");
You can apply any format in this ToString.
Hope that helps
Milind

Date format issue between in app and windows with c#

I want to convert a string to datatime. Here is my code:
DateTime? dt = null;
dt = DateTime.Parse(postdate[i]);
It works only for dd/mm/yyyy, not work for mm/dd/yyyy because on my computer the date format is set as dd/MM/yyyy in Control Panel.
So if I want to use the application always accept valid format mm/dd/yyyy, no matter the windows date format setting is. How to implement this in c# code?
I think this should work:
DateTime? dt = null;
dt = DateTime.ParseExact(postdate[i], "MM/dd/yyyy", System.Globalization.CultureInfo.CurrentCulture);
You could do something like this:
IFormatProvider culture = new CultureInfo("en-US", true);
DateTime myDateTime = DateTime.Parse(myDateTimeValue, culture);
Instead of parsing with the default culture (which is based on the computer's regional settings) it will parse with the US culture which uses MM/dd/YYYY
#JDunkerley's response is on the right track, but:
the format specifier for a 2-digit month is MM not mm.
using CultureInfo.CurrentCulture won't correctly parse a string containing slash separtors if you are running under a culture that uses a different separator (for example: the culture de-DE will expect a period separator.
This will work:
dt = DateTime.ParseExact(postdate[i], "MM/dd/yyyy",
System.Globalization.CultureInfo.InvariantCulture);

Categories