2012-04-12 62 views
1

我查询和C#中的SQLite3数据库存储它的日期/时间在Unix纪元时间检索数据SQLite的查询

一些被存储为数字几秒钟,因为01/01/1970

而且由于01/01/2001

一些被存储为秒数这是所有罚款,我查询自己看着办的差异,应用正确的日期/时间转换

但是我无法想象e一种方法,我可以这样做,以合并夏令时

有没有一种方法可以区分DST?
也有一种方法可以从Unix时代获得时区吗?

我使用的查询是下面,任何帮助,这将是巨大的

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"; 

回答

0

如果存储在数据库中的时间是UTC,那么你应该处理您的时间是这样的:

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); 
     } 
    } 
} 

所有DTS更改将自动应用。如果您需要将时间转换为其他时区(非本地),则算法将保持不变,但您需要使用TimeZoneInfo类创建要将UTC时间转换到的时区。

+0

区别于DST我的意思是说明DST应该应用还是不应用的区别 – Daniel 2012-04-12 13:51:30

+0

我仍然不明白你在说什么。尽管如此,解决方案也是一样的。使用UTC时间,然后将其转换为本地,然后是必要的。 – 2012-04-12 13:58:46

+0

我正在阅读的数据库无法控制事物的存储方式。所以它存储日期,因为它已被配置。当我在我的问题中用我的SELECT语句阅读它时,它会返回正确的UTC日期和时间,接受所有有DST的时间,一个小时向前。他们显示为例如2012/03/26 01:09:32而不是2012/03/26 02:09:32 – Daniel 2012-04-12 14:25:38