2010-08-10 19 views
12

título un tanto engañoso, lo sé. En realidad, nunca quise almacenar el objeto TimeZoneInfo; más bien, quiero almacenar algún identificador de cultura neutral, que luego se puede usar para reconstruir una instancia de TimeZoneInfo.Cómo almacenar objetos TimeZoneInfo en una base de datos?

Actualmente, estoy almacenando el valor de la propiedad TimeZoneInfo.Id y parece estar bien tanto en las versiones en inglés como en las versiones rusas de Windows, pero solo quería asegurarme de hacer lo correcto.

+0

no estoy seguro pero compruebe que esto puede ayudarlo: http://blog.sqlauthority.com/2010/07/15/sql-server-datetime-function-switchoffset-example/ –

+0

Pregunta relacionada - http: // stackoverflow. com/questions/2532729/daylight-saving-time-and-timezone-best-practices – Oded

Respuesta

16

Sí, Id es un identificador no localizado, por lo que es una cosa apropiada para almacenar.

Sin embargo, debe tener en cuenta un posible problema: los identificadores pueden cambiar con el tiempo. No sé si es un problema en Windows identificadores de zona horaria, pero ciertamente ocurre en la base de datos Olson (zoneinfo). Por ejemplo, recientemente estuve viendo un problema causado por "Pacific/Ponape" cambiando a "Pacific/Pohnpei".

Sospecho que como Microsoft tiene un control más estricto sobre los ID, es más probable que sigan siendo los mismos, pero aun así, los países pueden cambiar sus nombres, dividirse en diferentes países (creando potencialmente nuevas zonas horarias) etc.

No estoy sugiriendo ningún arreglos para este problema, simplemente lo destaca como un problema potencial. Almacenar el ID es probablemente el mejor método disponible, pero ser conscientes de los riesgos potenciales ...

+0

¿Hay una correspondencia entera con la cadena Id para TimeZoneInfo? ¿Te preguntas por qué no proporcionaron un int para Id? –

+0

@ ray247: No conozco ninguna correspondencia entre los ID de la zona horaria y los enteros. –

+1

@Jon - Sé que esto es malo, pero leí la primera respuesta. Vi que era de ti y ni siquiera me molesté en leer el resto. ¿Hay un filtro para la respuesta de Jon Skeet? –

10

No veo un problema con el almacenamiento de los ID, ya que parecen ser un valor constante en la plataforma de Windows, es decir, un ID específico siempre se asignará al mismo objeto TimeZoneInfo, independientemente de la versión de Windows tu usas.

No estoy seguro de qué es lo que mono hace, pero no me sorprendería si esto fuera lo mismo. Siempre puede verificar el class source code.

0

verificación de estos dos métodos

public static System.TimeZoneInfo FromSerializedString(string source) 
public string ToSerializedString() 

estos deben preservar tanta información como sea posible :)

+1

Claro, pero ¿estas representaciones serializadas son independientes de la cultura? –

-2

I simplemente usó TimeZoneInfo.Id.GetHashCode(). Según las pruebas, esto genera identificadores enteros únicos que se pueden almacenar en un DB. También puede construir un diccionario con claves, siendo estos códigos y valores de hash las cadenas de identificación originales para facilitar la búsqueda inversa.

+0

Por supuesto, esto simplemente hashes la cadena Id. Si la cadena subyacente cambia según la respuesta marcada arriba; el hash cambiaría. – ProVega

Cuestiones relacionadas