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

How to convert DateTime from JSON to C#?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
How to convert UNIX timestamp to DateTime and vice versa?

我有以下课程:

1
2
3
4
5
6
[DataContractAttribute]
public class TestClass
{
  [DataMemberAttribute]
  public DateTime MyDateTime { get; set; }
}

这是JSON:

1
{"MyDateTime":"1221818565" }

正在从php webservice返回json。

我需要做的是将该epoch字符串转换为有效的c datetime。最好的方法是什么?

我可以这样做:

1
2
3
4
5
6
7
8
9
[IgnoreDataMemberAttribute]
public DateTime MyDateTime { get; set; }

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

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


完成你发布的内容,让它成为私人的,对我来说似乎很好。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[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)); }
    }

}


1
2
3
4
5
6
7
8
9
10
11
12
13
14
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;
        }


我知道你的问题是针对PHP的,但我只想注意一个针对.NET JSON的"gotcha":似乎.NET给出的日期是"从epoch开始的毫秒数"(而不是秒)。在这种情况下,addseconds行应该是:江户十一〔一〕号

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


这就是我想出来的。在C中,您似乎需要创建一个新的日期时间,并将epoch值作为"秒"添加到此日期时间。下面是代码中的内容:

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
{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


您需要的是:

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

其中,ticks是通过php传递给您的值。