SQLite.Net-PCL如何处理UTC时间

时间:2016-08-27 03:07:26

标签: sqlite winrt-xaml uwp

我正在使用以下代码:

使用新的SQLite.Net.SQLiteConnection(新的SQLitePlatformWinRT(),DBPath)来获取SQLiteConnection 并创建表。

类包含DateTime DataType

class Transaction 
    {
        [SQLite.Net.Attributes.PrimaryKey, SQLite.Net.Attributes.AutoIncrement]
        public int QId { get; set; }
        public DateTime PurchaseDate { get; set; }  
        public int Amount {get;set;}
        Public string ItemCode {get;set;}      
    }

插入数据如下:

var db = new SQLite.Net.SQLiteConnection(new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath);

 var newItem = new Transaction()
  {  
     PurchaseDate = DateTime.Now,            
     Amount = 100,
     ItemCode = "Abc-C10"               
  };

 db.Insert(newItem);

日期将存储为Ticks(例如636071680313888433),这是UTC时间。

1)使用上面的DateTime.Now,如果我的电脑时间设置为

1a)在英国时代,

以上代码:purchase = DateTime.Now是否正确转换?

1b)在美国时间,

以上代码:purchase = DateTime.Now是否正确转换?

如何在SQL语句中处理这个勾号?

如何从日期范围中选择所有交易?比如,2016-07-10到2016-07-20?

由于

2 个答案:

答案 0 :(得分:1)

使用日期最安全的方法是使用DateTimeOffset类型而不是DateTime

DateTime不包含有关创建它的时区的信息,它只知道它是UTC还是本地时间,如果数据将在不同的地方使用,这还不够位置。

DateTimeOffset不仅包含时间和日期信息,还包含时区,这意味着结果将永远是您所期望的。

使用方式没有区别,只需更改类型:

class Transaction 
{
    [SQLite.Net.Attributes.PrimaryKey, SQLite.Net.Attributes.AutoIncrement]
    public int QId { get; set; }
    public DateTimeOffset PurchaseDate { get; set; }  
    public int Amount {get;set;}
    Public string ItemCode {get;set;}      
}

对于数据库访问:

var db = new SQLite.Net.SQLiteConnection(
   new SQLite.Net.Platform.WinRT.SQLitePlatformWinRT(), DBPath);

var newItem = new Transaction()
  {  
     PurchaseDate = DateTimeOffset.Now, //or use DateTimeOffset.UtcNow for UTC datetime           
     Amount = 100,
     ItemCode = "Abc-C10"               
  };

 db.Insert(newItem);

答案 1 :(得分:0)

  

1a)在英国时间,以上代码:purchase = DateTime.Now是否正确转换?

     

1b)在美国时间,   上面的代码:purchase = DateTime.Now是否正确转换?

如果你的意思是转换为正确的时间值,通过“正确转换”,答案是肯定的。它将使用刻度转换为UTC时间。

  

如何在SQL语句中处理此tick?

     

如何从日期范围中选择所有交易?比如,2016-07-10到2016-07-20?

从刻度到其他时间单位的转换如下:

  • 每日蜱虫:864,000,000,000
  • 每小时蜱:36,000,000,000
  • 每分钟刻度:600,000,000
  • 每秒蜱虫:10,000,000
  • 每毫秒蜱:10,000

因此您可以使用如下所示的SQL语句来获取2016-07-10至2016-07-20的数据:

SELECT min(PurchaseDate) as 'Date',sum(Qty) as 'Size' from Purchase 
group by (PurchaseDate/(864000000000*10)) //864000000000*10 = 1day*10
order by PurchaseDate

更新:如果要选择2016-07-10和2016-07-20之间的日期,可以使用以下SQL语句:

select strftime('%Y-%m-%d %H:%M:%S',purchaseDate/10000000 - 62135596800,'unixepoch') as 'date' from purchase where date between '2016-07-10' and '2016-07-20'