Solved

Converting Newtonsoft.Json.Linq.JToken to a DateTime

Posted on 2016-10-24
4
188 Views
Last Modified: 2016-10-24
I've got some Twitter data that looks like this:

? jsonDat[x]["created_at"].ToString()
"Mon Oct 24 07:32:25 +0000 2016"

But I'm having trouble converting it to a C# DateTime.

Here are some things I've tried and the responses.

? DateTime.Parse("Mon Oct 24 07:32:25 +0000 2016")
'DateTime.Parse("Mon Oct 24 07:32:25 +0000 2016")' threw an exception of type 'System.FormatException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233033
    HelpLink: null
    InnerException: null
    Message: "String was not recognized as a valid DateTime."
    Source: "mscorlib"
    StackTrace: "   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)\r\n   at System.DateTime.Parse(String s)"
    TargetSite: {System.DateTime Parse(System.String, System.Globalization.DateTimeFormatInfo, System.Globalization.DateTimeStyles)}

--

? System.Convert.ChangeType(jsonDat[x]["created_at"].ToString(),typeof(DateTime))
'System.Convert.ChangeType(jsonDat[x]["created_at"].ToString(),typeof(DateTime))' threw an exception of type 'System.FormatException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233033
    HelpLink: null
    InnerException: null
    Message: "String was not recognized as a valid DateTime."
    Source: "mscorlib"
    StackTrace: "   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)\r\n   at System.Convert.ToDateTime(String value, IFormatProvider provider)\r\n   at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)\r\n   at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)\r\n   at System.Convert.ChangeType(Object value, Type conversionType)"
    TargetSite: {System.DateTime Parse(System.String, System.Globalization.DateTimeFormatInfo, System.Globalization.DateTimeStyles)}

--

? jsonDat[x]["created_at"].ToObject<DateTime>();
'jsonDat[x]["created_at"].ToObject<DateTime>()' threw an exception of type 'System.FormatException'
    Data: {System.Collections.ListDictionaryInternal}
    HResult: -2146233033
    HelpLink: null
    InnerException: null
    Message: "String was not recognized as a valid DateTime."
    Source: "mscorlib"
    StackTrace: "   at System.DateTimeParse.Parse(String s, DateTimeFormatInfo dtfi, DateTimeStyles styles)\r\n   at System.Convert.ToDateTime(String value, IFormatProvider provider)\r\n   at System.String.System.IConvertible.ToDateTime(IFormatProvider provider)\r\n   at System.Convert.ToDateTime(Object value, IFormatProvider provider)\r\n   at Newtonsoft.Json.Linq.JToken.op_Explicit(JToken value)\r\n   at Newtonsoft.Json.Linq.JToken.ToObject(Type objectType)\r\n   at Newtonsoft.Json.Linq.JToken.ToObject[T]()"
    TargetSite: {System.DateTime Parse(System.String, System.Globalization.DateTimeFormatInfo, System.Globalization.DateTimeStyles)}

Open in new window


It could be because I'm in the UK and the DateTime format is different - any suggestions on how I can extract a DateTime out of this value?
0
Comment
Question by:purplesoup
  • 2
  • 2
4 Comments
 
LVL 33

Accepted Solution

by:
it_saige earned 500 total points
ID: 41857190
You want to use ParseExact or TryParseExact and specify the format which is -
ddd MMM dd hh:mm:ss zzzz yyyy

Open in new window


Custom Date and Time Format Strings - https://msdn.microsoft.com/en-us/library/8kb3ddd4(v=vs.110).aspx

Proof of concept -
using System;
using System.Globalization;
using System.Threading;

namespace EE_Q28978446
{
	class Program
	{
		const string result = "Mon Oct 24 07:32:25 +0000 2016";

		static void Main(string[] args)
		{
			DateTime converted1 = default(DateTime);
			DateTime converted2 = default(DateTime);

			Console.WriteLine("Using ParseExact:");
			try
			{
				converted1 = DateTime.ParseExact(result, "ddd MMM dd hh:mm:ss zzzz yyyy", Thread.CurrentThread.CurrentCulture);
				Console.WriteLine("Successfully converted - {0}; to {1}", result, converted1);
			}
			catch (Exception)
			{
				Console.WriteLine("Error in conversion");
			}

			Console.WriteLine();
			Console.WriteLine("Using TryParseExact:");
			if (DateTime.TryParseExact(result, "ddd MMM dd hh:mm:ss zzzz yyyy", Thread.CurrentThread.CurrentCulture, DateTimeStyles.None, out converted2))
				Console.WriteLine("Successfully converted - {0}; to {1}", result, converted2);
			else
				Console.WriteLine("Error in conversion");

			Console.ReadLine();
		}
	}
}

Open in new window

Produces the following output -Capture.JPG
-saige-
1
 

Author Closing Comment

by:purplesoup
ID: 41857328
Thanks - excellent answer, I love answers with a proof of concept!
0
 

Author Comment

by:purplesoup
ID: 41857330
I had to modify it - but you weren't to know it was 24 hour clock.

? DateTime.ParseExact("Mon Oct 24 17:02:54 +0000 2016","ddd MMM dd HH:mm:ss zzzz yyyy", Thread.CurrentThread.CurrentCulture);
{24/10/2016 18:02:54}
    Date: {24/10/2016 00:00:00}
    Day: 24
    DayOfWeek: Monday
    DayOfYear: 298
    Hour: 18
    Kind: Local
    Millisecond: 0
    Minute: 2
    Month: 10
    Second: 54
    Ticks: 636129289740000000
    TimeOfDay: {18:02:54}
    Year: 2016
0
 
LVL 33

Expert Comment

by:it_saige
ID: 41857359
The lack of an AM/PM designator should be an indicator that this was needed in 24-hr format and I apologize for missing that.  Otherwise, I am glad to have been of assistance.

-saige-
1

Featured Post

Master Your Team's Linux and Cloud Stack

Come see why top tech companies like Mailchimp and Media Temple use Linux Academy to build their employee training programs.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

We all know that functional code is the leg that any good program stands on when it comes right down to it, however, if your program lacks a good user interface your product may not have the appeal needed to keep your customers happy. This issue can…
The Confluence of Individual Knowledge and the Collective Intelligence At this writing (summer 2013) the term API (http://dictionary.reference.com/browse/API?s=t) has made its way into the popular lexicon of the English language.  A few years ago, …
This tutorial gives a high-level tour of the interface of Marketo (a marketing automation tool to help businesses track and engage prospective customers and drive them to purchase). You will see the main areas including Marketing Activities, Design …
Microsoft Active Directory, the widely used IT infrastructure, is known for its high risk of credential theft. The best way to test your Active Directory’s vulnerabilities to pass-the-ticket, pass-the-hash, privilege escalation, and malware attacks …

778 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question