2

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

我正在存储一个名为 Record 的 POCO 类,其中包含看起来像这样的 Situation 对象

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

    public DateTime DateTime { get; set; }

    public string Description { get; set; }
}

包含情况的 Record 类是使用 SQLite 通过存储库模式存储的(我只包含了相关方法):

 internal class Repository<T> : IRepository<T> where T : class
{
    private SQLiteAsyncConnection asyncConn;

    public Repository(SQLiteAsyncConnection conn)
    {
        asyncConn = conn;
    }

    public async Task<T> GetByIdAsync(int id)
    {
        var entity = await asyncConn.GetWithChildrenAsync<T>(id);
        return entity;
    }

    public async Task InsertOrUpdateAsync(T entity)
    {
        await asyncConn.InsertOrReplaceWithChildrenAsync(entity);
    }
}

最后,我使用 ConnectionManager 类获得了存储库的 AsyncConnection:

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

此 AsyncConnection 将 DateTimes 存储为刻度,我怀疑这可能是问题的根源。

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

日期时间 = {2016-07-01 12:59:59 PM}

滴答声 = 636029747990010000

但是,使用 Repository.GetByIdAsync 拉记录时,DateTime 值如下:

日期时间 = {2016-07-01 4:59:59 PM}

滴答声 = 636029891990010000

如您所见,SQLite 存储 DateTime 的方式出现了问题。Ticks 字段已更改,导致出现新日期。我不是 100% 确定这是为什么。我知道 DateTime 可能存在准确性问题,但如果 DateTimes 存储为 Ticks,那么 Ticks 字段不应该匹配吗?为什么他们会改变?

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

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

4

1 回答 1

1

我做了一个演示并使用 Ticks 来存储DateTime. 出现同样的问题。我调试了接收对象的DateTime属性。Situation原来DateTime.KindUtc。所以这是一个时区问题,SQLiteDateTime默认将 转换为 UTC 时间。要解决此问题,您可以使用DateTime.ToLocalTime获取正确的本地时间。

以下是代码:

if (situation.DateTime.Kind == DateTimeKind.Utc)
{
     situation.DateTime = situation.DateTime.ToLocalTime();
}
于 2016-07-18T10:50:40.257 回答