2016-07-16 4 views
2

UWP 응용 프로그램의 Extension과 함께 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; } 
} 

에 녹화 클래스처럼 보이는 상황 개체를 포함하는 기록이라는 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를 얻을 수

이 AsyncConnection은 DateTimes를 틱으로 저장합니다. 문제의 원인 일 수 있습니다.

날짜 시간 = {} 2016년 7월 1일 오후 12시 59분 59초 : 레코드 개체 Repository.InsertOrUpdateAsync을 사용하기 전에 저장 한 경우

는 즉시 Situation.DateTime는 다음 값을 갖는다 다음

틱 = 그러나 636,029747990010000

는 Repository.GetByIdAsync를 사용하여 기록을 당기는 시간 값은 다음

,536,913 63,210

날짜 시간 = {2016년 7월 1일 오후 4시 59분 59초}

진드기는 = 636029891990010000

당신이 볼 수 있듯이, 뭔가 방법 SQLite는이 날짜 시간을 저장하고 함께입니다. 틱 필드가 변경되어 새로운 날짜가되었습니다. 나는 이것이 왜 있는지 100 % 확신하지 못합니다. 나는 DateTime이 정확성에 문제가있을 수 있다는 것을 알고 있지만 DateTimes가 Ticks로 저장되어 있다면 Ticks 필드가 일치하지 않아야합니까? 왜 그들은 바뀌 었습니까?

DateTimes를 틱으로 저장해야한다고 가정 할 때이 문제를 어떻게 해결할 수 있습니까? DateTime 시간을 12로 설정하면 하루를 변경하지 않고도 몇 시간까지 늘리거나 줄일 수 있지만 이상적이지는 않습니다.

도움을 주시면 감사하겠습니다. :)

+0

테이블의 열 데이터 유형은 무엇입니까? –

+0

DateTimeOffset을 사용해 보셨습니까?귀하의 경우 문제는 DateTime이 표준 시간대 정보를 저장하지 않는다는 사실입니다. –

+1

시간대 문제와 완전히 같습니다. 날짜를 저장/읽을 때 UTC 날짜를 사용하여 시간대 문제를 제거하십시오. – redent84

답변

1

데모를 만들고 Ticks를 사용하여 DateTime을 저장했습니다. 같은 문제가 발생합니다. 나는 DateTime받은 Situation 개체의 속성을 디버깅했습니다. DateTime.KindUtc입니다. 따라서 시간대 문제이므로 SQLite는 기본적으로 DateTime을 UTC 시간으로 변환합니다. 이 문제를 해결하려면 DateTime.ToLocalTime을 사용하여 올바른 현지 시간을 가져올 수 있습니다.

여기 코드는 다음과 같습니다

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

Brilliant! 감사! :) 내 사건의 실제 시간은 신경 쓰지 않기 때문에 redent84가 말한 것처럼 모든 DateTimes가 UTC DateTimeKind를 갖도록 할 수 있다고 생각합니다. 맞습니까? 내가 신경 쓰는 건 해와 달과 날 뿐이다. 그 날은 가끔 하루 앞당겨 1을 밀어 붙이기 때문에 그저 시간 문제였습니다. – AndrewPno

+0

나는 그것을 얻지 못합니다. 현지 시간의 일, 월, 년을 신경 쓰는 경우 UTC 날짜/시간은 현지 시간으로 변환해야합니다. 특정 시나리오에서 UTC로 일 월 또는 연도가 올바르게 표시되지 않습니다. 예 : 2016 년 1 월 1 일 오전 6시 (중국 현지)는 2015 (UTC) 12 월 31 일 오후 11시입니다. –