UWPアプリケーションでSQLite.NETを使用して、DateTimeフィールドを含むオブジェクトを格納すると、私は奇妙な結果を得ています。日付は、何時になるべきかから数時間離れて保存されているようで、時にはDateTimeの日を翌日に押しているようです。SQLiteとDateTimeの精度の問題
は私が持っている(そうのようなリポジトリパターンを経由してのSQLiteを使用して保存されている状況を含む、この
public class Situation
{
[PrimaryKey, AutoIncrement]
public int SituationId { get; set; }
public DateTime DateTime { get; set; }
public string Description { get; set; }
}
Recordクラスのように見える状況オブジェクトを含むレコードと呼ばれるPOCOクラスを格納しています唯一の関連するメソッドを含む):
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をティックとして格納していますが、これは問題の原因と思われます。あるケースで
、RecordオブジェクトをRepository.InsertOrUpdateAsyncを使用して格納される直前に、Situation.DateTimeは次の値があります
のDateTime = {2016年7月1日12時59分59秒PMを}次のように
マダニ= 636029747990010000
しかしながら、Repository.GetByIdAsyncを使用してレコードを引っ張って、datetime値は、次のとおり
のDateTime = {2016年7月1日午前4時59分59秒PM}
ダニ= 636029891990010000
あなたが見ることができるように、何かがSQLiteのは、日時を記憶している方法でアップしています。 Ticksフィールドが変更され、新しい日付になりました。私はこれがなぜ100%確かではない。私はDateTimeの精度に問題があることは知っていますが、DateTimesがTicksとして保存されている場合、Ticksフィールドは一致しませんか?なぜ彼らは変わるのですか?
DateTimesをティックとして保存する必要があると仮定して、この問題を解決するにはどうすればよいですか?私はちょうど日を変更することなく数時間で増減することができるようにDateTime時間を12に設定することを考えていますが、これは明らかに理想的ではありません。
ご協力いただければ幸いです。 :)
あなたのテーブルのカラムのデータ型は何ですか? –
DateTimeOffsetを使ってみましたか?あなたの場合の問題は、DateTimeにタイムゾーン情報が格納されていないということです。 –
タイムゾーンの問題のようです。日付を保存/読み込むときに、UTCの日付を使用してタイムゾーンの問題を取り除いてみてください。 – redent84