String was not recognized as a valid DateTime on DateTime.ParseExact - c#

I know there is a lot of asked question here about DateTime but I saw them all already and seems not to find the right solution for my case.
Here is my code:
return DateTime.ParseExact(partialDate + dtfi.DateSeparator + _baseDate.ToString(), "dd/MM/yyyy", new CultureInfo("en-us");
This is throwing me an Exception.
Here is the value of the variables:
string partialDate = "1/22";
string dtfi.DateSeparator = "/";
int _baseDate = 2004;

You should use format "m/dd/yyyy" because datestring becomes 1/22/2004
return DateTime.ParseExact(partialDate + dtfi.DateSeparator + _baseDate.ToString(), "m/dd/yyyy", new CultureInfo("en-us"));

Unfortunately, both answers are wrong.
So, we all agree your result string will be "1/22/2004". Before looking which formats exactly matches your characters, let's look at your string is a standard date and time format for en-US culture or not.
DateTime.Parse("1/22/2004",
CultureInfo.GetCultureInfo("en-US")) // 22 January 2004 00:00:00
BANG!
We have a DateTime perfectly. But what if our string wouldn't be a standard date and time format for en-US culture? Then we can specify our format with DateTime.TryParseExact method. Let's look at which formats we can use to parsing our string.
1 matches with "M" custom format specifier which is from 1 to 12 and single-digit month is formatted without a leading zero.
/ is a DateSeparator and we can use it the same in our format because en-US culture has / as a DateSeparator already. Remember, "/" custom format specifier has a special meaning of replace me with current culture or supplied culture date separator
22 matches with "dd" custom format string which is from 01 to 31 and single-digit days is formatted with a leading zero. Remember, you can also use d format specifier in such a case but using wider formats is recommended.
2004 matches with "yyyy" custom format specifier which represents the year with a four digits.
So, the right format will be M/dd/yyyy in result.
string s = "1/22/2004";
DateTime dt;
if(DateTime.TryParseExact(s, "M/dd/yyyy", CultureInfo.GetCultureInfo("en-US"),
DateTimeStyles.None, out dt))
{
Console.WriteLine(dt); // 22 January 2004 00:00:00
}

You are referring to wrong format, so obviously it will throw exception. Below is what you are doing
string partialDate = "1/22";
string dtfi.DateSeparator = "/";
int _baseDate = 2004;
string ex = partialDate + dtfi.DateSeparator + _baseDate.ToString();
which gives you 1/22/2014 i.e., MM/dd/yyyy
and in code you are referring to
return DateTime.ParseExact(partialDate + dtfi.DateSeparator + _baseDate.ToString(), "dd/MM/yyyy", new CultureInfo("en-us");
Try using correct Format, to get the right result.

Related

Datetime.parseExact gives (1-9) day's value with single digit, without 0

I have this code, it gives day's value as 1,2,3 .. instead of 01,02,03..
(DateTime.ParseExact("20160416", "yyyyMMdd", CultureInfo.InvariantCulture))
gives: 4/16/2016 12:00:00 AM.
I need 04/16/2016 12:00:00 AM
I have tried different cultures but nothing worked.
DateTime doesn't store any formatting information, it's just a structure representing a date and time. ParseExact is parsing your date string correctly.
If you want it formatted, you supply a format to DateTime.ToString, for example:
var formattedDate = dateTime.ToString("MM/dd/yyyy hh:mm:ss tt");
See this fiddle.
DateTime.ParseExact returns DateTime which doesn't have any implicit format. This "format" concept only applies when you get it's textual (a.k.a. string) representation.
You didn't told use how and where you see this 4/16/2016 12:00:00 AM string but if you wanna get days part with leading zero, you can use The dd format specifier with a proper culture (for calendar and time designators).
The dd custom format string represents the day of the month as a
number from 01 through 31. A single-digit day is formatted with a
leading zero.
DateTime dt = DateTime.ParseExact("20160416", "yyyyMMdd", CultureInfo.InvariantCulture);
string str = dt.ToString("MM/dd/yyyy hh:mm:ss tt", CultureInfo.InvariantCulture);
// 04/16/2016 12:00:00 AM

DateTime.ParseExact throws System.FormatException

Why this line of code sometimes throws System.FormatException?
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);
Because your string and format doesn't match.
From documentation;
Converts the specified string representation of a date and time to its
DateTime equivalent using the specified format and culture-specific
format information. The format of the string representation must match
the specified format exactly.
Use dd.MM.yyyy format instead.
DateTime d = DateTime.ParseExact("01.07.2014",
"dd.MM.yyyy",
CultureInfo.InvariantCulture);
Here a demonstration.
Remember, "/" custom format specifier has a special meaning in custom date and time formats. It means as; replace me with the current culture date separator.
In your profile, it says you are from Azerbaijan. That means your CurrentCulture is probably az-Cyrl-AZ (Cyrillic, Azerbaijan) or az-Latn-AZ (Latin, Azerbaijan).
Actually, doesn't matter which culture you use on this case because both culture has . as a DateSeparator property.
That means your original code also works with your CurrentCulture.
DateTime d = DateTime.ParseExact("01.07.2014",
"dd/MM/yyyy",
CultureInfo.CurrentCulture);
// or you can use null
For more information, take a look;
Custom Date and Time Format Strings
You need a culture where "." is the DateSeparator, for example:
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
CultureInfo.GetCultureInfo("az-Cyrl-AZ"));
if you are in Azerbaijan and use Azerbaijani language with the Cyrillic script.
You can use:
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
null);
to just take the current culture.
Maybe you just need "d" instead of the verbose "dd/MM/yyyy", since the standard short date format in Azerbaijani is just like "01.07.2014".
The "invariant culture" uses "/" as its DateSeparator, so therefore you should not use it in your case.
Also, this works:
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy",
new DateTimeFormatInfo { DateSeparator = ".", }
);
because new DateTimeFormatInfo() makes a read/write "invariant-culture" date/time info for which you can change the relevant property.
The / in the date format will match the date separator of the culture that you specify. If you use a culture that has period as date separator, the parsing will work.
Example:
DateTime d = DateTime.ParseExact("01.07.2014", "dd/MM/yyyy", CultureInfo.GetCultureInfo("de"));
You can also use a literal period instead of the date separator specificer, then it works with the invariant culture:
DateTime d = DateTime.ParseExact("01.07.2014", "dd.MM.yyyy", CultureInfo.InvariantCulture);
Ref: Custom Date and Time Format Strings
The format you have is different from the string provided:
Try either of the below, it will work :)
DateTime d1 = DateTime.ParseExact("01/07/2014", "dd/MM/yyyy", CultureInfo.InvariantCulture);
DateTime d2 = DateTime.ParseExact("01.07.2014", "dd.MM.yyyy", CultureInfo.InvariantCulture);
Problem:
Your separator in date is . while in string format it is /
Solution:
Your format should be "dd.MM.yyyy" or "MM.dd.yyyy" as your date is "01.07.2014". 01 and 07 exist both as date and month.
This date can be 01st July 2014 or 07 Jan 2014.
Your code should be
DateTime d = DateTime.ParseExact("01.07.2014",
"dd.MM.yyyy",
CultureInfo.InvariantCulture);
OR
DateTime d = DateTime.ParseExact("01.07.2014",
"MM.dd.yyyy",
CultureInfo.InvariantCulture);

