2008-10-30 7 views
17

Powiel możliwe:
How to convert UNIX timestamp to DateTime and vice versa?Jak przekonwertować DateTime z JSON na C#?

Mam następujące klasy:

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

Oto JSON:

{ "MyDateTime":"1221818565" } 

JSON jest zwracany z serwisu PHP.

Co muszę zrobić, to przekonwertować ciąg epoki do prawidłowego C# DateTime. Jaki jest najlepszy sposób na zrobienie tego?

mogę to zrobić:

[IgnoreDataMemberAttribute] 
public DateTime MyDateTime { get; set; } 

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

Ale problem polega na tym, że MyDateTimeTicks jest publiczna (zmieniając go do prywatnych przyczyn wyjątek w procesie serializacji)

+0

dlaczego cię to obchodzi, jeśli MyDateTimeTicks jest publiczna? – TheSoftwareJedi

+2

Ponieważ to wszystko jest częścią umowy o oprogramowanie. Nie chcę ujawniać żadnych dodatkowych członków, niż muszę - i to pomaga, jeśli ci członkowie są w przydatnym formacie do użycia (to jest DateTime vs liczba/ticks). –

Odpowiedz

19

Kończenie tego, co napisałeś, I uczynienie go prywatnym wydawało się działać dobrze dla mnie.

[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

Czy to w Silverlight lub .net/WPF? –

+0

to standardowy .net wcf. powinien działać albo – TheSoftwareJedi

+1

Dlaczego twój kod znajduje się w ustawieniu 'Convert.ToInt32 (value)' a nie tylko 'value' - to już' int', prawda? –

4

Oto co Doszedłem z. W języku C# wygląda na to, że musisz utworzyć nowy DateTime i dodać wartość epoki jako "sekundy" do tego DateTime. Oto jak to wygląda w kodzie:

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

Przy użyciu programu Visual Studio natychmiastowe okno, ja wydrukowany wynik tej operacji do konsoli debuggera:

{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

Powinieneś również określić DateTimeKind.Utc. – dalle

1

Co chcesz jest następujący:

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

gdzie ticks jest wartością przekazywaną do Ciebie przez PHP.

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

Czy to lepsze niż inne odpowiedzi? –

+0

Tego właśnie szukałem. – Telavian

+0

Dzięki! Pracuj dla mnie! – TheZodchiy