SQLite查询转换Unix纪元日期/时间并在C#中使用DST

时间:2012-04-12 02:58:22

标签: c# sqlite timezone dst unix-timestamp

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

有些存储为自1970年1月1日起的秒数

有些存储为自01/01/2001以来的秒数

这很好,因为我的查询可以找出差异并应用正确的日期/时间转换

但是,我无法想办法合并夏令时

有没有办法区分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";

1 个答案:

答案 0 :(得分: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时间的时区。