DateTime.ToString() does not work as expected with slash as date-separator

I want to convert the date time to "MM/dd/yyyy" and when i am converting to this format the date is getting like "xx-xx-xxxx". I have written code like
var format = "MM/dd/yyyy HH:mm";
DateTime dt = DateTime.Now;
var dateString = dt.toString(format); // the value i am getting is 05-28-2014 12:47 but i require the 'dateString' value to be `05/28/2014 12:53`.
What is the issue with that.
Your currrent culture's date-separator seems to be - that's why you get it. You have to specify InvariantCulture:
string dateString = dt.toString("MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
See: The "/" Custom Format Specifier
The "/" custom format specifier represents the date separator, which
is used to differentiate years, months, and days. The appropriate
localized date separator is retrieved from the
DateTimeFormatInfo.DateSeparator property of the current or specified
culture.
Another way is to escape the / with \:
string dateString = dt.toString(#"MM\/dd\/yyyy HH\:mm");
But in my opinion, if you already know the special meaning of / as "current culture's date-separator", it's better(in terms of readability) to use the correct CultureInfo (or InvariantCulture) instead.
This depends on your current culture date-separator. Try to include InvariantCulture as follows:
var dateStringFormat= dt.toString("MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture);
Another way from #TimSchmelter's answer is to escape special symbols / and : so they are not treated as day and time separators.
var dateString = dt.toString(#"MM\/dd\/yyyy HH\:mm");
you will specified the format while converting date and time i.e. DateTime.Now.ToString("MM/dd/yyyy hh:mm ss tt")
for more ref.
http://msdn.microsoft.com/en-us/library/system.datetime.aspx

Datetime format Issue: String was not recognized as a valid DateTime

I want to format the input string into MM/dd/yyyy hh:mm:ss format in C#.
The input string is in format MM/dd/yyyy hh:mm:ss
For example :"04/30/2013 23:00"
I tried Convert.ToDateTime() function, but it considers 4 as date and 3 as month which is not what I want. Actually month is 04 and date is 03.
I tried DateTime.ParseExact() function also, But getting Exception.
I am getting error:
String was not recognized as a valid DateTime.
Your date time string doesn't contains any seconds. You need to reflect that in your format (remove the :ss).
Also, you need to specify H instead of h if you are using 24 hour times:
DateTime.ParseExact("04/30/2013 23:00", "MM/dd/yyyy HH:mm", CultureInfo.InvariantCulture)
See here for more information:
Custom Date and Time Format Strings
You can use DateTime.ParseExact() method.
Converts the specified string representation of a date and time to its
DateTime equivalent using the specified format and culture-specific
format information. The format of the string representation must match
the specified format exactly.
DateTime date = DateTime.ParseExact("04/30/2013 23:00",
"MM/dd/yyyy HH:mm",
CultureInfo.InvariantCulture);
Here is a DEMO.
hh is for 12-hour clock from 01 to 12, HH is for 24-hour clock from 00 to 23.
For more information, check Custom Date and Time Format Strings
try this:
string strTime = "04/30/2013 23:00";
DateTime dtTime;
if(DateTime.TryParseExact(strTime, "MM/dd/yyyy HH:mm",
System.Globalization.CultureInfo.InvariantCulture,
System.Globalization.DateTimeStyles.None, out dtTime))
{
Console.WriteLine(dtTime);
}
This can also be the problem if your string is 6/15/2019. DateTime Parse expects it to be 06/15/2019.
So first split it by slash
var dateParts = "6/15/2019"
var month = dateParts[0].PadLeft(2, '0');
var day = dateParts[1].PadLeft(2, '0');
var year = dateParts[2]
var properFormat = month + "/" +day +"/" + year;
Now you can use DateTime.Parse(properFormat, "MM/dd/yyyy"). It is very strange but this is only thing working for me.
change the culture and try out like this might work for you
string[] formats= { "MM/dd/yyyy HH:mm" }
var dateTime = DateTime.ParseExact("04/30/2013 23:00",
formats, new CultureInfo("en-US"), DateTimeStyles.None);
Check for details : DateTime.ParseExact Method (String, String[], IFormatProvider, DateTimeStyles)
DateTime dt1 = DateTime.ParseExact([YourDate], "dd-MM-yyyy HH:mm:ss",
CultureInfo.InvariantCulture);
Note the use of HH (24-hour clock) rather than hh (12-hour clock), and the use of InvariantCulture because some cultures use separators other than slash.
For example, if the culture is de-DE, the format "dd/MM/yyyy" would expect period as a separator (31.01.2011).
Below code worked for me:
string _stDate = Convert.ToDateTime(DateTime.Today.AddMonths(-12)).ToString("MM/dd/yyyy");
String format ="MM/dd/yyyy";
IFormatProvider culture = new System.Globalization.CultureInfo("fr-FR", true);
DateTime _Startdate = DateTime.ParseExact(_stDate, format, culture);
You may use this type format (get formatted data from sql server)
FORMAT(convert(datetime,'16/04/2018 10:52:20',103),'dd/MM/yyyy HH:mm:ss', 'en-us')
CONVERT(VARCHAR,convert(datetime,'16/04/2018 10:52:20',103), 120)

How can I get this DateTime format in .NET

I'm trying to format some DateTime into this W3C DateTime format :-
Complete date plus hours and minutes:
eg. YYYY-MM-DDThh:mmTZD (eg 1997-07-16T19:20+01:00)
where:
YYYY = four-digit year
MM = two-digit month (01=January, etc.)
DD = two-digit day of month (01 through 31)
hh = two digits of hour (00 through 23) (am/pm NOT allowed)
mm = two digits of minute (00 through 59)
ss = two digits of second (00 through 59)
s = one or more digits representing a decimal fraction of a second
TZD = time zone designator (Z or +hh:mm or -hh:mm)
I originally had this...
var myDateTime = someDateTime.ToString("s",
System.Globalization.CultureInfo.InvariantCulture);
But that results in a string of :
2011-08-31T08:46:00
Can anyone help?
You want "o":
var myDateTime = someDateTime.ToString("o",
System.Globalization.CultureInfo.InvariantCulture);
Use the following:
yourDateTime.ToString( "yyyy-MM-ddTHH:mmK", CultureInfo.InvariantCulture );
Here is more than you'll ever want to know on DateTime formats:
http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx
I believe you want
"yyyy-MM-ddTHH:mmK"
Note:
HH rather than hh to be 24 hour
K to specify the time zone; this relies on the DateTime.Kind being UTC or local; unspecified will end up with an empty string
You should also use CultureInfo.InvariantCulture to make sure no funky culture information is used. (You could quote the - and : as an alternative, but I'd use the invariant culture to make sure.)
You can format it like this:
someDateTime.ToString("yyyy-MM-dd");
Here's the documentation of the 'standard' supported datetime format strings:
http://msdn.microsoft.com/en-us/library/az4se3k1(v=VS.100).aspx
someDateTime.ToUniversalTime().ToString("u");
Will get you pretty close => '2011-09-02 10:22:48Z'. If that isn't good enough, then you can create a custom format string that includes the "T" (see 'Custom Date and Time Format Strings').

Categories