【问题标题】:How to convert DateTime from JSON to C#? [duplicate]如何将 DateTime 从 JSON 转换为 C#? [复制]
【发布时间】:2010-09-19 23:13:05
【问题描述】:

可能重复:
How to convert UNIX timestamp to DateTime and vice versa?

我有以下课程:

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

这是 JSON:

{ "MyDateTime":"1221818565" }

JSON 正在从 PHP 网络服务返回。

我需要做的是将该纪元字符串转换为有效的 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 是公共的(将其更改为私有会导致序列化过程中出现异常)

【问题讨论】:

  • 为什么要关心 MyDateTimeTicks 是否公开?
  • 因为它是软件合同的一部分。我不想公开任何额外的成员 - 如果这些成员的格式对我有用(即 DateTime vs number / ticks),它会有所帮助。

标签: c# json serialization silverlight-2.0


【解决方案1】:

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

[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)); }
    }

}

【讨论】:

  • 是在 Silverlight 还是 .net / WPF 中?
  • 这是标准的 .net wcf。应该在任何一个中工作
  • 为什么你的代码在 setter Convert.ToInt32(value) 而不仅仅是 value -- 它已经是 int 了,对吧?
【解决方案2】:
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;
        }

【讨论】:

  • 这比其他答案好吗?
  • 这就是我要找的。​​span>
  • 谢谢!为我工作!
  • 不,不工作,如果没有时区的日期时间字符串 = System.ArgumentOutOfRangeException。
【解决方案3】:

这是我想出的。在 C# 中,您似乎需要创建一个新的 DateTime 并将 epoch 值作为“秒”添加到此 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

【讨论】:

  • 您还应该指定 DateTimeKind.Utc。
【解决方案4】:

我知道您的问题是针对 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

【讨论】:

    【解决方案5】:

    你想要的是以下内容:

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

    ticks 是 PHP 传递给您的值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-06-24
      • 2010-11-04
      • 2014-03-30
      • 1970-01-01
      • 2020-11-12
      • 2013-11-18
      • 2021-09-08
      相关资源
      最近更新 更多