Frage

  

Mögliche Duplizieren:
   Wie UNIX Zeitstempel Datetime und umgekehrt konvertieren?

Ich habe die folgende Klasse bekam:

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

Hier ist die JSON:

{ "MyDateTime":"1221818565" }

Die JSON wird aus einem PHP-Webservice zurückgegeben.

Was ich tun muss, ist, dass die Epoche String in eine gültige C # Datetime konvertieren. Was ist der beste Weg, dies zu tun?

Ich kann dies tun:

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

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

Aber das Problem mit dieser ist, wird die MyDateTimeTicks Öffentlichkeit (es um private Gründe eine Ausnahme in der Serialisierung zu ändern)

War es hilfreich?

Lösung

Finishing, was Sie auf dem Laufenden, und macht es privat für mich zu funktionieren schien.

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

}

Andere Tipps

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

Hier ist, was ich habe kommen mit. In C #, es sieht aus wie Sie ein neues Datetime erstellen müssen und die Epoche Wert als ‚Sekunden‘ zu diesem Datetime hinzuzufügen. Hier ist, wie es in Code aussieht:

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

Wenn Sie die Visual Studio sofortige Fenster verwendet wird, ich das Ergebnis dieser Operation an die Debugger Konsole ausgegeben:

{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

Ich kenne deine Frage für PHP war, aber ich wollte nur ein „Gotcha“ für .NET JSON beachten: es scheint, dass .NET Ihnen das Datum in „Millisekunden seit Epoche“ gibt (im Gegensatz zu Sekunden entgegengesetzt). In diesem Fall sollte die AddSeconds Linie sein: unixEpoch.AddMilliseconds(Int64.Parse(date));

Weitere Informationen: http://blogs.msdn.com/b/marcelolr/archive/2008/03/05/system-datetime-ticks-vs-json-date.aspx

Was Sie wollen, ist die folgende:

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

Dabei gilt ticks der Wert für Sie von PHP.

vergangen ist
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top