2010-08-10 7 views
12

Etwas irreführender Titel, ich weiß. Eigentlich wollte ich nie selbst TimeZoneInfo Objekt speichern: vielmehr möchte ich einige kulturneutrale Identifikatoren hinterlegen, mit denen später eine Instanz von TimeZoneInfo rekonstruiert werden kann.Wie werden TimeZoneInfo-Objekte in einer Datenbank gespeichert?

Momentan speichere ich den Wert von TimeZoneInfo.Id Eigentum und es scheint in Ordnung sowohl auf Englisch und Russisch Versionen von Windows, aber ich wollte nur sicherstellen, dass ich das Richtige tun.

+0

nicht sicher, aber überprüfen Sie diese können Ihnen helfen: http://blog.sqlauthority.com/2010/07/15/sql-server-datetime-function-switchoffset-example/ –

+0

Verwandte Frage - http: // stackoverflow. com/questions/2532729/Sommerzeit-Zeit-und-Zeitzone-Best-Practices – Oded

Antwort

16

Ja, Id ist ein nicht lokalisierter Bezeichner, daher ist es angemessen, diesen zu speichern.

Sie sollten jedoch auf ein mögliches Problem achten: Identifikatoren können sich im Laufe der Zeit ändern. Ich weiß nicht, ob es ein Problem in Windows Zeitzone Identifikatoren ist, aber es tritt sicherlich in der Olson (zoneinfo) -Datenbank. Zum Beispiel habe ich mich kürzlich mit einem Problem beschäftigt, das durch den Wechsel von "Pacific/Ponape" zu "Pacific/Pohnpei" verursacht wurde.

Ich vermute, dass Microsoft eine bessere Kontrolle über die IDs hat, aber sie bleiben wahrscheinlich gleich - aber trotzdem können Länder ihre Namen ändern, in verschiedene Länder aufteilen (möglicherweise neue Zeitzonen erstellen) usw.

Ich schlage keine Fixes für dieses Problem vor - nur Hervorhebung es als ein potenzielles Problem. die ID-Speicherung ist wahrscheinlich der beste Ansatz zur Verfügung, aber der möglichen Risiken bewusst sein ...

+0

Gibt es eine Ganzzahl Übereinstimmung mit der String-ID für TimeZoneInfo? Frage mich, warum sie kein int für Id zur Verfügung gestellt haben? –

+0

@ ray247: Ich bin mir keiner Zuordnung zwischen Zeitzonen-IDs und Ganzzahlen bewusst. –

+1

@Jon - Ich weiß, das ist schlecht, aber ich lese die erste Antwort. Sah, es war von dir, und ich habe nicht einmal die Mühe gemacht, den Rest zu lesen. Gibt es einen Filter für Jon Skeet? –

10

Ich sehe kein Problem mit dem Speichern der IDs, da sie scheinbar ein konstanter Wert über die Windows-Plattform sind - dh eine bestimmte ID wird immer demselben TimeZoneInfo-Objekt zugeordnet, unabhängig von der Windows-Version Sie nutzen.

Ich bin mir nicht sicher, was Mono tut, aber ich wäre nicht überrascht, wenn dies das gleiche wäre. Sie können immer die class source code überprüfen.

0

Check diese beiden Methoden

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

diese sollten so viele Informationen wie möglich erhalten :)

+1

Sicher, aber sind diese serialisierten Darstellungen kulturunabhängig? –

-2

I verwendet einfach TimeZoneInfo.Id.GetHashCode(). Laut Tests generiert dies eindeutige Ganzzahl-IDs, die in einem DB gespeichert werden können. Sie können auch ein Dictionary mit Schlüsseln erstellen, wobei diese Hashcodes und Werte die ursprünglichen ID-Strings sind, um die umgekehrte Suche zu erleichtern.

+0

Natürlich hashed nur die ID-Zeichenfolge. Wenn sich die zugrunde liegende Zeichenfolge gemäß der oben angegebenen markierten Antwort ändert; der Hash würde sich ändern. – ProVega

Verwandte Themen