Cannot parse a date - c#

I'm trying to parse this date: 1 January 2018 with ParseExact:
var date = DateTime.ParseExact(context.MatchDate, "d MMMM yyyy", new CultureInfo("it-IT")).ToString("dd MMMM yyyy");
but I get this error:
String not recognized as valid DateTime
I know that this question was already posted, but isn't the format correct?

January is not Italian. First month name is "gennaio" in italian.
You need to use english-based culture like InvariantCulture to parse this english month name.
var date = DateTime.ParseExact("1 January 2018",
"d MMMM yyyy",
CultureInfo.InvariantCulture);
From The "MMMM" custom format specifier;
The "MMMM" custom format specifier represents the full name of the
month. The localized name of the month is retrieved from the
DateTimeFormatInfo.MonthNames property of the current or specified
culture.

Related

DateTime standard format for day, month and year

Is there any standard DateTime format for showing "[day] [month] [year]"?
I do not wish to use custom format strings, because it takes away the ability to have order of "day" and "month" depending on the country.
For example, for "en-us" it's "November 22", in France day is first, so it's "22 Novembre"
Just to display day and month like this, I know I can use "M" standard format string.
But how I can write "November 22, 2018" ?
Do I need to concatenate two strings like this:
$"{dt.ToString("M")}, {dt.ToString("yyyy")}"
Is there another way?
It does seem a little odd that the full option isn't available. The closest I can suggest is to use custom formatting, but rather than supply your own, grab DateTimeFormatInfo.LongDatePattern and strip out any occurrence of "dddd" (and its surrounding space/punctuation).
That should give you the variation you want across cultures while removing the weekday.
Examples:
en-US => dddd, MMMM dd, yyyy => MMMM dd, yyyy => November 22, 2018
fr-FR => dddd d MMMM yyyy => d MMMM yyyy => 22 novembre 2018
As I can understand the solution for your problem could be to create a new CultureInfo object.
I've tested it.
CultureInfo us = new CultureInfo("en-US");
string usDate = us.DateTimeFormat.ShortDatePattern;
CultureInfo fr = new CultureInfo("fr-FR");
string frDate = fr.DateTimeFormat.ShortDatePattern;
Console.WriteLine(usDate);
Console.WriteLine(frDate);
//Apply the country format here.
var localDate = DateTime.Now.ToString(frDate);
Console.WriteLine(localDate);
So the format output will be as the location format you provide.
M/d/yyyy ---> USA format.
dd/MM/yyyy ---> France format.
22/11/2018 ---> France format applied to the current date.
For more information redirect to:
CultureInfo Class
$"{dt.ToString("MMMM dd, yyyy")}"
This will show it as November 22, 2018 assuming that dt is assigned this date.
Also, check out Custom Date Time Format String.
You can obtain the LongDatePattern from the current culture, then remove the day-of-week (dddd) and surrounding characters with a regular expression. Below, I am assuming that commas, periods, and spaces are the only separators, but if you encounter others you may want to modify the regex accordingly.
string longDatePattern = CultureInfo.CurrentCulture.DateTimeFormat.LongDatePattern;
string modifiedDatePattern = Regex.Replace(longDatePattern, #"[,.]?\s?d{4}[,.]?\s?", "");
Console.WriteLine(longDatePattern); // "dddd, MMMM d, yyyy"
Console.WriteLine(modifiedDatePattern); // "MMMM d, yyyy"
Now you have a custom format you can apply:
string s = DateTime.Now.ToString(modifiedDatePattern);
Console.WriteLine(s); // "November 22, 2018"

convert date time to format ddd MM/dd/yyyy HH:mm:ss

In the below code snippet I'am passing string value "item.Date" to string "Date"
I wanted to convert it to this format ddd MM/dd/yyyy HH:mm:ss.
converting to string and as well the above format was not going well i guess.
I tried using:
DateTime dateformatted = DateTime.ParseExact(item.Date, "ddd dd MMM yyyy h:mm tt", null);
it showed error. Can anyone help
foreach (var item in data)
{
model.Add(new MailDetailDTO
{
Attributes = item.Attribute1,
Date = item.Date,
From = item.SentFrom,
FromOrg = item.OrganizationName,
IsConfidential = item.IsConfidential,
MailID = item.MailHeaderID,
}
}
This is what the ParseExact API documentation on MSDN has to say :
The format of the string representation must match the specified
format exactly.
This means that there is a certain mismatch in the format you have stored the date time value in item.Date string property and the custom date time format ddd dd MMM yyyy h:mm tt which you're passing as argument to ParseExact API.
Have a look at the below code snippet:
private static void DateTimeForatError()
{
var item = "Sun 22-May-2016 3:52 AM";
DateTime dateformatted = DateTime.ParseExact(item, "ddd dd MMM yyyy h:mm tt", null); //results in exception
}
Date time string value present in item variable looks parseable but the next line results in String was not recognized as a valid DateTime. error. That is because I'm using - hyphen as the delimiter for day, month and year while the custom format string dd MMM yyyy uses space . As long as there is even a single difference in the way I have stored date time string value in item variable which is not complying with the custom format string ddd dd MMM yyyy h:mm tt it will burst. The moment I make the value of item to Sun 22 May 2016 3:52 AM it succeeds. You just change the value of item.Date in the object of MailDetailDTO object to match it with the custom date time string format to get rid of the error OR change the custom date time format string that you are passing to the PraseExact API to match it with the format of date time value coming in item.Date from your back-end data.

Display date time with hours and minutes

I am trying to display date time as follows Wednesday, 05 May 2014 21:25
I tried the following but when using ToLongDateString I am not getting time, this is my code
DateTime date = DateTime.Now;
string formattedDate = date.ToLongDateString();
string fDate = date.ToString("MMMM dd, yyyy,H:mm");
Response.Write(formattedDate);
Date string does not include time. That's why it called date string. Here is your desired format:
DateTime date = DateTime.Now;
string formattedDate = date.ToString("dddd, dd MMMM yyyy HH:mm");
// Wednesday, 07 May 2014 12:05
ToLongDateString does not contain the time, as the time is not part of the date.
See HERE for some details:
Current culture: "en-US"
Long date pattern: "dddd, MMMM dd, yyyy" Long date string:
"Wednesday, May 16, 2001"
Long time pattern: "h:mm:ss tt" Long time string: "3:02:15 AM"
Short date pattern: "M/d/yyyy" Short date string: "5/16/2001"
Short time pattern: "h:mm tt" Short time string: "3:02 AM"
Also HERE and HERE on all the possiblities with ToString for DateTime.
You possibly want to use ToString("F"):
The "F" standard format specifier represents a custom date and time
format string that is defined by the current
DateTimeFormatInfo.FullDateTimePattern property. For example, the
custom format string for the invariant culture is "dddd, dd MMMM yyyy
HH:mm:ss".
You need to use the string dddd, dd MMM yyyy HH:mm.
string fDate = DateTime.Now.ToString("ddddd, dd MMMM yyyy HH:mm");
Response.Write(fDate );
Also, your code is outputting formattedDate not the fDate value.
try this way
DateTime time = DateTime.Now; // Use current time
string format = "dddd, d MMM yyyy HH:mm"; // Use this format
Console.WriteLine(time.ToString(format)); // Write to console
for more details visit below page
http://www.dotnetperls.com/datetime-format
Your can try this
DateTime date = DateTime.Now;
string formattedDate = date.ToLongDateString();
string fDate = date.ToString("dddd MMMM dd, yyyy hh:mm");
Response.Write(fDate);
This format should work:
DateTime date = DateTime.Now;
string formattedDate = date.ToString("f");
// January 13, 2023 5:00 PM
Personally, I like the format that just doing ToString() gives me e.g
HelperLib.LogMsg("Job Ran at + " + DateTime.Now.ToString();
// Job Ran at 21/01/2023 21:12:59
You can change the format with hh:mm if you don't want seconds as people have shown you above, however this format is exactly what I want and need. If I wanted the day name or month name I would use the formatting people have shown you above but for mew this gives me the Date and time and any variable that is a date format it works on e.g
DateTime raceDateTime = Convert.ToDateTime(RecordsetRow["RaceDateTime"]);
Console.WriteLine("racedatetime = " + raceDateTime.ToString();
and the same output...
The following should work:
string formattedDate = date.ToLongDateString();
formattedDate += date.ToString(" h:mm");

DateTime TryParseExact a string containing a 3 letter month

I am writing an extension method to parse a specific string which contains a date and a time into a DateTime object using the DateTime.TryParseExact() Method.
An example of the format is as follows:
"29 November 2013 20:04"
The code I am using to parse it to a DateTime is:
public static DateTime MyToDateTime(this string value)
{
DateTime converted;
DateTime.TryParseExact(value, "dd MMM yyyy hh:mm", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out converted);
return converted;
}
The result is always DateTime.Min (i.e 0001-01-01 00:00:00.000)
I cant figure out what is wrong with my format string. Any help would be appreciated.
from your comments:
if you want to parse 3 Letter Month use MMM.
if you want to parse 24-Hour format you should use HH instead of hh.
Try This:
DateTime.TryParseExact(value, "dd MMM yyyy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out converted);
There are two problems I see:
November is not a 3-letter month—that would be Nov. To parse a full date name, use MMMM.
To parse a 24-hour time use HH.
This should work:
DateTime.TryParseExact(value, "dd MMMM yyyy HH:mm", CultureInfo.InvariantCulture, DateTimeStyles.AllowWhiteSpaces, out converted);
Further Reading
Custom Date and Time Format Strings
Try adding an extra M and a capital H
DateTime.TryParseExact(value, "dd MMMM yyyy H:mm", .....
See here for more info: How can I visualize the way various DateTime formats will display?
MMM stands for the abbreviated name of the month, so it's not what you're looking fore. Use MMMM instead.
Find all custom Date and Time format string on MSDN: Custom Date and Time Format Strings.
You should also check the value returned by TryParseExact method. It returns false when parse failed and true when it was performed without any problems.
And hh should be HH to parse hour part of your input.

Error : String was not recognized as a valid DateTime while converting to date format in c#

Here is the date time format i'm trying to format.I'm getting this date format from twitter apis
string date = "Thu Jul 18 17:39:53 +0000 2013"
i tried
Convert.ToDateTime(date).ToString("dd/MM/yyyy")
But it says String was not recognized as a valid DateTime.
This works:
DateTime.ParseExact(dtStr, "ddd MMM dd HH:mm:ss zzzz yyyy", CultureInfo.InvariantCulture)
ParseExact and TryParseExact allows to use a custom format string. ddd is the abbreviated day name, MMM the abbreviated month name, dd the day number, HH hours in 24h clock format, mm minutes, ss seconds, zzzz the time-zone and yyyy the years.
I have used CultureInfo.InvariantCulture to specify that the current culture is not used but InvariantCulture which is similar to "en-US".
Demo
works but after getting date from your line of code i tried to do
date.ToString("dd/mm/yyyy") but get the string as 12-12-2013, no
slashes
/ is a replacement character for your current culture's date-separator which is obviously -. So also use CultureInfo.InvariantCulture to specify that the separator should be used without using your current culture:
string result = dateTime.ToString("dd/mm/yyyy", CultureInfo.InvariantCulture);
See: The "/" Custom Format Specifier
Try this
DateTime.ParseExact(YourDate, "ddd MMM dd HH:mm:ss KKKK yyyy", CultureInfo.InvariantCulture)
Its better to use Invariant culture than Current culture
You are trying to convert a non-standard format, so use this:
string dateStr = "Thu Jul 18 17:39:53 +0000 2013";
DateTime date = DateTime.ParseExact(dateStr, "ddd MMM dd h:mm:ss KKKK yyyy", System.Globalization.CultureInfo.InvariantCulture);
Or build the correct format for your input.
How about like;
string date = "Thu Jul 18 17:39:53 +0000 2013";
DateTime dt = DateTime.ParseExact(date, "ddd MMM dd HH:mm:ss KKKK yyyy", CultureInfo.InvariantCulture);
Console.WriteLine(dt);
Output will be;
18.07.2013 20:39:53
K for time zone information in here.
Check out for more information;
Custom Date and Time Format Strings
Your date string needs to be this:
Thu Jul 18 2013 17:39:53 +0000
Whatever is producing your string needs to have the year value after the month and day and before the time, like above.
string date = "Thu Jul 18 2013 17:39:53 +0000";
var theDate = Convert.ToDateTime(date);
Note: This will produce a valid .NET DateTime object.
UPDATE:
If you cannot change the string produced, then use the ParseExact method with a custom format, like this:
string date = "Thu Jul 18 17:39:53 +0000 2013";
var theDate = DateTime.ParseExact(date, "ddd MMM dd H:mm:ss zzz yyyy", CultureInfo.InvariantCulture);
Try using DateTime.ParseExact.
string date = "Thu Jul 18 17:39:53 +0000 2013"
DateTime date = DateTime.ParseExact(date, "dd/MM/yyyy", null);
this.Text="22/11/2009";
DateTime date = DateTime.ParseExact(this.Text, "dd/MM/yyyy", null);

Categories

Resources