I am trying to parse a date in c# and have the following line of code
DateTime.ParseExact(DateSelected, "ddd MMM dd HH:mm:ss zzz yyyy", Culture)
when I debug DateSelected is coming in as "Tue Feb 16 12:36:41 CST 2010" but I get an expection saying "String was not recognized as a valid DateTime."
Following this previous question, zone abbreviations are not recognized. Try this:
DateTime parsed = DateTime.ParseExact(
"Tue Feb 16 12:36:41 CST 2010".Replace("CST", "+02:00"),
"ddd MMM dd HH:mm:ss zzz yyyy",
new CultureInfo("en-GB"));
This links can also be useful:
Time zone abbreviations
TZ4Net Library
Time Zones in the .NET Framework
Related
This question already has answers here:
Parse DateTime with time zone of form PST/CEST/UTC/etc
(6 answers)
Closed 6 years ago.
var dateValue = "Mon, 02 May 2016 12:00 PM EDT";
var date = DateTime.ParseExact(
dateValue,
"ddd, dd MMM yyyy hh:mm tt K",
System.Globalization.CultureInfo.InvariantCulture);
As near as I can tell, from the official format string documentation, this should work. Instead, it raises System.FormatException with the rather unhelpful message: String was not recognized as a valid DateTime.
Is there any way to figure out what's going wrong?
The K Custom Format Specifier does not accept time zone strings.
If you can supply the hour offset instead of a string, then you can use "z".
var dateValue = "Mon, 02 May 2016 12:00 PM -4";
var date = DateTime.ParseExact(
dateValue,
"ddd, dd MMM yyyy hh:mm tt z",
System.Globalization.CultureInfo.InvariantCulture);
https://msdn.microsoft.com/en-us/library/shx7s921%28v=vs.110%29.aspx specifies that the DateTime.Kind enumeration has 3 members. So perhaps it does not like you to specify "EDT" as a kind.
Member name Description
Local The time represented is local time.
Unspecified The time represented is not specified as either local time or Coordinated Universal Time (UTC).
Utc The time represented is UTC.
This should work
var dateValue = "Mon, 02 May 2016 12:00 PM EDT".Replace("EDT", "-4");
var date = DateTime.ParseExact(
dateValue,
"ddd, dd MMM yyyy hh:mm tt z",
System.Globalization.CultureInfo.InvariantCulture);
I get this date string from an RSS:
Wed, 16 Dec 2015 17:57:15 +0100
I need to parse into a DateTime. Ive googled and searched stack overflow and gotten to the following answer (ive tried with only one, two and four 'z' instead of three)
string parseFormat = "ddd, dd MMM yyyy HH:mm:ss zzz";
DateTime date = DateTime.ParseExact(dateString, parseFormat,
DateTimeFormatInfo.CurrentInfo,
DateTimeStyles.None);
But I get this error:
System.FormatException: String was not recognized as a valid
DateTime.
Change your code to
string parseFormat = "ddd, dd MMM yyyy HH:mm:ss zzz";
DateTime date = DateTime.ParseExact(dateString, parseFormat,
CultureInfo.InvariantCulture);
Hope it helps!
As commented, your format and string matches unless if your CurrentCulture is english-based one. If it is not, it can't parse these Wed and Dec parts successfully.
On the other hand, zzz format specifier does not recommended for DateTime parsing.
From documentation;
With DateTime values, the "zzz" custom format specifier represents the
signed offset of the local operating system's time zone from UTC,
measured in hours and minutes. It does not reflect the value of an
instance's DateTime.Kind property. For this reason, the "zzz" format
specifier is not recommended for use with DateTime values.
However, I would parse it to DateTimeOffset instead of DateTime since you have an UTC Offset in your string like;
var dateString = "Wed, 16 Dec 2015 17:57:15 +0100";
string parseFormat = "ddd, dd MMM yyyy HH:mm:ss zzz";
DateTimeOffset dto = DateTimeOffset.ParseExact(dateString, parseFormat,
CultureInfo.InvariantCulture,
DateTimeStyles.None);
Now, you have a DateTimeOffset as {16.12.2015 17:57:15 +01:00} which as +01:00 Offset part.
Okay, so i am trying to read the date/time of the Twitter feed XML, it is currently in this format: Fri May 03 15:22:09 +0000 2013 However my C# is not reading it as a Date/Time type.
This is what i got:
ArticleDate = DateTime.Parse(d.Element("created_at").Value)
created_at contains the: Fri May 03 15:22:09 +0000 2013 Format
Be careful. The times you are given back are in UTC. You may end up unintentionally letting your local time zone influence the result.
For example, one of the other answers suggested this code:
DateTime dt = DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013",
"ddd MMM dd HH:mm:ss zzz yyyy",
CultureInfo.InvariantCulture);
The result of this on my computer, which is in Arizona (UTC-7), is:
5/3/2013 8:22:09 AM (dt.Kind == DateTimeKinds.Local)
While this is the correct moment in my local time, it is not what was given to me, and it probably not what you are expecting unless paying close attention to the .Kind property.
You can instead do the following:
DateTime dt = DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013",
"ddd MMM dd HH:mm:ss zzz yyyy",
CultureInfo.InvariantCulture,
DateTimeStyles.AdjustToUniversal);
This returns:
5/3/2013 3:22:09 PM (dt.Kind == DateTimeKinds.Utc)
Which better matches what you started with.
Now, this assumes that the values coming back from Twitter will always be UTC. That seems to be the case, according to their FAQ. But one could argue that since we are given an offset, it might be more correct to use that offset as provided. If the offset ever changes, we don't want our code to break. Therefore, it is more appropriate to use the DateTimeOffset class.
DateTimeOffset dto = DateTimeOffset.ParseExact("Fri May 03 15:22:09 +0000 2013",
"ddd MMM dd HH:mm:ss zzz yyyy",
CultureInfo.InvariantCulture);
The result of which is:
5/3/2013 3:22:09 PM +00:00
You should be using the ParseExact of DateTime to get your value
DateTime.ParseExact("Fri May 03 15:22:09 +0000 2013","ddd MMM dd HH:mm:ss zzz yyyy", CultureInfo.InvariantCulture);
Use DateTime.TryParseExact like:
if (DateTime.TryParseExact("Fri May 03 15:22:09 +0000 2013",
"ddd MMMM dd HH:mm:ss zzz yyyy",
CultureInfo.InvariantCulture,
DateTimeStyles.None,
out ArticleDate))
{
//date is fine
}
The actual code fix for this specific date format from Twitter APi XML is below:
using System.Globalization;
CultureInfo enUS = new CultureInfo("en-US");
DateTime dateValueOut;
string userCreated = "Fri May 03 15:22:09 +0000 2013";
bool isDateFormatted = DateTime.TryParseExact(userCreated,"ddd MMM dd HH:mm:ss zzzz yyyy",enUS,DateTimeStyles.None, out dateValueOut);
if (isDateFormatted == true)
{
DateTime formattedDateTime = dateValueOut;
}
You can use
var date = DateTime.TryParseExcact(d.Element("created_at").Value, new String[]{"pattern" });
http://msdn.microsoft.com/en-us/library/system.datetime.tryparseexact.aspx
I have a strange problem:
string format = #"ddd MMM dd hh:mm:ss \G\M\Tzzz yyyy";
__timestamp = "Fri Apr 09 17:02:00 GMT-0500 2010";
DateTime.ParseExact(__timestamp, format, new CultureInfo("en"));
returning FormatException = "String was not recognized as a valid DateTime."
but that code going without exceptions:
string format = #"ddd MMM dd hh:mm:ss \G\M\Tzzz yyyy";
__timestamp = "Sat Apr 10 01:27:00 GMT-0500 2010";
DateTime.ParseExact(__timestamp, format, new CultureInfo("en"));
From 30k of date parsing of that format, around 50% of that failed with that exception...
Anyone know why?
it should be HH not hh. You're in the 24-hr format.
ddd MMM dd HH:mm:ss \G\M\Tzzz yyyy
Valid: Sat Apr 10 01:27:00 GMT-0500 2010
Seems that DateTime is expecting AM/PM info for that "en" format provider. Try it with any hours less than 12 (inclusive), or add some AM/PM information
This is a quick one, i wanna parse a date that comes in this format "Sun May 23 22:00:00 UTC+0300 2010"
Is this a valid UTC DateTime? And how to parse it? I tried :
DateTime newStartTime = DateTime.ParseExact(hdnNewStartTime.Value, "ddd MM dd HH:mm:ss UTC+0300 yyyy", CultureInfo.CurrentCulture);
However, this didn't work, any help appreciated!
DateTime dt = DateTime.ParseExact(s,"ddd MMM dd HH:mm:ss UTCzzzz yyyy", System.Globalization.CultureInfo.InvariantCulture);
Its not a standard format, but you can still parse it.
string format = "ddd mmm dd HH:mm:ss zzzzz yyyy";
string temp = "Sun May 23 22:00:00 UTC+0300 2010";
DateTime time = DateTime.ParseExact(temp, format, CultureInfo.InvariantCulture);
This isn't in a standard .NET format, so you'll probably have to parse it by hand. The UTC+0300 bit indicates the timezone, everything else is part of the date and time.
I tried the solution presented by #johncatfish and it does what I expect. I would presume that you actually want to keep the timezone information.
[Test()]
public void TestCaseWorks ()
{
string format = "ddd MMM dd HH:mm:ss UTCzzzzz yyyy";
string temp = "Sun May 23 22:00:00 UTC+0300 2010";
DateTime time = DateTime.ParseExact(temp, format, CultureInfo.InvariantCulture);
Assert.AreEqual(DayOfWeek.Sunday, time.DayOfWeek);
Assert.AreEqual(5, time.Month);
Assert.AreEqual(23, time.Day);
Assert.AreEqual(0, time.Minute);
Assert.AreEqual(0, time.Second);
Assert.AreEqual(2010, time.Year);
// Below is the only actually useful assert -- making sure the
// timezone was parsed correctly.
// In my case, I am GMT-0700, the target time is GMT+0300 so
// 22 + (-7 - +3) = 12 is the expected answer. It is an exercise
// for the reader to make a robust test that will work in any
// timezone ;).
Assert.AreEqual(12, time.Hour);
}
Sorry for my previous answer which was quite simplistic.
Replace MM by MMM in your date format and it should be fine.
From the example given, it isn't possible to tell if the month should be in the 3 letter form (Jan, Feb, May etc.) or in the full form (January, February, May etc.).
If it should be in the short form, use:
ddd MMM dd HH:mm:ss UTCzzz yyyy
If it should be in the long form, use:
ddd MMMM dd HH:mm:ss UTCzzz yyyy
Details of the formatting specifiers available can be found at http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx