2008-10-30 38 views
17

Duplicar posible:
How to convert UNIX timestamp to DateTime and vice versa?Cómo convertir DateTime de JSON a C#?

Tengo la clase siguiente:

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

Aquí está la JSON:

{ "MyDateTime":"1221818565" } 

El JSON se devuelve desde un servicio web PHP.

Lo que tengo que hacer es convertir esa cadena epoch en una C# DateTime válida. ¿Cuál es la mejor manera de hacer esto?

Puedo hacer esto:

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

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

Pero el problema con esto es, los MyDateTimeTicks es pública (cambiándolo a causas privadas una excepción en el proceso de serialización)

+0

qué te importa si MyDateTimeTicks es público? – TheSoftwareJedi

+2

Porque todo es parte del contrato de software. No quiero exponer a ningún miembro adicional de lo necesario, y me ayuda si esos miembros están en un formato útil para mí (es decir, DateTime vs number/ticks). –

Respuesta

19

Acabando lo que publicaste, Y hacerlo privado parecía funcionar bien para mí.

[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

¿Eso es en Silverlight o .net/WPF? –

+0

es .net estándar wcf. debería funcionar en – TheSoftwareJedi

+1

¿Por qué su código en el setter 'Convert.ToInt32 (value)' y no simplemente 'value' - ya es un' int', ¿no? –

4

Esto es lo que he venido arriba con. En C#, parece que necesita crear un nuevo DateTime y agregar el valor de época como 'segundos' a este DateTime. Esto es lo que se ve como en código:

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

Cuando se utiliza el Estudio ventana inmediata Visual, imprimí el resultado de esta operación a la consola depurador:

{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

También debe especificar DateTimeKind.Utc. – dalle

1

Lo que queremos es la siguiente:

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

donde ticks es el valor que le ha otorgado 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

¿Es esto mejor que las otras respuestas? –

+0

Esto es lo que estaba buscando. – Telavian

+0

Gracias! ¡Trabaja para mi! – TheZodchiy