Question

  

Double possible:
   Comment convertir un horodatage UNIX en DateTime et vice-versa?

J'ai la classe suivante:

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

Voici le JSON:

{ "MyDateTime":"1221818565" }

Le JSON est renvoyé par un service Web PHP.

Ce que je dois faire, c'est convertir cette chaîne d'époque en un DateTime C # valide. Quelle est la meilleure façon de faire cela?

Je peux faire ceci:

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

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

Mais le problème, c’est que MyDateTimeTicks est public (le changer en privé provoque une exception dans le processus de sérialisation)

Était-ce utile?

La solution

Terminer ce que vous avez posté ET le rendre privé semble bien me convenir.

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

}

Autres conseils

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

Voici ce que j'ai inventé. En C #, il semble que vous deviez créer un nouveau DateTime et ajouter la valeur d'époque en tant que "secondes" à ce DateTime. Voici à quoi cela ressemble dans le code:

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

Lors de l'utilisation de la fenêtre immédiate de Visual Studio, j'ai imprimé le résultat de cette opération sur la console du débogueur:

{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

Je sais que votre question concernait PHP, mais je voulais simplement noter un "gotcha". pour .NET JSON: il semble que .NET vous indique la date en "millisecondes depuis l'époque". (par opposition aux secondes). Dans ce cas, la ligne AddSeconds devrait être: unixEpoch.AddMilliseconds (Int64.Parse (date));

Plus d'infos: http://blogs.msdn.com/b/marcelolr/archive/2008/03/05/system-datetime-ticks-vs-json-date.aspx

Ce que vous voulez, c'est ce qui suit:

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

ticks est la valeur transmise par PHP.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top