Comment convertir DateTime de JSON en C #? [dupliquer]
-
05-07-2019 - |
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)
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));
où ticks
est la valeur transmise par PHP.