Datetime SQLite和日期时间准确性问题

Datetime SQLite和日期时间准确性问题,datetime,uwp,sqlite-net,sqlite-net-extensions,Datetime,Uwp,Sqlite Net,Sqlite Net Extensions,我在UWP应用程序中使用SQLite.NET和扩展来存储包含DateTime字段的对象,结果很奇怪。似乎日期的存储时间与应该的时间相差几个小时,有时会将日期时间的日期推到第二天 我正在存储一个名为Record的POCO类,它包含如下所示的情境对象 public class Situation { [PrimaryKey, AutoIncrement] public int SituationId { get; set; } public DateTime DateTim

我在UWP应用程序中使用SQLite.NET和扩展来存储包含DateTime字段的对象,结果很奇怪。似乎日期的存储时间与应该的时间相差几个小时,有时会将日期时间的日期推到第二天

我正在存储一个名为Record的POCO类,它包含如下所示的情境对象

public class Situation
{
    [PrimaryKey, AutoIncrement]
    public int SituationId { get; set; }

    public DateTime DateTime { get; set; }

    public string Description { get; set; }
}
包含该情况的Record类通过类似这样的存储库模式使用SQLite存储(我只包括了相关的方法):

这个异步连接将日期时间存储为刻度,我怀疑这可能是问题的根源

在一种情况下,在使用Repository.InsertOrUpdateAsync存储记录对象之前,sition.DateTime具有以下值:

DateTime={2016-07-01 12:59:59 PM}

滴答声=63602974799010000

但是,使用Repository.GetByIdAsync提取记录时,日期时间值如下所示:

DateTime={2016-07-01 4:59:59 PM}

滴答声=63602989199010000

如您所见,SQLite存储日期时间的方式出现了一些问题。“记号”字段已更改,导致出现新日期。我不是100%确定这是为什么。我知道DateTime在准确性方面会有问题,但是如果DateTime存储为滴答声,那么滴答声字段不应该匹配吗?为什么要换衣服

假设必须将日期时间存储为滴答声,如何解决此问题?我正在考虑将DateTime小时设置为12,这样就可以在不改变日期的情况下增加或减少几个小时,但这显然并不理想


任何帮助都将不胜感激。:)

我做了一个演示,用记号来存储
DateTime
。同样的问题也发生了。我调试了received
Situation
对象的
DateTime
属性。原来
DateTime.Kind
Utc
。因此这是一个时区问题,SQLite默认将
DateTime
转换为UTC时间。 要解决此问题,可以使用获取正确的本地时间

代码如下:

if (situation.DateTime.Kind == DateTimeKind.Utc)
{
     situation.DateTime = situation.DateTime.ToLocalTime();
}

表中的列数据类型是什么?是否尝试使用DateTimeOffset?您的问题可能是DateTime不存储时区信息这看起来完全像一个时区问题。在存储/读取日期时,尝试使用UTC日期来消除时区问题。太棒了!谢谢!:)因为在我的例子中,我不关心实际时间,我想我也可以,正如redent84所说,让所有的日期时间都有一个UTC DateTimeKind,对吗?我只关心年、月、日。时间只是一个问题,因为它有时会把一天提前1秒。我不明白。如果您关心本地时间的日、月和年,则应将UTC日期时间转换为本地时间。在某些情况下,UTC无法正确显示日、月或年。e、 g.1月1日上午6:00。2016年(中国本地)将于12月31日晚上11:00。2015年(UTC)。
public class ConnectionManager
{
    public static readonly string FileName = "db.sqlite";

    private static string path = Path.Combine(Windows.Storage.ApplicationData.Current.LocalFolder.Path, "db.sqlite");

    public static SQLiteAsyncConnection GetAsyncConnection()
    {
        var connString = new SQLiteConnectionString(path, storeDateTimeAsTicks: true);
        var connWithLock = new SQLiteConnectionWithLock(new SQLitePlatformWinRT(), connString);
        return new SQLiteAsyncConnection(() => connWithLock);
    }
}
if (situation.DateTime.Kind == DateTimeKind.Utc)
{
     situation.DateTime = situation.DateTime.ToLocalTime();
}