2012-04-12 14 views
1

Ich bin Abfragen und Daten aus einer SQLite3 Datenbank in C# abrufen, die das Datum speichert/Zeiten in Unix Epoche ZeitSQLite-Abfrage, die Unix-Epoche Datum/Uhrzeit konvertiert und arbeitet mit DST in C#

Einige sind als die Nummer gespeichert Sekunden seit dem 01.01.1970

und einige werden als die Anzahl der Sekunden seit dem 01.01.2001

das ist alles in Ordnung gespeichert als Meine Abfrage den Unterschied herausfinden kann und wendet die korrekte Datum/Zeitumstellung

Allerdings vermag ich nicht figur e eine Art und Weise kann ich dies tun Daylight Saving Time

Gibt es eine Weise, die ich zwischen DST unterscheiden kann zu integrieren?
Auch ist es eine Möglichkeit, die Zeitzone aus der Unix-Epoche Zeit zu bekommen?

Die Abfrage ich benutze ist unten, jede Hilfe bei diesem würde

string query = "SELECT case when date<978307200 then datetime(date + 978307200,'unixepoch') else datetime(date,'unixepoch') end 
AS [DATE/TIME] 
FROM message 
ORDER BY ROWID"; 

Antwort

0

Wenn es die Zeit in der Datenbank gespeichert groß sein UTC ist, dann sollten Sie Sie Zeit so etwas wie dies verarbeiten:

namespace TimeProcessing 
{ 
    using System; 
    using System.Diagnostics; 
    using System.Globalization; 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      double timeStamp = 1000000000; // here you read real UNIX timespamp 

      // get UTC time 
      DateTime utc = ConvertFromUnixTimestamp(timeStamp); 
      Console.WriteLine("UTC time is: {0}", utc.ToString("o", CultureInfo.CurrentCulture)); 


      // get local time 
      DateTime local = TimeZone.CurrentTimeZone.ToLocalTime(utc); 
      Console.WriteLine("Local time is: {0}", local.ToString("o", CultureInfo.CurrentCulture)); 

      if(Debugger.IsAttached) 
      { 
       Console.WriteLine("Press any key to exit.."); 
       Console.ReadKey(); 
      } 
     } 

     // here you implement your timestamp processing algorithm 
     public static DateTime ConvertFromUnixTimestamp(double timestamp) 
     { 
      DateTime origin = new DateTime(1970, 1, 1, 0, 0, 0, 0, DateTimeKind.Utc); 
      return origin.AddSeconds(timestamp); 
     } 
    } 
} 

alle DTS Änderungen werden automatisch angewendet werden. Wenn Sie Zeit zu anderen Zeitzone (nicht lokal) konvertieren müssen, wird der Algorithmus die gleiche sein, aber Sie müssen TimeZoneInfo Klasse verwenden Zeitzone zu erstellen, auf die Sie UTC-Zeit konvertieren möchten.

+0

durch differenzieren zwischen DST Ich meine die Abfrage, die den Unterschied zwischen wann DST sollte oder nicht angewendet werden sollte – Daniel

+0

Noch verstehe ich nicht, dass Sie versuchen zu sagen. Nichtsdestotrotz ist die Lösung die gleiche. Verwenden Sie UTC-Zeit und konvertieren Sie sie dann in local, dann erforderlich. –

+0

Die Datenbank, von der ich lese, habe keine Kontrolle darüber, wie die Dinge gespeichert werden. Es speichert also die Daten so, wie sie konfiguriert wurden. Wenn ich sie mit meiner SELECT-Anweisung in meiner Frage lese, gibt sie die korrekten UTC-Daten und -Zeiten für alle Zeiten zurück, für die DST bereits eine Stunde vorgelaufen war. Sie zeigen zum Beispiel wie 2012/03/26 01:09:32 anstelle von 2012/03/26 02:09:32 – Daniel