Frage

Ich arbeite an einem "Online -Reminder -System" (ASP.NET 2.0 (C#) / SQL Server 2005).

Da dies ein Erinnerungsdienst ist, der die E -Mail an einen bestimmten Termin an Benutzer sendet. Das Problem ist jedoch, dass Benutzer nicht aus einem bestimmten Länder stammen, sondern aus der ganzen Welt und aus verschiedenen Zeitzonen. Wenn ich jetzt registriere, frage ich die Zeitzone der Benutzer auf die gleiche Weise wie Windows zum Zeitpunkt der Installation unsere Zeitzone.

Aber ich erhalte nicht die ausgewählte Wenn der Benutzer (+5.30) oder etwas TimeZone, wie man diese Zeitzone in meiner ASP.NET -Anwendung behandelt. Wie man nach Timezone arbeitet.

Und bitte schlagen Sie vor, wenn es eine bessere Möglichkeit gibt, Zeitzonen in dieser Anwendung zu bewältigen?

Vielen Dank

War es hilfreich?

Lösung

Als erstes ist sicherzustellen DateTime.ToUniversalTime() um es zu bekommen).

Wenn Sie eine Erinnerung für einen Benutzer speichern möchten, benötigen Sie die aktuelle UTC -Zeit, addieren oder entfernen Sie den Zeitzonenunterschied des Benutzers und konvertieren diese neue Zeit zurück in UTC. Das möchten Sie in der DB speichern.

Wenn Sie dann nach dem Senden nach Erinnerungen suchen möchten, müssen Sie lediglich in der Datenbank nachdenken, um die Erinnerungen jetzt gemäß UTC -Zeit zu senden. Lassen Sie im Wesentlichen alle Erinnerungen erhalten, die einen Zeitstempel haben, der zuvor vorliegt DateTime.Now.ToUniversalTime().

Aktualisieren Mit einigen Implementierungspezifikationen: Sie erhalten eine Liste von Zeitzonen aus dem TimeZoneInfo.GetSystemTimeZones() Methode; Sie können diese verwenden, um eine Liste von Zeitzonen für den Benutzer anzuzeigen. Wenn Sie die speichern Id Eigenschaft aus der ausgewählten Zeitzone, Sie können eine TimeZoneinfo -Klasse -Instanz daraus erstellen und die UTC -Zeit für einen bestimmten lokalen Datums-/Zeitwert berechnen:

TimeZoneInfo tzi = TimeZoneInfo.FindSystemTimeZoneById("<the time zone id>");
// May 7, 08:04:00
DateTime userDateTime = new DateTime(2009, 5, 7, 8, 4, 0);
DateTime utcDateTime = userDateTime.Subtract(tzi.BaseUtcOffset);

Andere Tipps

Ich würde es immer empfehlen Verwenden Sie die UTC -Zeit (GMT) auf der Serverseite (In Code-Behind, Datenbank usw.) und konvertieren Sie die Zeit von UTC in Lokale Zeit für Anzeigezwecke nur. Dies bedeutet, dass alle Zeitmanipulationen - einschließlich Speichern von Zeit in der Datenbank, Berechnungen usw. - mit UTC durchgeführt werden sollten.

Das Problem ist: Woher weiß Ihr Code-Behind die Zeitzone des Client-Browsers? Sagen Sie, der Benutzer gibt einen Datum/Uhrwert ein (z. 12/30/2009 14:30) in der Form und unterbereitet es dem Server. Unter der Annahme, dass der Benutzer lokale Zeit übermittelt hat, wie weiß der Server, wie er diesen Wert in UTC konvertiert?

Die Anwendung kann den Benutzer auffordern, die Zeitzone anzugeben (und sie in einem persistenten Cookie oder einer Datenbank zu speichern), aber sie erfordert und zusätzliche Anstrengungen vom Benutzer, und Ihre App müsste dafür die Logik und die Bildschirme implementiert werden. Es wäre schöner, wenn die App könnte Bestimmen Sie die Zeitzone des Kunden automatisch.

Ich habe dieses Problem mit Hilfe von JavaScript angesprochen GetTimeZoneOffset Funktion, die einzige API, die dem Server über den Zeitunterschied zwischen lokaler Zeit auf dem Client und der GMT mitteilen kann. Da es sich um eine clientseitige API handelt, habe ich Folgendes durchgeführt: Überprüfen Sie auf der Serverseite einen benutzerdefinierten Sitzungs-Cookie, der den Zeitversetztwert hält und wenn sie nicht verfügbar ist, laden Sie die Seite neu (nur während des GET und nicht posten, Anrufe). Mit einer JavaScript -Logik, die hinzugefügt wurde, um den Zeitversatz zu generieren und im Cookie zu speichern. Auf der clientseitigen Seite ist dies fast transparent (einmal während der Sitzung lade ich eine Seite auf GET neu). Sobald ich den Offset im Cookie habe, wende ich ihn je nach Zeitumwandlung (UTC auf lokale Zeit oder lokale Zeit für UTC) auf die Zeitverwaltungsfunktionen an.

Dies mag ein bisschen kompliziert klingen, und nachdem ich Helferfunktionen geschrieben habe, war es eine Frage der Herstellung eines Single Call In page_load (von Seiten, die Zeitkonvertierung benötigten) und Zeitkonvertierungsroutinen beim Senden und Abrufen von Zeitwerten an und vom Browser verwenden. Hier ist ein Beispiel dafür, wie es verwendet werden kann:

using My.Utilities.Web;
...

// Derive the form class from BaseForm instead of Page.
public class WebForm1: BaseForm
{
...
private void Page_Load(object sender, System.EventArgs e)
{
  // If we only want to load the page to generate the time
  // zone offset cookie, we do not need to do anything else.
  if (InitializeLocalTime())
    return;

  // Assume that txtStartDate is a TextBox control.
  if (!IsPostback)
  {
     // To display a date-time value, convert it from GMT (UTC)
     // to local time.
     DateTime startDate = GetStartDateFromDB(...);
     txtStartDate.Text  = FormatLocalDate(startDate);
     ...
  }
  else
  {
     // To save a date-time value, convert it from local
     // time to GMT (UTC).
     DateTime tempDate  = DateTime.Parse(txtStartDate.Text);
     DateTime startDate = ConvertLocalTimeToUtc(tempDate);
     SaveStartDateInDB(startDate, ...);
     ...
  }
}
...
}

Wenn Sie weitere Einzelheiten benötigen, lesen Sie die Es ist an der Zeit: Lokalisierung der Zeit in ASP.NET -Anwendungen Artikel (Entschuldigung, aber ich habe keinen direkten Link zum Artikel auf der Website des Publisher, da ASP.Netpro den Zugriff nur auf bezahlte Abonnenten einschränkt; es gibt jedoch Links zu PDF -Kopien). Ich wünschte, ich könnte das Beispiel aus dem Artikel posten, aber ich möchte nicht gegen das Urheberrecht verstoßen. Hier ist jedoch ein Projekt zum Aufbau einer Helferbibliothek das hat Alle notwendigen Funktionen und Dokumentation (Ignoriere einfach das Zeug, das du nicht brauchst).

UPDATE: Der Artikel wurde online mit einem Beispielprojekt vom neuen Verlag veröffentlicht hier.

Das Problem bei allen bisherigen Antworten ist, dass sie nicht berücksichtigen, was Prashant zu erreichen versucht. Wenn der Benutzer seines Systems am Tag vor Tageslichteinsparungen einen Versatz von +12 hat und eine Erinnerung für den nächsten Tag festlegt, beträgt sein Versatz, wenn die Erinnerung ausgelöst werden soll, stattdessen +13.

Deshalb können Sie den aktuellen Offset nur für etwas verwenden, das jetzt passiert. Obwohl ich allen anderen zustimme, die alle Times serverseitig (außer möglicherweise nur für die Anzeige verwendet werden) in UTC gespeichert werden sollten.

Möglicherweise möchten Sie die verwenden Datetimeoffset Struktur anstelle der DateTime, wenn Sie sich auf Framework 2.0 oder höher befinden.

Das DateTimeOffset stellt einen Zeitpunkt in Bezug auf die UTC -Zeit dar. Daher sollte es einfacher sein, in diesem Fall zu arbeiten.

Es gibt 2 Schritte:

  • Erkennen Sie mit JavaScript auf der Client -Seite verschiedene Zeitzone:

    var dt = new Date();
    var diffInMinutes = -dt.getTimezoneOffset();
    
  • Anschließend auf der Serverseite den C# -Code, um die Serverzeit in die Client -Zeit zu konvertieren, basierend auf erkannten TimeZone -Offset oben:

------------------------;

string queryStr = Request.QueryString["diffInMinutes"];
int diffInMinutes = 0;
if (Int32.TryParse(queryStr, out diffInMinutes))
{
    clientTime = serverTime.ToUniversalTime().AddMinutes(diffInMinutes);
}

Grundsätzlich müssen Sie nur den Offset (Stunden + Minuten) zur lokalen Zeit hinzufügen, die der Benutzer eingegeben hat. Wenn Sie den Offset hinzufügen, erhalten Sie im Grunde genommen eine DateTime in der UTC -Zeitzone (im Grunde genommen GMT).

Es ist normalerweise am einfachsten, alle Ihre Zeiten für UTC zu standardisieren, damit Ihre Anwendungslogik nicht mit den Offsets zu tun hat.

Diese Seite hat einige gute Beispiele: http://msdn.microsoft.com/en-us/library/bb546099.aspx

Das Problem ist, dass der Offset von UTC zu unterschiedlichen Jahreszeiten variieren wird - jede Zeitzone hat ihre eigenen Regeln. (Ich habe dies auf die harte Tour gelernt, wenn ich die Planung der Besprechungsraum -Planung entwickelte.)

Sieht so aus, als ob es hier integrierte Unterstützung gibt: http://msdn.microsoft.com/en-us/library/system.timezoneinfo.convertime.aspx

Ich habe es nicht selbst ausprobiert, aber es scheint die korrekte Konvertierung zu versprechen, und die Ersparnisse bei Tageslicht zu versprechen.

Wenn nicht, ist hier ein (teures) kommerzielles Tool, das ich verwendet habe: http://www.worldtimeserver.com/time_zone_guide/

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top