Pregunta

Algunos de 4 años atrás, he seguido este Artículo de MSDN para DateTime uso de las mejores prácticas para la construcción de una .Red cliente .Net 1.1 y servicios web ASMX (con SQL 2000 server como base).Todavía recuerdo la serialización de los problemas que he tenido con fecha y hora y las pruebas de esfuerzo que se hizo para los servidores en diferentes zonas horarias.

Mi pregunta es esta:Hay una similar documento de buenas prácticas para algunas de las nuevas tecnologías, como WCF y SQL server 2008, especialmente con la adición de nuevos tipos datetime para almacenar zona horaria consciente de info.

Este es el ambiente:

  1. SQL server 2008 en la Hora del Pacífico.
  2. Capa de Servicios Web en una zona horaria diferente.
  3. Los clientes podrían estar utilizando .Net 2.0 o .Net 3.5 en diferentes zonas horarias.Si se hace fácil, podemos forzar a todos a actualizar .Net 3.5.:)

Cualquier sugerencias y mejores prácticas para los tipos de datos a utilizar en cada capa?

¿Fue útil?

Solución

Creo que la mejor manera de hacer esto es para siempre pasar el objeto como UTC, y convertir a hora local en los clientes.Al hacerlo, hay un punto de referencia común para todos los clientes.

Para convertir a UTC, llamada ToUniversalTime en el objeto DateTime.Luego, en los clientes, llame ToLocalTime para conseguir en su zona horaria actual.

Otros consejos

Un gran problema es que la serialización de WCF no admite xs:Date.Este es un gran problema, como si todo lo que quieres es una fecha, no debe ser obligado a estar preocupado acerca de las zonas horarias.El siguiente problema de conexión, se analizan algunos de los problemas: http://connect.microsoft.com/wcf/feedback/ViewFeedback.aspx?FeedbackID=349215

Si usted desea representar un punto en el tiempo de forma inequívoca, es decir,no sólo la parte de la fecha, puede utilizar el DateTimeOffset de clase, si usted tiene .NET 3.5 en cliente y servidor.O para la interoperabilidad, siempre pasan valores de fecha/hora como UTC.

UTC/GMT sería coherente en el entorno distribuido.

Una cosa importante es que especificar el datetimeKind después de llenar su propiedad DateTime con el valor de la base de datos.

dateTimeValueUtcKind = DateTime.SpecifyKind(dateTimeValue, DateTimeKind.Utc);

Ver MSDN

Mientras su capa de servicios web y cliente de la capa de utilizar el .RED de tipo DateTime, debe serializar y deserializar correctamente como un JABÓN estándar local de fecha/hora w/ información de la zona Horaria, tales como:

2008-09-15T13:14:36.9502109-05:00

Si usted absolutamente, positivamente, que debe conocer la zona horaria de sí mismo (es decir,lo anterior podría ser Hora Estándar del este o de la Hora de verano Central), usted necesita para crear su propio tipo de datos que expone esas piezas como tales:

[Serializable]
public sealed class MyDateTime
{
    public MyDateTime()
    {
        this.Now = DateTime.Now;
        this.IsDaylightSavingTime = this.Now.IsDaylightSavingTime();
        this.TimeZone = this.IsDaylightSavingTime
            ? System.TimeZone.CurrentTimeZone.DaylightName
            : System.TimeZone.CurrentTimeZone.StandardName;
    }

    public DateTime Now
    {
        get;

        set;
    }

    public string TimeZone
    {
        get;

        set;
    }

    public bool IsDaylightSavingTime
    {
        get;

        set;
    }
}

a continuación, su respuesta sería:

<Now>2008-09-15T13:34:08.0039447-05:00</Now>
<TimeZone>Central Daylight Time</TimeZone>
<IsDaylightSavingTime>true</IsDaylightSavingTime>

He tenido buena suerte con sólo mantener el tipo de datos DateTime y siempre guardarlo como GMT.En cada capa, me gustaría ajustar la hora del meridiano de valor para el valor local de la capa.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top