2016-07-16 26 views
2

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に設定することを考えていますが、これは明らかに理想的ではありません。

ご協力いただければ幸いです。 :)

+0

あなたのテーブルのカラムのデータ型は何ですか? –

+0

DateTimeOffsetを使ってみましたか?あなたの場合の問題は、DateTimeにタイムゾーン情報が格納されていないということです。 –

+1

タイムゾーンの問題のようです。日付を保存/読み込むときに、UTCの日付を使用してタイムゾーンの問題を取り除いてみてください。 – redent84

答えて

1

私はデモを行い、ティックを使ってDateTimeを保存しました。同じ問題が発生します。私は受信SituationオブジェクトのDateTimeのプロパティをデバッグしました。 DateTime.KindUtcです。したがって、タイムゾーンの問題であるため、SQLiteはDateTimeをデフォルトでUTC時間に変換します。 この問題を解決するには、DateTime.ToLocalTimeを使用して正しいローカル時刻を取得します。

ここでコードは次のとおりです。

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

ブリリアント!ありがとう! :)私は私のケースで実際の時間を気にしないので、redent84が言ったように、すべてのDateTimesにUTCのDateTimeKindがあるようにすることもできると思いますか?私が気にするのは、年、月、日です。その日は時には1日前にプッシュされたので、問題は単なる問題でした。 – AndrewPno

+0

私はそれを得ません。現地時間の日、月、年を気にする場合は、UTC日時は現地時間に変換する必要があります。特定のシナリオでは、1ヶ月または1年がUTCによって正しく表示されません。例えば2016年1月1日午前6時(中国国内)は、2015年12月31日午後11時(UTC)です。 –