如何将DateTime从JSON转换为C#?

可能重复:
如何将UNIX时间戳转换为DateTime,反之亦然?

我有以下课程:

[DataContractAttribute] public class TestClass { [DataMemberAttribute] public DateTime MyDateTime { get; set; } } 

这是JSON:

 { "MyDateTime":"1221818565" } 

JSON正在从PHP Web服务返回。

我需要做的是将该epoch字符串转换为有效的C#DateTime。 这样做的最佳方法是什么?

我可以做这个:

 [IgnoreDataMemberAttribute] public DateTime MyDateTime { get; set; } [DataMemberAttribute(Name = "MyDateTime")] public Int32 MyDateTimeTicks { get { return this.MyDateTime.Convert(...); } set { this.Created = new DateTime(...); } } 

但问题是,MyDateTimeTicks是公共的(将其更改为private会导致序列化过程中出现exception)

完成你发布的内容,并将其设为私有似乎对我来说很好。

 [DataContract] public class TestClass { private static readonly DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); [IgnoreDataMember] public DateTime MyDateTime { get; set; } [DataMember(Name = "MyDateTime")] private int MyDateTimeTicks { get { return (int)(this.MyDateTime - unixEpoch).TotalSeconds; } set { this.MyDateTime = unixEpoch.AddSeconds(Convert.ToInt32(value)); } } } 
 private DateTime ConvertJsonStringToDateTime(string jsonTime) { if (!string.IsNullOrEmpty(jsonTime) && jsonTime.IndexOf("Date") > -1) { string milis = jsonTime.Substring(jsonTime.IndexOf("(") + 1); string sign = milis.IndexOf("+") > -1 ? "+" : "-"; string hours = milis.Substring(milis.IndexOf(sign)); milis = milis.Substring(0, milis.IndexOf(sign)); hours = hours.Substring(0, hours.IndexOf(")")); return new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc).AddMilliseconds(Convert.ToInt64(milis)).AddHours(Convert.ToInt64(hours) / 100); } return DateTime.Now; } 

这就是我想出来的。 在C#中,看起来您需要创建一个新的DateTime并将纪元值添加为此DateTime的“秒”。 这是代码中的样子:

 new System.DateTime(1970, 1, 1, 0, 0, 0, 0).AddSeconds(1221818565); 

使用Visual Studio立即窗口时,我将此操作的结果打印到调试器控制台:

 {9/19/2008 10:02:45 AM} Date: {9/19/2008 12:00:00 AM} Day: 19 DayOfWeek: Friday DayOfYear: 263 Hour: 10 Kind: Unspecified Millisecond: 0 Minute: 2 Month: 9 Second: 45 Ticks: 633574153650000000 TimeOfDay: {10:02:45} Year: 2008 

我知道你的问题是针对PHP的,但我只想注意.NET JSON的“问题”:看来.NET给你的日期是“自纪元以来的毫秒”(而不是秒)。 在这种情况下,AddSeconds行应该是: unixEpoch.AddMilliseconds(Int64.Parse(date));

更多信息: http : //blogs.msdn.com/b/marcelolr/archive/2008/03/05/system-datetime-ticks-vs-json-date.aspx

你想要的是以下内容:

 DateTime unixEpoch = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); DateTime dotnetTime = unixEpoch.AddSeconds(Convert.ToDouble(ticks)); 

ticks是PHP传递给你的值。