2008-10-30 3 views
17

Можно создать дубликат:
How to convert UNIX timestamp to DateTime and vice versa?Как преобразовать DateTime из JSON в C#?

У меня есть следующий класс:

[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 является публичным (изменение его частных причинами исключения в процессе сериализации)

+0

почему вы заботитесь, если MyDateTimeTicks является публичным? – TheSoftwareJedi 2008-10-31 00:39:28

+2

Потому что все это часть контракта на программное обеспечение. Я не хочу раскрывать какие-либо дополнительные члены, чем мне нужно, - и это помогает, если эти члены используются в удобном для меня формате (т. Е. DateTime vs number/ticks). – 2008-10-31 08:31:48

ответ

19

Завершение того, что вы разместили, и, сделав его закрытым, как будто отлично работает для меня.

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

} 
+0

Это в Silverlight или .net/WPF? – 2008-10-31 08:32:44

4

Вот что я пришел с. В C#, похоже, вам нужно создать новую DateTime и добавить значение epoch как «секунды» к этому DateTime. Вот как это выглядит в коде:

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

При использовании Визуальная немедленного окна студии, я напечатал результат этой операции в отладочной консоли:

{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 
+2

Вы также должны указать DateTimeKind.Utc. – dalle 2008-11-02 11:05:43

1

Что вы хотите следующее:

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

где ticks - значение, переданное вам PHP.

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

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